集群Service IP 段變更后(從 10.96.0.0/16 變為 10.17.0.0/16),導致 kubernetes.default.svc
的ClusterIP IP (10.96.0.1)和段范圍不一樣,對于這個情況,需要重建該 svc。
重建方法很簡單,刪除該 Service,集群會自動創建一個新的,ClusterIP 為 10.17.0.1 的 service。但是如果你和我一樣直接這樣操作,那大概率會遇到和我一樣的坑。
這個是 集群內的服務訪問apiserver 的主要方式。這個時候,幾乎集群內需要和 apiserver 交互的功能和服務都不能正常使用。因為它們還是要和以前的 Service IP 進行通訊。
比如 calico-node 就開始出現問題、如創建銷毀 pod的過程 要和calico-node通訊。一連串地炸了。
重建 apiserver 和 calico-node 后,發現 calico-node 起不來,發現它還是連接到老的 ClusterIP,于是修改它的環境變量指定正確的 Apiserver IP。
可以通過加入環境變量到 calico-node demonset 中,指定 IP 和端口
KUBERNETES_SERVICE_HOST:是k8s的kubernetes服務的serviceIP
KUBERNETES_SERVICE_PORT: 是k8s的kubernetes服務的端口號
KUBERNETES_SERVICE_PORT_HTTPS:是k8s的kubernetes服務的https端口號
于是編輯
kubectl edit daemonset calico-node -n kube-system
# 發現存在以下映射自 configmap 的環境變量kubernetes-services-endpoint,但是 configmap 并不存在
- configMapRef:name: kubernetes-services-endpoint
# 我就沒直接加到demonset里面,創建了對應的configmap
# 創建 ep.yaml 內容如下
apiVersion: v1
data:KUBERNETES_SERVICE_HOST: 10.1.15.121KUBERNETES_SERVICE_PORT: "6443"KUBERNETES_SERVICE_PORT_HTTPS: "6443"
kind: ConfigMap
metadata:name: kubernetes-services-endpointnamespace: kube-systemkubectl apply -f ep.yaml
提交后calico-node 能順利起來了,但是其它服務還是有問題。
上面 10.1.15.121 是我的 apiserver master 的 IP,為什么不寫集群內的 Service ClusterIP 呢?當時改過為正確的新 IP,但是還是無法啟動,因為證書里沒含有新的集群 IP,然后就寫這個了。證書當時每個 master 的 api 和負載均衡的域名都加進去了。
它正常后,pod 創建是沒問題了,但是一些核心的服務還是有問題的。因為通過 Service 拿到的新 IP 10.17.0.1 不在 apiserver 的證書里面。
查看證書 SANs 命令
for i in $(find /etc/kubernetes/pki -type f -name "*.crt");do echo ${i} && openssl x509 -in ${i} -text | grep 'DNS:';done
于是到這一步就需要重新生成集群證書并把新 IP 加進去了。
以下是基于集群是 kubeadm 安裝的前提
-
編輯 cm 加入
kubectl edit cm -n kube-system kubeadm-configClusterConfiguration: |apiServer:certSANs:- 127.0.0.1- apiserver.cluster.local- 10.103.97.2- 10.1.15.121- 10.1.15.122- 10.1.15.123- 10.17.0.1
-
備份和刪除本地證書
cp -r /etc/kubernetes /etc/kubernetes-bak rm -rf /etc/kubernetes/pki/{apiserver*,front-proxy-client*} rm -rf /etc/kubernetes/pki/etcd/{healthcheck*,peer*,server*}
-
生成新的證書
kubeadm init phase certs all --config kubeadmin-config.yaml
-
在每個 master node 重復 2~3 步驟
-
完成后,重建 apiserver 后 集群就正常了
總結
換 IP 段后,要及時生成新的 apiserver 的 Service ClusterIP 到證書 SANs 里。然后再重建 kubernetes.default.svc
。最后我把 kubernetes-services-endpoint configmap 的 IP 改為正確的 Service cluster IP 并重建了 calico-node。