目录

kubeadm使用同一套证书创建多个集群

概述

通过 kubeadm 已经搭建了一个集群,如何将证书导出,再用这些证书重新搭建一个集群呢。

重建集群

重建集群,需要先提前备份证书,如果是运维自签的证书,可以重新考虑整个流程,下面只针对使用 kubeadm 自签的证书创建集群的情况。

1
2
mkdir -p /tmp/kubernetes/pki/
cp -r /etc/kubernetes/pki/* /tmp/kubernetes/pki/

执行 kubeadm reset 之后,/etc/kubernetes/pki/ 目录下的内容会全部被清空。重新创建集群,需要提前把证书复制回进去。另外有个地方需要注意,我们的集群习惯使用 Node 的 IP 来作为 nodeName,所以 kubeadm 的配置文件需要做点修改。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# cat /root/dok-release/bin/k8s/dok.yaml
apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 10.189.110.45
  bindPort: 6443
nodeRegistration:
  criSocket: unix:///var/run/containerd/containerd.sock
  imagePullPolicy: IfNotPresent
  taints: null
  name: 10.189.110.45
  kubeletExtraArgs:
    hostname-override: 10.189.110.45

然后关于 Join 节点的时候的操作,也需要一个 Join 的配置,这里主要涉及 discovery 的配置。kubeadm join 10.189.110.45:6443 --config join.yaml,Join 的时候直接通过这个命令即可。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# cat join.yaml
apiVersion: kubeadm.k8s.io/v1beta3
kind: JoinConfiguration
nodeRegistration:
  name: 10.189.110.46
  kubeletExtraArgs:
    hostname-override: 10.189.110.46
discovery:
  bootstrapToken:
    token: 3kmj4z.3fer1j9o2dfjgsit
    apiServerEndpoint: 10.189.110.45:6443
    caCertHashes:
      - sha256:945413f07f4a51419f26d7c17ab31bf4a3bdac53368184da0256e248442aa256

不使用bootstrap token

某些条件下,不希望每次加入节点都需要通过 bootstrap token 来创建节点专属证书,那么有办法用一个证书把所有 Node 都加入到集群吗,虽然官方并没有提供这种方式,也不是一个合理的场景,但就是有这样的需求,所以我们还是需要探索一下这种可能性的。

从下面的关键日志,可以发现流程。

1
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap

总结

要注意 token 过期的时间,如果 token 过期了,需要通过 kubeadm token create --print-join-command 命令来重新创建。