K8s中apiserver地址修改方案
適用場景:
通常是自建k8s環境,創建的時候不規范,apiserver地址使用的是負載均衡器地址代理的,由于業務需要變更負載均衡器地址,因此需要對apiserver地址進行修改,生產實踐之后的一個方案分享
1、k8s中集群證書修改操作步驟
1.1 master節點操作
當前證書情況
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
本次修改直接改成走域名,因為添加hosts解析到新的負載均衡
10.xx.xxx.xxx lb.k8s.local修改 Kubernetes 集群配置
- 導出當前配置
#導出當前配置
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 ConfigMap
kubeadm init phase upload-config kubeadm --config=kubeadm-config.yaml更新 API Server 證書
- 刪除舊的證書和密鑰
rm /etc/kubernetes/pki/apiserver.*- 使用 kubeadm 重新生成證書
kubeadm init phase certs apiserver --config=kubeadm-config.yaml更新 kubeconfig 文件
管理員和 kubelet 使用的 kubeconfig 文件中嵌入了舊的 API Server 地址,也需要更新。
- 更新 admin.conf
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 (在所有節點上執行): kubelet 的配置也需要更新以指向新的 API Server 地址。
# 首先,更新 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更新cluster-info的configmap文件
- 獲取當前的配置,不更新這個配置會導致kubeadm添加節點報錯
kubectl get cm -n kube-public cluster-info -o yaml > cluster-info.yaml- 更新configmap配置
修改server地址為最新的apiserver地址,然后apply
kubectl apply -f cluster-info.yaml更新kube-proxy的configmap文件
不更新這個配置會導致svc轉發流量異常
- 獲取當前的配置
kubectl get cm -n kube-system kube-proxy -o yaml > kube-proxy.yaml- 修改里面的server字段為新的apiserver地址
kubectl apply -f kube-proxy.yaml1.2 更新所有work節點操作
備份關鍵文件
# 備份整個master /etc/kubernetes 目錄
sudo cp -r /etc/kubernetes /etc/kubernetes.bak
# 備份整個 $HOME/.kube 目錄
cp -r $HOME/.kube $HOME/.kube.bak所有機器添加本地hosts
10.xxx.10.97 lb.k8s.local節點驅逐
kubectl drain xxxx --ignore-daemonsets --delete-emptydir-datakubelet更新
- 更新 kubelet.conf (在所有節點上執行): kubelet 的配置也需要更新以指向新的 API Server 地址。
# 首先,更新 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


































