二进制部署k8s集群(3):部署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 。