쿠버네티스 컨트롤 플레인의 IP가 바뀔 때 해야 할 일

이번에 자리를 옮긴 kiwi 본체의 사진

상황 설명

이런저런 실험 및 다른 분들께 자원을 제공하기 위한 용도로 리눅스 머신에 단일 노드로 구성된 쿠버네티스(Kubernetes) 클러스터를 구성해 사용하고 있었습니다. 이 머신이 원래 메인 라우터 하위에 위치하면서 192.168.165.104 라는 아이피를 가지고 있었는데, 서브 라우터 하위로 위치를 옮기면서 192.168.167.103 으로 아이피가 변경되었습니다.

쿠버네티스 클러스터가 내부적으로 사용하는 설정 파일과 X.509 인증서 여기저기에 192.168.165.104 라는 아이피가 박혀있었기 때문에 이를 수정하는 작업이 필요했습니다.

/etc/kubernetes 에서 설정 변경

/etc/kubernetes 하위에 있는 온갖 파일에 박혀 있는 192.168.165.104 를 새 아이피 주소로 변경해줍니다.

# 진행 전에 반드시 /etc/kubernetes 를 백업할 것
cd /etc/kubernetes
sudo find . -type f -exec sed -i 's/192.168.165.104/192.168.167.103/g' {} +

인증서 재생성

기존 X.509 인증서 중 재생성이 필요한 인증서를 지운 후 재생성합니다. 정확히 어떤 인증서가 재생성이 필요한지는 이 GitHub comment를 참고하여 확인했습니다.

# 진행 전에 반드시 /etc/kubernetes 를 백업할 것
cd /etc/kubernetes/pki
sudo rm apiserver.{crt,key}
sudo kubeadm init phase certs apiserver  --service-cidr '10.234.0.0/18' --service-dns-domain=kiwi.local
sudo rm etcd/peer.{crt,key}
sudo kubeadm init phase certs etcd-peer
sudo rm etcd/server.{crt,key}
sudo kubeadm init phase certs etcd-server

여기에서 유의할 사항이 apiserver 인증서 발급시 넣는 인자들인데요, 위 인자가 없는 경우 쿠버네티스 서비스 CIDR이 10.96.0.0/12 인 것으로 간주되며 따라서 Kubernetes API Server의 서비스 주소는 10.96.0.1 이 됩니다. 만약 제 경우처럼 최초 클러스터 생성시 서비스 CIDR을 다르게 설정했다면 이 인자를 동일하게 주어야 올바른 SAN에 대해 인증서가 생성됩니다. (관련 문서)

그러지 아니하고, 생성된 인증서가 10.96.0.1 에 대해 생성된다면 아래와 같은 오류가 발생할 수 있습니다.

2024-01-28T17:10:19.737110166+09:00 stderr F level=info msg="Establishing connection to apiserver" host="https://10.234.0.1:443" subsys=k8s-client
2024-01-28T17:10:19.759609503+09:00 stderr F level=error msg="Unable to contact k8s api-server" error="Get \"https://10.234.0.1:443/api/v1/namespaces/kube-system\": tls: failed to verify certificate: x509: certificate is valid for 10.96.0.1, 192.168.167.103, not 10.234.0.1" ipAddr="https://10.234.0.1:443" subsys=k8s-client

위 오류는 이 쿠버네티스 클러스터의 CNI 구현체엔 Cilium에서 발생한 오류 로그입니다.

이제 쿠버네티스 컨트롤 플레인과 kubelet을 구성하는 모든 컨테이너를 한번 재시작해줍니다.

KubeConfig 에서도 아이피 변경

~/.kube/config 에 박혀 있는 cluster server 주소도 https://192.168.169.104:6443 에서 https://192.168.167.103:6443 로 변경해줍니다. 이제 내가 사용하는 kubectl 클라이언트가 변경된 아이피 주소를 통하여 쿠버네티스 클러스터에 접근하게 되며 이제 kubectl 명령어를 통한 쿠버네티스 클러스터 조작이 이전처럼 가능해집니다.

ConfigMap 들 점검

쿠버네티스 내부 ConfigMap 여기저기에 구 IP가 박혀있을 수 있으니

kubectl get cm -A -o yaml | grep 192.168.165.104

를 통해 모든 ConfigMap 을 확인하여, 기존 IP로 된 설정값이 있으면 새 IP로 변경해줍니다.