control-plane 노드의 IP 가 바뀌면 API 서버 인증서의 SAN · etcd 피어 주소 · 각 컴포넌트의 kubeconfig 가 모두 옛 IP 를 가리켜 클러스터가 뜨지 않는다. IP 를 바꾸는 정식 절차는 따로 없고, 인증서와 kubeconfig 를 새 IP 로 다시 만드는 작업이 된다. 노드가 여럿이면 클러스터를 새로 세우고 워크로드를 옮기는 편이 안전하다.
애초에 IP 가 바뀔 수 있는 환경이면 --control-plane-endpoint 에 IP 대신 DNS 이름이나 VIP 를 주고 클러스터를 만든다. 그러면 이름은 그대로 두고 레코드만 바꾸면 된다 — Master node control-plane 이중화 설정.
작업 전에 etcd 를 백업한다.
sudo cp -a /etc/kubernetes /etc/kubernetes.bak
sudo ETCDCTL_API=3 etcdctl \
--endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
snapshot save /root/etcd-snapshot.db
kubectl get configmap kubeadm-config -n kube-system -o jsonpath='{.data.ClusterConfiguration}' > kubeadm-conf.yaml
kubeadm-conf.yaml 의 controlPlaneEndpoint 와 apiServer.certSANs 를 새 IP 로 고친다.
API 서버와 etcd 인증서에 옛 IP 가 SAN 으로 박혀 있으므로 지우고 다시 만든다.
sudo systemctl stop kubelet
cd /etc/kubernetes/pki
sudo rm -f apiserver.crt apiserver.key apiserver-kubelet-client.crt apiserver-kubelet-client.key
sudo rm -f etcd/server.crt etcd/server.key etcd/peer.crt etcd/peer.key
sudo kubeadm init phase certs apiserver --config kubeadm-conf.yaml
sudo kubeadm init phase certs apiserver-kubelet-client --config kubeadm-conf.yaml
sudo kubeadm init phase certs etcd-server --config kubeadm-conf.yaml
sudo kubeadm init phase certs etcd-peer --config kubeadm-conf.yaml
sudo rm -f /etc/kubernetes/admin.conf /etc/kubernetes/controller-manager.conf /etc/kubernetes/scheduler.conf /etc/kubernetes/kubelet.conf
sudo kubeadm init phase kubeconfig all --config kubeadm-conf.yaml
sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
/etc/kubernetes/manifests/*.yaml 안의 --advertise-address · --etcd-servers · --listen-client-urls 같은 IP 를 새 값으로 고친다.
sudo grep -rn '<옛 IP>' /etc/kubernetes/manifests/
sudo sed -i 's/<옛 IP>/<새 IP>/g' /etc/kubernetes/manifests/*.yaml
sudo systemctl start kubelet
클러스터가 뜨면 kubeadm-config 와 kube-proxy ConfigMap 의 서버 주소도 바꾼다.
kubectl -n kube-system edit configmap kubeadm-config
kubectl -n kube-system edit configmap kube-proxy
kubectl -n kube-system rollout restart daemonset kube-proxy
각 worker 의 /etc/kubernetes/kubelet.conf 를 새 주소로 맞추거나, 간단하게는 kubeadm reset 후 새 join 명령으로 다시 붙인다 — Kubernetes 노드 추가.
kubectl cluster-info
kubectl get nodes
kubectl -n kube-system get pods
sudo kubeadm certs check-expiration
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text | grep -A1 'Subject Alternative Name'
SAN 목록에 새 IP 가 들어 있어야 한다.