由于前期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集群地址切换。