二进制部署k8s集群(三):部署kube-apiserver,签发kube-apiserver证书|kuelete证书|kube-proxy证书

下载 kubernetes 1.18.3 二进制安装包:https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.18.md#v1183 

注意:打开链接有很多下载包,包含kubernetes-client 、kubernetes-server 、kubernetes-node,下载第一个64位的tar.gz文件。

下载 kubernetes-client:https://dl.k8s.io/v1.18.3/kubernetes-client-darwin-amd64.tar.gz

下载  kubernetes-server:https://dl.k8s.io/v1.18.3/kubernetes-server-linux-amd64.tar.gz

下载 kubernetes-node:https://dl.k8s.io/v1.18.3/kubernetes-node-linux-amd64.tar.gz

将k8s安装在四个节点上,四个点信息为: 

节点名称IP地址Hostname安装内容
harbor私有仓库 192.168.0.101 yyee-centos-1
harbor
k8s管理节点1 192.168.0.102 yyee-centos-2
etcd,kube-apiserver,kube-controller-manager,
kube-scheduler,CNI 
k8s管理节点2 192.168.0.103 yyee-centos-3
etcd,kube-apiserver,kube-controller-manager,
kube-scheduler, CNI 
k8s工作节点1 192.168.0.104 yyee-centos-4

etcd ,kubelet,docker,kube_proxy,caliop, CNI 
k8s工作节点2 192.168.0.105 yyee-centos-5

kubelet,docker,kube_proxy,caliop, CNI 

k8s工作节点3 192.168.0.106 yyee-centos-5

kubelet,docker,kube_proxy,caliop, CNI 

   

下载kubernetes-server安装包

分别在 192.168.0.102 与192.168.0.103两个节点上安装 kube-apiserver 。

首先下载kubernetes-server 1.183二进制安装包。

下载完安装包之后,解压到 /opt/kubernetes  目录。

tar xfv kubernetes-v1.18.3-server-linux-amd64.tar.gz  -C /opt
cd /opt/
#将kubernetes重命名为kubernetes-1.18.3
mv /opt/kubernetes  /opt/kubernetes-1.18.3
#创建一个软链接,方便升级
ln -s /opt/kubernetes-1.18.3/ /opt/kubernetes

  /opt/kubernetes 目录里面有个源码包  kubernetes-src.tar.gz ,对部署没用,把它删掉。

    /opt/kubernetes/server/bin 目录下有很多 .tar和_tag 结尾的docker镜像文件,把它删掉。

  

cd /opt/kubernetes/server/bin
rm -f *.tar rm -f *_tag
签发 kube-apiserver证书|client证书|kutelet证书

《 二进制部署k8s集群(二): 签发etcd证书,安装etcd集群 这一篇中写了如何签发ca根证书以及etcd证书,本篇签发 kube-apiserver 证书需要用到上一篇签发好的私钥证书以及ca根证书配置文件(ca.pem, ca-csr.json, ca-config.json) 。

上一篇已经签发的证书有:

(1) 创建证书请求文件:apiserver、client、kubelet、kube-proxy

【创建apiserver证书请求文件】

编写证书请求文件.

vi  /opt/certs/apiserver-csr.json

{
  "CN": "k8s-apiserver",
  "hosts": [
    "127.0.0.1",
    "192.168.0.1",
    "192.168.0.51",
    "kubernetes", 
    "kubernetes.default", 
    "kubernetes.default.svc", 
    "kubernetes.default.svc.cluster", 
    "kubernetes.default.svc.cluster.local",
    "192.168.0.101",
    "192.168.0.102",
    "192.168.0.103",
    "192.168.0.104",
    "192.168.0.105",
    "192.168.0.106",
    "192.168.0.161"
  ],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "Beijing",
      "L": "Beijing",
      "O": "k8s",
      "OU": "system"
    }
  ]
}

 注意hosts节点,所有需要访问k8s的有关ip都要写进来,包括本机ip,缩主机ip,宿主机默认网关ip。

  

【创建client证书请求文件】

编写客户端证书请求文件,为了少签发一些证书,将 kube-proxy,kube-admin等证书合成一个客户端证书。

vi  /opt/certs/client-csr.json

{
  "CN": "k8s-node",
  "hosts": [

  ],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "Beijing",
      "L": "Beijing",
      "O": "k8s",
      "OU": "system"
    }
  ]
}

【创建 kubelete 证书请求文件】

vi /opt/certs/kubelet-csr.json

{
  "CN": "k8s-kubelet",
  "hosts": [
    "127.0.0.1",
    "192.168.0.51",
    "192.168.0.101",
    "192.168.0.102",
    "192.168.0.103",
    "192.168.0.104",
    "192.168.0.105",
    "192.168.0.106"
  ],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "Beijing",
      "L": "Beijing",
      "O": "k8s",
      "OU": "system"
    }
  ]
}

 hosts要把所有可能用到kebelet上的ip全都写上, 包括windows宿主机ip,宿主机默认网关ip,vmware网关ip 。

【创建kube-proxy证书请求文件】

vi /opt/certs/kubelet-csr.json

{
  "CN": "system:kube-proxy",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "Beijing",
      "L": "Beijing",
      "O": "k8s",
      "OU": "system"
    }
  ]
}

指定该证书的 User 为 system:kube-proxy 。

注意:kube-proxy证书请求文件的CN等于system:kube-proxy,不要改,多个空格都不行。

(2) 创建kube-apiserver证书、client证书、kubelet证书、kube-proxy证书

 这些证书:apiserver证书,client证书,kubelet证书,kube-proxy-client证书,包括etcd证书,都是基于同一个ca证书ca.pem、同一个ca私钥ca-key.pem、以及同一个证书根配置文件ca-config.json创建。

#kube-apiserver证书
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=k8s-server-client apiserver-csr.json | cfssljson -bare apiserver

#client证书
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=k8s-server-client client-csr.json | cfssljson -bare client

#kubelet证书
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=k8s-server-client  kubelet-csr.json | cfssljson -bare kubelet

#kube-proxy证书
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=k8s-server-client  kube-proxy-csr.json | cfssljson -bare kube-proxy-client

注意:

创建kube-apiserver证书的 -profile参数值可以配置成k8s-server ,只用于服务端通讯。

创建client证书的 -profile参数值可以配置成k8s-client ,只用于客户端通讯。

创建kubelet证书的 -profile参数值可以配置成k8s-server ,只用于服务端通讯。

创建kube-proxy证书的 -profile参数值可以配置成k8s-client ,只用于客户端通讯。

查看创建好的证书:

ll  /opt/certs/

 

       

将apiserver-key.pem , apiserver.pem, ca-key.pem,  ca.pem, client-key.pem, client.pem, kubelet-key.pem, kubelet.pem, kube-proxy-client-key.pem,  kube-proxy-client.pem 十个文件拷贝到【管理节点1】与【管理节点2】的  /opt/kubernetes/server/bin/certs/  目录下。

mkdir /opt/kubernetes/server/bin/cert
cd /opt/certs
scp apiserver-key.pem  apiserver.pem  ca-key.pem  ca.pem  client-key.pem  client.pem  kubelet-key.pem  kubelet.pem  kube-proxy-client-key.pem  kube-proxy-client.pem  192.168.0.102:/opt/kubernetes/server/bin/certs/
scp apiserver-key.pem  apiserver.pem  ca-key.pem  ca.pem  client-key.pem  client.pem  kubelet-key.pem  kubelet.pem  kube-proxy-client-key.pem  kube-proxy-client.pem  192.168.0.103:/opt/kubernetes/server/bin/certs/

进入k8s服务器的安装目录查看,里面有十个证书文件。

ll /opt/kubernetes/server/bin/certs

部署kube-apiserver

(1) 创建apiserver启动文件

【管理节点1】的apiserver启动文件

切换到192.168.0.102

vi  /opt/kubernetes/server/bin/kube-apiserver.sh

#!/bin/bash
 ./kube-apiserver 
  --apiserver-count 2 
  --audit-log-path /data/logs/kubernetes/kube-apiserver/audit-log 
  --authorization-mode RBAC 
  --client-ca-file ./certs/ca.pem 
  --requestheader-client-ca-file ./certs/ca.pem 
  --enable-admission-plugins NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota 
  --insecure-bind-address=0.0.0.0 
  --etcd-cafile ./certs/ca.pem 
  --etcd-certfile ./certs/client.pem 
  --etcd-keyfile ./certs/client-key.pem 
  --etcd-servers http://192.168.0.102:2379,http://192.168.0.103:2379,http://192.168.0.104:2379 
  --service-account-key-file ./certs/ca-key.pem 
  --service-cluster-ip-range 10.67.0.0/16 
  --service-node-port-range 20000-60000 
  --target-ram-mb=1024 
  --kubelet-client-certificate ./certs/client.pem 
  --kubelet-client-key ./certs/client-key.pem 
  --log-dir /data/logs/kubernetes/kube-apiserver 
  --tls-cert-file ./certs/apiserver.pem 
  --tls-private-key-file ./certs/apiserver-key.pem 
  --v 2

--apiserver-count 2 表示有两个apiserver节点

--etcd-servers参数配置etcd集群地址。

--service-cluster-ip-range 10.67.0.0/16   集群内部的service虚拟ip 

【管理节点1】的apiserver启动文件

切换到192.168.0.102

vi  /opt/kubernetes/server/bin/kube-apiserver.sh

#!/bin/bash
 ./kube-apiserver 
  --apiserver-count 2 
  --audit-log-path /data/logs/kubernetes/kube-apiserver/audit-log 
  --authorization-mode RBAC 
  --client-ca-file ./certs/ca.pem 
  --requestheader-client-ca-file ./certs/ca.pem 
  --enable-admission-plugins NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota 
  --insecure-bind-address=0.0.0.0 
  --etcd-cafile ./certs/ca.pem 
  --etcd-certfile ./certs/client.pem 
  --etcd-keyfile ./certs/client-key.pem 
  --etcd-servers http://192.168.0.102:2379,http://192.168.0.103:2379,http://192.168.0.104:2379 
  --service-account-key-file ./certs/ca-key.pem 
  --service-cluster-ip-range 10.67.0.0/16 
  --service-node-port-range 20000-60000 
  --target-ram-mb=1024 
  --kubelet-client-certificate ./certs/client.pem 
  --kubelet-client-key ./certs/client-key.pem 
  --log-dir /data/logs/kubernetes/kube-apiserver 
  --tls-cert-file ./certs/apiserver.pem 
  --tls-private-key-file ./certs/apiserver-key.pem 
  --v 2

--apiserver-count 2 表示有两个apiserver节点

--etcd-servers参数配置etcd集群地址。

--service-cluster-ip-range 10.67.0.0/16   集群内部的service虚拟ip 

(2) 验证apiserver是否可以启动

创建工作目录与数据目录

mkdir -p /data/logs/kubernetes/kube-apiserver/audit-log
mkdir -p /data/logs/kubernetes/kube-apiserver

启动kube-apiserver

chmod +x /opt/kubernetes/server/bin/kube-apiserver.sh
./kube-apiserver.sh

查看启动状态

netstat -luntp | grep kube-apiserv

用同样的方式在 【k8s管理节点2】192.168.0.103主机上安装kube-apiserver 。 

按ctrl+c键退出 kube-apiserver,用其它方式开机自动启动,我们这里用supervisor来启动。

用supervisor启动kube-apiserver

supervisor是个python写的进程管理软件,它用子线程的方式启动一个应用程序,当应用程序crash的时候它会重新拉起被管理的程序。

【安装supervisor】

yum install supervisor
systemctl enable supervisord
systemctl start supervisord

【编辑kube-apiserver启动配置文件】

将配置文件放到 /etc/supervisord 目录下,以.ini作为扩展名,文件名可以任意,可以放置多个不同的启动配置文件,每个配置文件以不同的服务启动。

在【管理节点1】上编辑kube-apiserver启动文件。

vi  /etc/supervisord.d/kube-apiserver.ini

[program:kube-apiserver-01]
command=/opt/kubernetes/server/bin/kube-apiserver.sh
numprocs=1
directory=/opt/kubernetes/server/bin
autostart=true
autorestart=true
startsecs=30
startretries=3
exitcodes=0,2
stopsignal=QUIT
stopwaitsecs=10
user=root
redirect_stderr=true
stdout_logfile=/data/logs/kubernetes/kube-apiserver/apiserver.stdout.log
stdout_logfile_maxbytes=64MB
stdout_logfile_backups=4
stdout_capture_maxbytes=1MB
stdout_events_enabled=false

在【管理节点2】上编辑kube-apiserver启动文件。

vi  /etc/supervisord.d/kube-apiserver.ini

[program:kube-apiserver-02]
command=/opt/kubernetes/server/bin/kube-apiserver.sh
numprocs=1
directory=/opt/kubernetes/server/bin
autostart=true
autorestart=true
startsecs=30
startretries=3
exitcodes=0,2
stopsignal=QUIT
stopwaitsecs=10
user=root
redirect_stderr=true
stdout_logfile=/data/logs/kubernetes/kube-apiserver/apiserver.stdout.log
stdout_logfile_maxbytes=64MB
stdout_logfile_backups=4
stdout_capture_maxbytes=1MB
stdout_events_enabled=false

【启动两个管理节点上的kube-apiserver服务】

#启动新加入到supervisor中的服务
supervisorctl update
#查看状态
supervisorctl status

  

查看kube-apiserver运行状态

netstat -luntp | grep kube-apiserv

查看kube-apiserver启动日志

tail -fn 200 /data/logs/kubernetes/kube-apiserver/apiserver.stdout.log 

【supervisor命令说明】

supervisorctl status                   #查看所有进程的状态
supervisorctl stop 服务名          #停止服务
supervisorctl start 服务名          #启动服务
supervisorctl restart 服务名      #重启服务
supervisorctl update                 #配置文件修改后使用该命令加载新的配置
supervisorctl reload                  #重新启动配置中的所有程序

用nginx将两个节点的kube-apiserver反向代理出来

在【管理节点1】与【管理节点2】上安装nginx

yum install -y nginx

编辑nginx.conf配置文件,在http节点的后面添加反向代理,注意是在http节点的后面添加,跟http是平级节点。

vi  /etc/nginx/nginx.conf

stream {
    upstream kube-apiserver {
        server 192.168.0.102:6443    max_fails=3 fail_timeout=30s;
        server 192.168.0.103:6443    max_fails=3 fail_timeout=30s;
    }
    server {
        listen 7443;
        proxy_connect_timeout 2s;
        proxy_timeout 900s;
        proxy_pass kube-apiserver;
    }
}

反向代理到本机的7443端口。

   注意,是添加到http节点的后面

 检查nginx配置语言件语法:

nginx -t

启动nginx

systemctl start nginx
systemctl enable nginx

这样,通过192,168.0.102:7443或者192.168.0.103:7443其中一台节点就可以访问kube-apiserver了。

如果要对nginx做可高用,当其中一个节点上的nginx挂了之后,需要立马把nginx拉起来,这时候用keepalived可以做到,那么就要在两个点节上配置keepalived 。

原文地址:https://www.cnblogs.com/yyee/p/13215572.html