适用场景: 通常是自建k8s环境,创建的时候不规范,apiserver地址使用的是负载均衡器地址代理的,由于业务需要变更负载均衡器地址,因此需要对apiserver地址进行修改,生产实践之后的一个方案分享
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text | grep -A1 "Subject Alternative Name"
# 备份整个master /etc/kubernetes 目录
sudo cp -r /etc/kubernetes /etc/kubernetes.bak
# 备份整个 $HOME/.kube 目录
cp -r $HOME/.kube $HOME/.kube.bak
本次修改直接改成走域名,因为添加hosts解析到新的负载均衡
10.xx.xxx.xxx lb.k8s.local
#导出当前配置
kubectl get cm -n kube-system kubeadm-config -o jsonpath='{.data.ClusterConfiguration}' > kubeadm-config.yaml
找到 apiServer 部分下的 certSANs 字段。你需要修改 IPs 列表,将旧的 IP 替换为新的 IP,并确保保留所有其他必需的 IP(如 127.0.0.1)和域名(如 kubernetes, kubernetes.default, kubernetes.default.svc 等)
apiServer:
certSANs:
- 10.xxx.10.97 # 旧的 IP
extraArgs:
authorization-mode: Node,RBAC
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
...
apiServer:
certSANs:
- 10.xxx.10.97 # 旧的 IP
- lb.k8s.local # 新的域名
- 127.0.0.1
- 10.xxx.11.71 # master节点ip
- 10.xxx.11.188 # master节点ip
- 10.xxx.10.189 # master节点ip
extraArgs:
authorization-mode: Node,RBAC
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
kubeadm init phase upload-config kubeadm --config=kubeadm-config.yaml
rm /etc/kubernetes/pki/apiserver.*
kubeadm init phase certs apiserver --config=kubeadm-config.yaml
管理员和 kubelet 使用的 kubeconfig 文件中嵌入了旧的 API Server 地址,也需要更新。
sudo kubeadm init phase kubeconfig admin --config=kubeadm-config.yaml
# 将新生成的 admin.conf 复制到当前用户目录
sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 首先,更新 kubelet.conf 中的 server 地址
sudo sed -i "s/server: https:\/\/10.xxxx.10.97:[0-9]*/server: https:\/\/lb.k8s.local:443/" /etc/kubernetes/kubelet.conf
# 然后,重启 kubelet 以应用更改
sudo systemctl restart kubelet
API Server 以及其他控制平面组件(如 scheduler, controller-manager)是以静态 Pod 运行的,kubelet 会自动监控并重启它们。
# 最简单的方法是移动它们的 manifest 文件,稍后再移回来,kubelet 会自动重启它们
sudo mv /etc/kubernetes/manifests/kube-apiserver.yaml /tmp/
# 等待几秒钟,确认 apiserver pod 已终止
sudo mv /tmp/kube-apiserver.yaml /etc/kubernetes/manifests/
# 同样地,重启 controller-manager 和 scheduler 以确保它们使用新的 API Server 地址(可选但推荐)
sudo mv /etc/kubernetes/manifests/kube-controller-manager.yaml /tmp/
# 等待几秒钟,
sudo mv /etc/kubernetes/manifests/kube-scheduler.yaml /tmp/
sleep 10
sudo mv /tmp/kube-controller-manager.yaml /etc/kubernetes/manifests/
# 等待几秒钟,
sudo mv /tmp/kube-scheduler.yaml /etc/kubernetes/manifests/
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text | grep -A1 "Subject Alternative Name"

输出中应该包含你新添加的域名地址lb.k8s.local
kubectl get nodes
kubectl get pods --all-namespaces
kubectl get cm -n kube-public cluster-info -o yaml > cluster-info.yaml
修改server地址为最新的apiserver地址,然后apply
kubectl apply -f cluster-info.yaml
不更新这个配置会导致svc转发流量异常
kubectl get cm -n kube-system kube-proxy -o yaml > kube-proxy.yaml
kubectl apply -f kube-proxy.yaml
# 备份整个master /etc/kubernetes 目录
sudo cp -r /etc/kubernetes /etc/kubernetes.bak
# 备份整个 $HOME/.kube 目录
cp -r $HOME/.kube $HOME/.kube.bak
10.xxx.10.97 lb.k8s.local
kubectl drain xxxx --ignore-daemonsets --delete-emptydir-data
# 首先,更新 kubelet.conf 中的 server 地址
sudo sed -i "s/server: https:\/\/10.xxx.10.97:[0-9]*/server: https:\/\/lb.k8s.local:443/" /etc/kubernetes/kubelet.conf
# 然后,重启 kubelet 以应用更改
sudo systemctl restart kubelet