🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] ### **Certificate-Key的作用** 在《安装高可用集群 - 自动上传证书》一节中,我们讲到在添加其他master节点时的命令是: ``` kubeadm join x.x.x.x:6443 \ --token 61eu2f.f4dd6lucgaf13w9i \ --discovery-token-ca-cert-hash sha256:e117e39b455a8dbab863d76f2b3b4a74051901a989721cf86f1cf96b12fe6b44 \ --control-plane \ --certificate-key a301c9c55596c54c5d4c7173aa1e3b6fd304130b0c703bb23149c0c69f94b8e0 ``` 其中有一个`--certificate-key`参数。接下来,我们讲讲这个参数的作用。 在《安装高可用集群 - 手动分发证书》一节中,我们讲到,`kubeadm init`命令会生成四组 CA-Key与CA-Cert。如果是自动上传证书,即初始化命令为 `kubeadm init ... --upload-certs`时,kubeadm会把这四组证书保存在`kube-system`命名空间下一个名为`kubeadm-certs`的secret中。我们可以执行以下的命令查看: ``` $ kubectl get secret -n kube-system NAME TYPE DATA AGE kubeadm-certs Opaque 8 44m ... $ kubectl get secret -n kube-system kubeadm-certs -o yaml apiVersion: v1 kind: Secret metadata: name: kubeadm-certs namespace: kube-system data: ca.key: xxxxxx ca.crt: xxxxx etcd-ca.key: xxxx etcd-ca.crt: xxx ... ``` 上面的secret的data的值,是通过`certificate-key`加密的。也就是说,当执行`kubeadm init ... --upload-certs`命令时,kubeadm会随机生成一个`certificate-key`,然后通过这个key对八个文件的内容进行加密,然后保存到这个secret中。所以,其它master节点执行`kubeadm join --control-plane ... --certificate-key`要加入到集群中时,需要指定`--certificate-key`参数,否则无法下载与解密这八个文件。 ### **Certificate-key的过期时间** 每个certificate-key对应着一个token(下面的第一个token),如下: ``` $ kubeadm token list TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS lliq2x.sozstjyugl15h4vs 1h 2020-12-02T22:39:43+08:00 <none> Proxy for managing TTL for the kubeadm-certs secret <none> lnz2zz.evo0n5ovraf17hzz 22h 2020-12-03T19:51:42+08:00 authentication,signing <none> system:bootstrappers:kubeadm:default-node-token ``` 它的过期时间为两小时。过了两个小时,这个certificate-key对应的token就会被删掉,同时kubeadm-certs这个secret也同时会被删掉。 此时,如果我们需要加入其他的master节点,则需要先重新上传四组CA文件。如下,我们依然使用原来的key,在master执行: ``` $ kubeadm init phase upload-certs --upload-certs --certificate-key a301c9c55596c54c5d4c7173aa1e3b6fd304130b0c703bb23149c0c69f94b8e0 ``` ### **使用指定的Certifcate-key** 在前面的示例中,我们都是让kubeadm自动生成一个certificate-key,然后打印到标准输出中。我们可以使用以下命令来生成一个certificate-key ``` $ kubeadm certs certificate-key 4db29a1143560818f56422dc88f6551a079c903106220f5d8aa1367beb6860ab ``` 然后在执行以下命令时使用指定的certificate-key,这样我们每一次都可以同样的certificate-key: ``` $ kubeadm init --control-plane-endpoint x.x.x.x:6443 ... --certificate-key 4db29a1143560818f56422dc88f6551a079c903106220f5d8aa1367beb6860ab $ kubeadm init phase upload-certs --upload-certs --certificate-key 4db29a1143560818f56422dc88f6551a079c903106220f5d8aa1367beb6860ab ``` ### **如何根据token获得certificate-key** 如果certifcate-key对应的token没有过期,如何获取certificate-key ``` ```