由于前期K8S集群采用的是外部单ETCD节点的简易模式,随着对业务稳定性要求额提高,需要升级为多节点高可用的模式,本文记录K8S集群如何修改ETCD为外部集群地址。

一、首先登录管理节点,导出集群配置文件并增加hosts配置:

kubectl -n kube-system get configmap kubeadm-config -o jsonpath='{.data.ClusterConfiguration}' > kubeadm.yaml

vim /ets/hosts

10.0.xx.xx kube-apiserver

二、为管理节点增加证书SANs信息

vim kubeadm.yaml
内容如下:
apiServer:
  certSANs:
  # 这里需要包含负载均衡、所有master节点的hostname和ip
  - kube-apiserver
  - k8smaster0
  - k8smaster1
  - k8smaster2
  - 10.0.xx.28
  - 10.0.xx.29
  - 10.0.xx.30
  - 10.0.xx.31
  extraArgs:
    authorization-mode: Node,RBAC
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: kube-apiserver:9443 #修改为ETCD外部集群地址和端口
controllerManager: {}
dns: {}
etcd:
  external:
    caFile: ""
    certFile: ""
    endpoints:
    - http://10.0.66.21:2379
    keyFile: ""
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.28.2
networking:
  dnsDomain: cluster.local
  podSubnet: 10.188.0.0/16
  serviceSubnet: 10.166.0.0/12
scheduler: {}

三、备份旧证书:

mv /etc/kubernetes/pki/apiserver.{crt,key} .

四、重新生成新的证书:

kubeadm init phase certs apiserver --config kubeadm.yaml

五、验证证书是否包含对应IP或hostname:

openssl x509 -in /etc/kubernetes/pki/apiserver.crt -text

六、保存配置(一个节点保存一次就可以了,实际是上传到集群配置):

kubeadm init phase upload-config kubeadm --config kubeadm.yaml

七、更新所有管理节点组件配置(kube-apiserver:9443):

vim /etc/kubernetes/kubelet.conf
vim /etc/kubernetes/controller-manager.conf
vim /etc/kubernetes/scheduler.conf
kubectl edit configmap kube-proxy -n kube-system
vim ~/.kube/config
vim /etc/kubernetes/admin.conf
修改完成需要重启此管理节点,每个管理节点均需要逐个按上述所有步骤修改重启。
也可以加入新的管理节点:
1)、首先获取加入新的token:
kubeadm init phase upload-certs --upload-certs --config kube-config.yaml
2)、然后获得加入的命令:
kubeadm token create --print-join-command
3)、以上2个命令得到的结果合并得到加入管理节点的命令:
kubeadm join kube-apiserver:9443 --token 00wkyv.5xihh7hhhhtj5 \
--discovery-token-ca-cert-hash sha256:98af11459bce4da7deb10a931hhhhhdscg2cda5339f5ff04d31 \
#这个必须加,否则成worker node
--control-plane --certificate-key 42d0ec1da8859f91bd927b78656b05eggggggeafffsafc6dd51bd7 \
#如果修改了containerd容器目录则需要指定,否则无需指定
--cri-socket unix:///xxxxxxx/containerd/run_data/containerd.sock  \
 --ignore-preflight-errors=FileAvailable 

八、工作节点只需要重置加入:

kubeadm reset
还需要修改:vim /etc/kubernetes/kubelet.conf
kubeadm join kube-apiserver:9443 --token itjjuw.gsssssdh38g \
 --discovery-token-ca-cert-hash sha256:98af11459bce4da7deb10assf87fe45e07d9ea72cda5339f5ff04d31 \
#如果修改了containerd容器目录则需要指定,否则无需指定
 --cri-socket unix:///sss/containerd/run_data/containerd.sock  \
 --ignore-preflight-errors=FileAvailable 

完成以上步骤则K8S集群完成外部ETCD集群地址切换。