1.引导前检查(pre-flight checks)
kubeadm init执行之后,首先会进行pre-flight checks检查,确保master节点可以满足master组件可以安装的所有条件

error级别的检查:
- kubeadm版本要与kubernetes版本的对比检查,kubeadm版本不小于kubernetes版本
- kubernetes安装的系统需求检查,内核版本需大于3.10以上,4.x以上,是否设置了cgroups子系统,后端服务是否正常工作
- 其他检查:用户、主机、端口、swap、工具等
2.生成私钥和数字证书
kubeadm会为整个集群生成多组私钥和数字证书,如果不指定外部的证书授权机构,kubeadm init会自建证书授权机构,并生成ca的私钥(ca.key)、自签署的公钥数字证书(ca.crt),用于签发后续kubernetes需要的其他公钥证书

kubeadm init生成的证书都在/etc/kubernetes/pki目录下

自建CA
如果不指定外部的证书授权机构,kubeadm init会自建证书授权机构,并生成ca的私钥(ca.key)、自签署的公钥数字证书(ca.crt),用于签发后续kubernetes需要的其他公钥证书
查看ca.crt证书内容
[root@k8s-master pki]# openssl x509 -in ca.crt -noout -text Certificate: Data: Version: 3 (0x2) Serial Number: 0 (0x0) Signature Algorithm: sha256WithRSAEncryption Issuer: CN=kubernetes Validity Not Before: Jan 14 02:37:42 2021 GMT Not After : Jan 12 02:37:42 2031 GMT Subject: CN=kubernetes Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (2048 bit) Modulus: 00:e1:9d:a8:43:d5:8f:74:99:40:21:df:88:a9:7b: cf:37:24:00:fc:87:73:3d:29:0c:5c:f1:53:46:40: 56:16:97:fb:a4:c8:fb:2e:23:74:bc:18:e0:c6:c8: 7e:d5:35:49:c6:23:5b:1a:82:80:ed:90:be:c2:2b: 0f:94:fc:27:d3:7f:f7:3f:80:be:f9:e4:6e:64:d4: dc:1a:49:d0:f2:64:4b:45:6f:a3:9e:e3:c1:c9:a5: a0:20:51:65:b2:78:85:09:00:49:f6:ae:07:3a:e0: e1:c4:b5:10:fd:7b:fc:e3:c5:83:86:77:22:f8:34: 26:df:c6:8d:7e:51:b4:cf:24:3e:08:9f:1e:6d:dd: 85:99:16:6f:3f:f0:ea:78:6c:4f:15:e7:4a:40:03: 0b:ab:a0:6f:c5:e1:b9:3b:43:69:94:44:09:88:fe: 7d:48:6e:6c:ec:8e:7b:31:4a:e3:dd:c0:1d:48:33: 05:93:5b:ec:9b:18:e9:a0:d1:bd:31:7b:60:0b:4e: 6f:74:d6:5d:5c:7b:70:ce:43:ba:cd:7c:4c:93:32: db:e4:58:3d:73:11:bc:66:53:6c:a7:57:17:66:95: 6e:12:90:5e:5f:5b:f6:a6:9e:9c:bc:45:40:e6:50: 5c:b4:56:6b:a1:e8:55:e7:2f:29:20:fe:37:74:d0: fa:b7 Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Key Usage: critical Digital Signature, Key Encipherment, Certificate Sign X509v3 Basic Constraints: critical CA:TRUE Signature Algorithm: sha256WithRSAEncryption 88:d5:b9:ed:94:25:bd:57:a8:f0:da:eb:ec:98:6b:c0:f0:ee: 0b:27:a9:bd:52:3a:2e:35:78:ee:35:a1:a0:a3:a7:52:8a:f6: 52:bd:a2:b4:f7:bc:2b:39:2c:a3:a8:9d:be:02:3a:fd:79:cc: 32:aa:a4:44:fc:85:91:d2:89:88:20:fd:8f:e0:de:19:23:78: cd:f5:7c:ae:fd:41:c6:bd:e3:e1:27:43:b5:74:00:f7:ae:c6: a5:25:7d:f9:d6:e4:4e:c6:7c:94:9b:f0:38:f3:53:be:8b:35: 68:20:7e:0e:b7:ad:96:47:3b:6b:e3:4b:10:47:df:b3:c3:44: 4e:58:91:82:e0:4d:b3:b2:6d:49:44:d0:cc:2d:8b:66:63:dc: 37:67:44:0c:ca:51:ea:ca:ac:bf:8b:60:dc:b3:d8:fd:7b:4f: 8a:c9:9f:4b:32:37:bb:83:5c:af:8b:59:f5:32:35:b0:3d:82: c3:50:af:5f:6c:9b:79:98:7c:1d:07:21:57:dc:fb:92:6a:54: 47:24:e6:2c:24:c4:80:17:21:a5:ac:90:e3:f4:54:ea:d0:2f: 6c:44:84:9e:51:62:66:76:e9:91:32:c4:a8:cc:12:ff:43:43: 4e:16:71:22:d6:c2:5d:7d:bb:f1:ff:3c:a7:ce:cc:38:29:ca: fb:ca:44:98
|
apiserver私钥和公钥证书
kubeadm会生成apiserver的私钥文件(apiserver.key),用ca来签发apiserver的公钥数字证书(apiserver.crt)
查看apiserver.crt证书内容
[root@k8s-master pki]# openssl x509 -in apiserver.crt -noout -text Certificate: Data: Version: 3 (0x2) Serial Number: 6548373687643854637 (0x5ae07f2c9486d72d) Signature Algorithm: sha256WithRSAEncryption Issuer: CN=kubernetes Validity Not Before: Jan 14 02:37:42 2021 GMT Not After : Jan 14 02:37:43 2022 GMT Subject: CN=kube-apiserver Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (2048 bit) Modulus: 00:cd:8c:87:bf:18:0a:61:b4:51:d3:22:20:e3:72: 42:4e:ac:32:cc:d2:0a:41:3c:f0:70:eb:34:3c:09: 0a:68:a4:f5:6d:c6:0a:8d:5f:93:dc:dd:9c:9f:68: 21:97:f9:3d:95:da:4a:2f:69:82:ae:35:f1:e2:c4: cd:78:3a:98:55:9a:0f:24:d5:ae:19:92:c6:d7:8b: ff:5f:81:99:a6:52:0c:c3:9c:eb:d3:e9:91:47:f9: cf:51:1e:6b:a5:83:0d:c0:37:e0:61:3d:b7:ee:09: 02:e9:25:b4:ef:2d:58:9b:e7:2a:b5:74:bf:e8:a1: 62:f4:8c:ae:58:25:b3:bc:a8:c3:af:58:db:25:e6: 85:14:2e:39:70:86:1f:c4:27:70:50:6c:05:85:aa: e5:8e:9b:1c:55:b0:95:96:25:e7:df:f2:f6:42:be: 6e:ed:85:46:72:c7:db:64:e2:23:d7:ca:38:e9:9a: 24:7b:de:1b:ca:e3:b4:ac:c2:41:fa:bc:af:88:7e: 0c:15:72:f7:f7:2b:3a:a9:fd:7a:57:1d:95:2c:c9: 61:c6:48:ac:cf:2d:db:62:4d:41:be:e6:69:01:a0: 97:5f:0f:66:b7:c3:3d:2f:12:84:3f:78:fc:87:40: 8c:74:7e:23:4c:c0:f0:c8:f0:9e:1a:4f:1b:7e:a5: db:3f Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Key Usage: critical Digital Signature, Key Encipherment X509v3 Extended Key Usage: TLS Web Server Authentication X509v3 Subject Alternative Name: DNS:k8s-master, DNS:kubernetes, DNS:kubernetes.default, DNS:kubernetes.default.svc, DNS:kubernetes.default.svc.cluster.local, IP Address:10.1.0.1, IP Address:192.168.83.128 Signature Algorithm: sha256WithRSAEncryption 41:04:f1:f1:ec:03:61:30:1e:57:4e:bf:d5:f1:29:0e:ab:99: 68:3d:51:0e:d4:e4:98:d3:87:4f:9d:4c:d5:3a:50:73:0a:87: 49:a6:fe:a6:99:34:4f:24:40:ca:ee:a8:37:bf:09:3c:c3:d8: 36:f4:f6:9f:29:ad:e8:71:90:aa:1d:cf:fc:db:4a:50:9b:3d: c4:3f:e5:f8:07:4f:d3:9a:c4:7f:50:ca:2f:92:65:42:e5:b4: 27:7e:41:bb:87:17:5a:1c:01:e0:f7:70:38:59:a6:f3:e5:03: 07:a6:c7:de:03:b9:32:e7:f7:79:8d:ed:d6:3d:0f:6e:e2:79: a4:22:a7:50:95:d4:83:8e:42:fa:59:10:02:cd:82:80:27:16: 80:e0:45:99:b0:85:60:76:d7:e9:07:ed:cc:68:c5:80:b0:82: 6a:b9:24:b9:3c:b9:4d:5e:88:a6:54:7a:45:79:35:46:5e:68: 7b:77:f2:78:5c:3c:60:79:63:de:96:79:c3:c6:85:3b:ef:d2: 3f:02:de:70:d7:f6:5c:4d:64:fb:ad:f9:31:62:ae:1b:ae:8c: b6:b6:cf:9e:cc:ac:a9:3a:b5:f4:63:6d:80:95:c8:79:e8:d9: 8f:88:1d:80:15:97:58:c6:65:ce:98:4b:b1:6c:1b:29:ec:60: 8c:39:65:b5
|
apiserver访问kubelet使用的客户端私钥与证书
apiserver需要向各个node的kubelet主动发起连接,kubelet会通过client端的ssl证书,校验apiserver建立的连接
apiserver-kubelet-client.crt和apiserver-kubelet-client.key用来校验apiserver身份的数字证书
serviceaccount私钥和公钥
sa.key和sa.pub是一对数字证书
Etcd相关私钥和数字证书
首先etcd是整个k8s集群的数据中心,只有apiserver才可以访问,所有组件都是通过apiserver存储数据的,为了建立apiserver和etcd的安全通信,kubeadm init会生成apiserver访问etcd的安全证书,即apiserver-etcd-client.crt和apiserver-etcd-client.key,其中apiserver-etcd-client.crt并不是由ca.crt签发的,而是有pki/etcd/ca.crt签发
# 并不是由/etc/kubernetes/pki/ca.crt签发 [root@k8s-master pki]# openssl verify -CAfile ca.crt apiserver-etcd-client.crt apiserver-etcd-client.crt: O = system:masters, CN = kube-apiserver-etcd-client error 20 at 0 depth lookup:unable to get local issuer certificate # 是由/etc/kubernetes/pki/etcd/ca.crt签发 [root@k8s-master pki]# openssl verify -CAfile etcd/ca.crt apiserver-etcd-client.crt apiserver-etcd-client.crt: OK
|
3.生成控制平面组件kubeconfig文件,这些配置用于组件间的通信鉴权

这些文件生成在/etc/kubernetes目录下
- kubelet.conf:被kubelet组件使用,用于访问apiserver
- scheduler.conf:被scheduler组件使用,用于访问apiserver
- controller-manager.conf:被controller-manager组件使用,用于访问apiserver
- admin.conf:包含整个集群的最高权限配置数据
admin.conf中包含cluster、user和context信息
[root@k8s-master kubernetes]# cat admin.conf apiVersion: v1 clusters: - cluster: certificate-authority-data: server: https://192.168.83.128:6443 name: kubernetes contexts: - context: cluster: kubernetes user: kubernetes-admin name: kubernetes-admin@kubernetes current-context: kubernetes-admin@kubernetes kind: Config preferences: {} users: - name: kubernetes-admin user: client-certificate-data: client-key-data:
|
一旦配置 $KUBECONFIG 变量,指向/etc/kubernetes/admin.conf,则kubectl就会使用KUBECONFIG变量所配置的信息。contexts用来将users和clusters绑定,从而通过切换context来变换不通身份管理不同集群
4.生成控制平面组件manifest文件
这些文件会被master节点的kubelet读取,并且启动控制平面组件,并维护控制平面组件状态

这些文件存在/etc/kubernetes/manifests目录下

5.下载镜像,等待控制平面组件启动
kubeadm会依赖kubelet下载镜像并且启动static pod,kubelet会一直探测 localhost:6443/healthz(apiserver存活性探针)

查看 kube-apiserver.yaml
... livenessProbe: failureThreshold: 8 httpGet: host: 192.168.83.128 path: /healthz port: 6443 scheme: HTTPS initialDelaySeconds: 15 timeoutSeconds: 15 ...
|
6.用kubeadm-config保存Configuration
kubeadm-config是ConfigMap

7.设定Master标志
将当前节点设置为master,即打上相关的labels和taints

8.生成bootstrap token
node节点可以使用这个token加入kubernetes集群,在生成token之后,kubeadm会将ca.crt等master重要信息通过configmap保存在etcd,这个configmap名字是cluster-info

9.安装DNS和kube-proxy组件
