![云原生Kubernetes全栈架构师实战](https://wfqqreader-1252317822.image.myqcloud.com/cover/167/47217167/b_47217167.jpg)
2.4.2 K8s组件证书
相较于Etcd的证书,Kubernetes的证书更为复杂,因为Kubernetes要求组件之间双向加密通信,所以生成Kubernetes的组件会涉及每个组件之间通信的证书,同时也会包含一些聚合证书。
首先在Master01节点生成Kubernetes的根证书,之后其他证书都是根据该证书来生成的:
# cd /root/k8s-ha-install/pki # cfssl gencert -initca ca-csr.json | cfssljson -bare /etc/kubernetes/pki/ca
接下来生成kube-apiserver的证书,需要注意更改如下配置:
· 192.168.0.是Kubernetes Service的网段,如果需要更改Kubernetes Service网段,那就需要把192.168.0.1更改为Service网段的第一个IP。
· 10.0.0.236为高可用集群的VIP地址,需要改成读者自己的VIP地址或者其他负载均衡的地址,如果是单Master的集群,直接改为Master节点IP即可。
· 10.0.0.201-203为Kubernetes Master节点的IP地址,需要更改为读者的节点IP。
![](https://epubservercos.yuewen.com/27A31B/26581513401334806/epubprivate/OEBPS/Images/Figure-P55_132835.jpg?sign=1738898901-2dUUvDyOkfcfINEdNepCKfw49w6Bjkal-0-fb8897fd7035010bb8cc733a252387cf)
生成聚合证书,用于扩展的CRD请求验证,比如metrics-server的metrics.k8s.io和apiserver进行通信时就会使用到该证书:
![](https://epubservercos.yuewen.com/27A31B/26581513401334806/epubprivate/OEBPS/Images/Figure-P55_132836.jpg?sign=1738898901-oPjhY98LMN2H4py033waEIdoIQSWEJhC-0-5a2ae64eeb59a8e364861df73c1a73d9)
同样的方式生成controller-manage的证书,使用的还是最初的CA文件:
![](https://epubservercos.yuewen.com/27A31B/26581513401334806/epubprivate/OEBPS/Images/Figure-P56_132838.jpg?sign=1738898901-PPtMdbSkHqzsUj9fsAiIYYFt7a4sUkt6-0-588864b02a793be496f80e4252b7f68e)
由于Controller Manager需要和APIServer进行通信,此时可以使用kubeconfig配置链接APIServer的信息,比如需要用到的证书、APIServer的地址等。
接下来使用Kubectl生成一个Controller Manager所用的kubeconfig。需要注意更改的位置如下:
· 如果不是高可用集群,把Master的地址改为10.0.0.236:16443,把APIServer的端口改为16443,默认是6443。
首先设置一个集群项,即配置一个集群到kubeconfig:
![](https://epubservercos.yuewen.com/27A31B/26581513401334806/epubprivate/OEBPS/Images/Figure-P56_132839.jpg?sign=1738898901-KmgB7HRqLZYBwygbDNnelOROEYfQU2S9-0-9fd5ba7c7d46f36610a90878d01de99e)
· set-cluster:配置集群的名称,当前为kubernetes。
· certificate-authority:配置链接APIServer所用的证书路径。
· embed-certs:是否将证书嵌入kubeconfig中。
· server:APIServer地址,按需修改。
· kubeconfig:生成的kubeconfig的位置。
为该kubeconfig文件设置一个上下文环境:
![](https://epubservercos.yuewen.com/27A31B/26581513401334806/epubprivate/OEBPS/Images/Figure-P56_132840.jpg?sign=1738898901-CTWPtiWPxs63NtMZiJypiKuIVQh6mRlR-0-d92b2dae835c298f886c4ba6a5b21ef3)
· set-context:配置一个上下文,名称为system:kube-controller-manager@kubernetes。
· cluster:该上下文配置到哪个集群。
· user:该上下文的用户名。
为该kubeconfig设置一个用户项:
![](https://epubservercos.yuewen.com/27A31B/26581513401334806/epubprivate/OEBPS/Images/Figure-P56_132841.jpg?sign=1738898901-vCJULZw7zwXb8oYpmMpNohlGL0wCC5i0-0-393f83b0ff2e33181f74135c0909998b)
· set-credentials:配置哪个用户,为上下文指定的用户名。
· client-certificate:该用户的客户端证书。
· client-key:该用户的客户端密钥。
使用system:kube-controller-manager@kubernetes环境作为默认环境:
![](https://epubservercos.yuewen.com/27A31B/26581513401334806/epubprivate/OEBPS/Images/Figure-P57_132842.jpg?sign=1738898901-Lp0xqjoqvZkI3yzVQPOWemyqsmxFNUEM-0-10a40dde0c8ac76aa4f863684d6c5d86)
同样的逻辑生成scheduler的证书,参数不再解释:
![](https://epubservercos.yuewen.com/27A31B/26581513401334806/epubprivate/OEBPS/Images/Figure-P57_132843.jpg?sign=1738898901-M0oYQ8UKpdw52LBr2VqTVai7PW2trtD3-0-97417d9d7954aae789b3a76263ec6331)
同样的方式生成scheduler的kubeconfig文件。注意,如果不是高可用集群,把master的地址改为10.0.0.236:16443,把apiserver的端口改为16443,默认是6443。
![](https://epubservercos.yuewen.com/27A31B/26581513401334806/epubprivate/OEBPS/Images/Figure-P57_132844.jpg?sign=1738898901-KRQbfBa0Ufra5VChATfEkxaJVROZ6HwU-0-97ac25ccd99e2e990b9442559174d1ba)
至此,Kubernetes Master节点的组件证书已经配置完成。接下来需要生成一个Kubectl连接API Server的kubeconfig。
使用Kubeadm安装的Kubernetes集群,Kubectl连接API Server用到的kubeconfig文件为/etc/kubernetes/admin.conf,由Kubeadm自动生成。使用二进制安装方式需要手动生成,生成步骤与上述方式类似。
首先生成管理员用户的证书文件:
![](https://epubservercos.yuewen.com/27A31B/26581513401334806/epubprivate/OEBPS/Images/Figure-P58_132846.jpg?sign=1738898901-74NC5vdlgb2YUHPAXIvD51ugCBzuMDYr-0-b78f7ded69aa770a02975eec81f8e03e)
接下来生成kubeconfig文件。注意,如果不是高可用集群,把Master的地址改为10.0.0.236:16443,把API Server的端口改为16443,默认是6443:
![](https://epubservercos.yuewen.com/27A31B/26581513401334806/epubprivate/OEBPS/Images/Figure-P58_132847.jpg?sign=1738898901-xaUHj4I9nFTCEFisCbUKb5tvhHkXyptc-0-8c1d8f76d9d43225e7bef2f35939178e)
生成用于创建ServiceAccount Secret Token和验证Token的密钥对:
# openssl genrsa -out /etc/kubernetes/pki/sa.key 2048 # openssl rsa -in /etc/kubernetes/pki/sa.key -pubout -out /etc/kubernetes/pki/sa.pub
所有的证书签发完成后,需要将证书发送至其他节点:
# for NODE in k8s-master02 k8s-master03; do for FILE in $(ls /etc/kubernetes/pki | grep -v etcd); do scp /etc/kubernetes/pki/${FILE} $NODE:/etc/kubernetes/pki/${FILE}; done; for FILE in admin.kubeconfig controller-manager.kubeconfig scheduler.kubeconfig; do scp /etc/kubernetes/${FILE} $NODE:/etc/kubernetes/${FILE}; done; done