이전 가이드에서 마스터 노드 설정과 CNI 설치까지 완료했습니다. 이번 포스트에서는 드디어 워커 노드를 클러스터에 참여시키고, 간단한 테스트와 함께 발생할 수 있는 오류 해결 방법을 정리해보겠습니다.
💡 시작하기 전에: 이 가이드는 워커 노드 서버에 kubeadm, kubelet, kubectl 설치 및 containerd 설정, Swap 비활성화 등 마스터 노드 설정 Part 1의 과정이 동일하게 완료되었다는 가정 하에 진행됩니다.
1. 워커 노드를 클러스터에 참여시키기 (Join)
마스터 노드 초기화(kubeadm init) 시 출력되었던 kubeadm join 명령어는 토큰의 유효기간이 24시간으로 정해져 있습니다. 만약 이 시간이 지났다면, 새로운 토큰을 발급받아 조인 명령어를 다시 만들어야 합니다.
(1) 새 토큰 생성 (마스터 노드에서 실행)
먼저 마스터 노드에서 새로운 조인 토큰을 생성합니다.
kubeadm token create
출력 예시: 19lym0.ukgyzvj4xrtm32n5
(2) CA 인증서 해시 확인 (마스터 노드에서 실행)
다음으로, 클러스터의 CA(Certificate Authority) 인증서의 공개 키를 해시값으로 추출합니다. 이 값은 워커 노드가 마스터 노드를 신뢰할 수 있는지 확인하는 데 사용됩니다.
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
출력 예시: de300ac3d6ada006781674dbed8e53c8b2ea24bbe17c3c0fd17172dc2983412c
(3) 새로운 kubeadm join 명령어 조합 및 실행 (워커 노드에서 실행)
이제 위에서 얻은 새 토큰과 CA 인증서 해시값을 사용하여 kubeadm join 명령어를 완성하고, 각 워커 노드에서 root 권한으로 실행합니다.
# sudo kubeadm join <마스터노드IP>:<포트> --token <새 토큰> --discovery-token-ca-cert-hash sha256:<CA 인증서 해시>
# 실행 예시
sudo kubeadm join 192.168.56.10:6443 --token 19lym0.ukgyzvj4xrtm32n5 --discovery-token-ca-cert-hash sha256:de300ac3d6ada006781674dbed8e53c8b2ea24bbe17c3c0fd17172dc2983412c
조인이 성공하면, 마스터 노드에서 kubectl get nodes 명령어를 실행하여 워커 노드가 정상적으로 추가되었는지 확인할 수 있습니다.
[vagrant@k8s-master ~]$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane 22h v1.31.1
k8s-worker1 Ready <none> 63s v1.31.1
STATUS가 Ready로 표시되면 성공입니다.
2. 워커 노드에서 테스트 파드 생성해보기
워커 노드가 제대로 동작하는지 확인하기 위해 간단한 테스트용 파드(Pod)를 하나 생성해보겠습니다. 마스터 노드에서 아래 명령어를 실행합니다.
# kiamol/ch02-hello-kiamol 이미지를 사용하는 hello-kiamol 이라는 이름의 파드를 생성합니다.
kubectl run hello-kiamol --image=kiamol/ch02-hello-kiamol
파드가 어느 노드에 생성되었는지 확인하려면 -o wide 옵션을 사용합니다.
kubectl get pods -o wide
NODE 컬럼에 k8s-worker1과 같이 워커 노드의 이름이 표시된다면 성공적으로 파드가 배포된 것입니다.
3. ❗️(Troubleshooting) VM 환경의 네트워크 오류 해결
🌐 참고 문서: 쿠버네티스 자주 사용하는 명령어 정리
VirtualBox + Vagrant와 같은 가상 환경에서는 NAT와 Host-only 어댑터를 함께 사용하는 경우가 많습니다. 이때 kubelet이 노드의 IP를 잘못 인식하여 파드(Pod)에 접근할 수 없는 문제(unable to upgrade connection: pod does not exist)가 발생할 수 있습니다.
이 문제는 각 노드의 kubelet 설정에 통신에 사용할 IP를 명시적으로 지정하여 해결할 수 있습니다. 클러스터의 모든 노드(마스터, 워커)에서 아래 작업을 수행해주세요.
- kubelet 설정 파일 열기
sudo vi /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf - --node-ip 옵션 추가 파일 내용 중 ExecStart 부분을 찾아 맨 뒤에 --node-ip와 함께 해당 노드의 IP 주소를 추가합니다.
- 마스터 노드에서는 마스터 노드의 IP (192.168.56.10)를,
- 워커 노드에서는 워커 노드의 IP (192.168.56.11)를 입력해야 합니다.
# [Service] 섹션의 ExecStart 라인을 수정합니다. # 기존 ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS # 변경 (해당 노드의 IP를 입력) ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS --node-ip 192.168.56.11
- 서비스 재시작 설정 파일을 변경했으므로, systemd에 변경 사항을 알리고 kubelet을 재시작합니다.
sudo systemctl daemon-reload sudo systemctl restart kubelet
이제 모든 노드가 정상적으로 통신하며 클러스터가 안정적으로 동작할 것입니다. 이것으로 Rocky Linux 환경에 Kubernetes 클러스터를 구축하는 기본적인 과정이 마무리되었습니다. 🎉
'기술, 개발 > DevOps' 카테고리의 다른 글
| Rocky Linux에서 Kubernetes 설치하기 Part 4: 서비스 배포와 온프레미스 환경의 한계 (0) | 2025.09.18 |
|---|---|
| Rocky Linux에서 Kubernetes 설치하기 Part 2: 클러스터 초기화와 대시보드 설정 (0) | 2025.09.18 |
| Rocky Linux에서 Kubernetes 설치하기 Part 1: 기본 환경 설정 (0) | 2025.09.18 |
| 컨테이너 한방 정리 (0) | 2025.09.14 |