전체 목차
- 쿠버네티스 클러스터 #1 Ubuntu OS 설치 및 설정
- 쿠버네티스 클러스터 #2 시스템 설정
- 쿠버네티스 클러스터 #3 쿠버네티스 설치 및 설정
- 쿠버네티스 클러스터 #4 로컬 Docker Disktop 설치 및 설정
- 쿠버네티스 클러스터 #5 Spring boot 어플리케이션 배포
- 쿠버네티스 클러스터 #6 node 및 pod 설정 점검
- 쿠버네티스 클러스터 #7 안전한 시작, 종료 스크립트
- 쿠버네티스 클러스터 #8 Spring boot 로그 확인
- 쿠버네티스 클러스터 #9 CI/CD 적용
지난 챕터에서 간단한 spring boot 애플리케이션을 쿠버네티스 환경에 배포해 보았습니다.
이번 챕터에는 개별 노드에 배포된 앱을 관리하는 방법을 정리 했습니다.
이전 챕터에서 안전하게 종료 했다면 master -> node1 -> node2 -> node3 전원을 켜고 부팅이 완료되기를 대기합니다.
1. node 연결 및 상태 확인
$ kubectl uncordon node1 node2 node3
node/node1 uncordoned
node/node2 uncordoned
node/node3 uncordoned
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready control-plane 2d16h v1.30.14
node1 Ready <none> 2d15h v1.30.14
node2 Ready <none> 2d15h v1.30.14
node3 Ready <none> 2d15h v1.30.14
$
모든 노드가 Ready 상태 입니다.
2. pod 상태 확인
$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
hello-kubernetes-api-78dd74b6cd-tkg66 1/1 Running 0 15h 10.244.1.7 node1 <none> <none>
nginx-bf5d5cf98-lvxhj 1/1 Running 0 15h 10.244.1.6 node1 <none> <none>
$ kubectl get pods -A -o wide
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
default hello-kubernetes-api-78dd74b6cd-tkg66 1/1 Running 0 15h 10.244.1.7 node1 <none> <none>
default nginx-bf5d5cf98-lvxhj 1/1 Running 0 15h 10.244.1.6 node1 <none> <none>
kube-flannel kube-flannel-ds-9r45q 1/1 Running 2 (15h ago) 2d15h 192.168.2.103 node3 <none> <none>
kube-flannel kube-flannel-ds-g6ftb 1/1 Running 2 (15h ago) 2d15h 192.168.2.102 node2 <none> <none>
kube-flannel kube-flannel-ds-qwbrs 1/1 Running 2 (15h ago) 2d15h 192.168.2.101 node1 <none> <none>
kube-flannel kube-flannel-ds-s8tg8 1/1 Running 2 (70m ago) 2d16h 192.168.2.100 master <none> <none>
kube-system coredns-55cb58b774-g7f5v 0/1 Running 2 (70m ago) 2d16h 10.244.0.7 master <none> <none>
kube-system coredns-55cb58b774-h2sqz 0/1 Running 2 (70m ago) 2d16h 10.244.0.6 master <none> <none>
kube-system etcd-master 1/1 Running 2 (70m ago) 2d16h 192.168.2.100 master <none> <none>
kube-system kube-apiserver-master 1/1 Running 2 (70m ago) 2d16h 192.168.2.100 master <none> <none>
kube-system kube-controller-manager-master 1/1 Running 2 (70m ago) 2d16h 192.168.2.100 master <none> <none>
kube-system kube-proxy-d7nmn 1/1 Running 2 (15h ago) 2d15h 192.168.2.101 node1 <none> <none>
kube-system kube-proxy-qmt5m 1/1 Running 2 (15h ago) 2d15h 192.168.2.102 node2 <none> <none>
kube-system kube-proxy-vcp94 1/1 Running 2 (70m ago) 2d16h 192.168.2.100 master <none> <none>
kube-system kube-proxy-xqrqc 1/1 Running 2 (15h ago) 2d15h 192.168.2.103 node3 <none> <none>
kube-system kube-scheduler-master 1/1 Running 2 (70m ago) 2d16h 192.168.2.100 master <none> <none>
$
hello-kubernetes-api와 nginx 앱이 node1 에서만 실행되고 있습니다.
복제본(Replicas) 갯수를 지정하지 않았기 때문에 node1에 한개만 떠있습니다.
복제본의 갯수를 늘려서 node1, node2, node3 에 각각 분산되도록 설정해야 합니다.
마스터 노드 또는 로컬 PC 에서 실행해도 됩니다.
로컬에서 실행할 경우 연결되어있는 컨텍스트를 확인 하고 실행해야 합니다.
PS C:\Users\user> kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* docker-desktop docker-desktop docker-desktop
kubernetes-admin@kubernetes kubernetes kubernetes-admin
PS C:\Users\user> kubectl config use-context kubernetes-admin@kubernetes
Switched to context "kubernetes-admin@kubernetes".
PS C:\Users\user> kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
docker-desktop docker-desktop docker-desktop
* kubernetes-admin@kubernetes kubernetes kubernetes-admin
PS C:\Users\user>
PS C:\Users\user> kubectl scale deployment hello-kubernetes-api --replicas=3
deployment.apps/hello-kubernetes-api scaled
PS C:\Users\user> kubectl scale deployment nginx --replicas=3
deployment.apps/nginx scaled
PS C:\Users\user> kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
hello-kubernetes-api-78dd74b6cd-q4vrd 1/1 Running 0 28s 10.244.2.7 node3 <none> <none>
hello-kubernetes-api-78dd74b6cd-qg966 0/1 ContainerCreating 0 28s <none> node2 <none> <none>
hello-kubernetes-api-78dd74b6cd-tkg66 1/1 Running 0 15h 10.244.1.7 node1 <none> <none>
nginx-bf5d5cf98-hp88b 1/1 Running 0 18s 10.244.2.8 node3 <none> <none>
nginx-bf5d5cf98-lvxhj 1/1 Running 0 15h 10.244.1.6 node1 <none> <none>
nginx-bf5d5cf98-pkd66 0/1 ContainerCreating 0 18s <none> node2 <none> <none>
PS C:\Users\user>
스케일을 replicas=3 으로 지정한 후 확인해 보면 node1~3 에 하나씩 실행이 되고 있음을 확인 할 수 있습니다.
3. coredns 상태 확인
위 pod 상태에서 kube-system / coredns-xxxx 가 Running 상태임에도 불구하고 준비 (READY)가 0/1로 보여집니다.
PS C:\Users\user> kubectl get pods -n kube-system -l k8s-app=kube-dns
NAME READY STATUS RESTARTS AGE
coredns-55cb58b774-g7f5v 0/1 Running 2 (90m ago) 2d17h
coredns-55cb58b774-h2sqz 0/1 Running 2 (90m ago) 2d17h
PS C:\Users\user>
쿠버네티스 클러스터에서 CoreDNS는 일반적으로 DNS서버가 도메인 이름을 IP로 바꿔주는 것 처럼 쿠버네티스 내부 리소스들의 이름을 관리하는 역활을 합니다.
PS C:\Users\user> kubectl describe pod -n kube-system -l k8s-app=kube-dns
Name: coredns-55cb58b774-g7f5v
Namespace: kube-system
... 생략 ...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning Unhealthy 28s (x613 over 90m) kubelet Readiness probe failed: HTTP probe failed with statuscode: 503
Name: coredns-55cb58b774-h2sqz
Namespace: kube-system
... 생략 ...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning Unhealthy 30s (x613 over 90m) kubelet Readiness probe failed: HTTP probe failed with statuscode: 503
PS C:\Users\user>
CoreDNS 가 모두 Readiness probe failed: HTTP probe failed with statuscode: 503 에러라는 것은 네트워크 플러그인(Flannel)과 마스터 노드간의 통신 문제로 방화벽 설정 문제인 것 같습니다.
최초 방화벽을 설정 할 때 192.168.2.0/24 만 허용했지만 쿠버네티스 내부의 포드끼리 통신 할 때는 10.244.0.0/16 대역을 사용하므로 kubelet이 pod IP(10.244.0.7)로 상태 체크(HTTP GET)을 보냈지만 방화벽에서 패킷을 막고 있기 때문에 실패하는 것 입니다.
마스터 노드에서 10.244.0.0/16 에 대한 연결을 허용합니다.
$ sudo ufw allow from 10.244.0.0/16 comment 'K8s pods trans'
$ sudo ufw reload
$ sudo ufw status
Status: active
To Action From
-- ------ ----
22/tcp ALLOW 192.168.2.0/24 # Local Network
6443/tcp ALLOW 192.168.2.0/24 # K8s kube-apiserver
2379/tcp ALLOW 192.168.2.100 # K8s etcd client (local)
2380/tcp ALLOW 192.168.2.100 # K8s etcd peer (local)
10257/tcp ALLOW 192.168.2.0/24 # K8s Scheduler & Controller
10259/tcp ALLOW 192.168.2.0/24 # K8s Scheduler & Controller
8285/udp ALLOW 192.168.2.0/24 # K8s Flannel CNI
8472/udp ALLOW 192.168.2.0/24 # K8s Flannel CNI
10250/tcp ALLOW 192.168.2.0/24 # K8s kubelet API
Anywhere ALLOW 192.168.2.0/24
Anywhere ALLOW 10.244.0.0/16 # K8s pods trans
$
잠시(1~2분)후 CoreDNS 의 상태를 확인해 봅니다.
PS C:\Users\user> kubectl get pods -n kube-system -l k8s-app=kube-dns
NAME READY STATUS RESTARTS AGE
coredns-55cb58b774-g7f5v 1/1 Running 2 (128m ago) 2d17h
coredns-55cb58b774-h2sqz 1/1 Running 2 (128m ago) 2d17h
PS C:\Users\user>
CoreDNS 도 정상이 되었습니다.
4. 브라우저에서 확인
이제 브라우저에서 각각 노드별 IP로 접속하면

정상적으로 pods 명이 나옵니다.
참고. NodePort 서비스의 Load Balancing
각각의 노드의 IP로 접속 하더라도 실제 실행중인 pod 명이 아닌 다른 포드의 명이 출력될 수 있습니다.
쿠버네티스 시작시 스스로 판단해서 가장 부하가 적은 쪽으로 분배를 하기 때문에 같은 노드에 pod들이 몰려 있있을 수 있습니다.
이것은 정상적인 상황 이지만 모든 노드가 활성화 된 후 kubectl rollout restart ... 명령으로 재조정 할 수 있습니다.
PS C:\Users\user> kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
hello-kubernetes-api-7bc68f498f-2gc9x 1/1 Running 0 16h 10.244.1.48 node1 <none> <none>
hello-kubernetes-api-7bc68f498f-dfm9q 1/1 Running 0 16h 10.244.1.49 node1 <none> <none>
hello-kubernetes-api-7bc68f498f-xw8g8 1/1 Running 0 16h 10.244.1.51 node1 <none> <none>
nginx-bf5d5cf98-d96gb 1/1 Running 0 16h 10.244.1.52 node1 <none> <none>
nginx-bf5d5cf98-gdgrk 1/1 Running 0 16h 10.244.1.53 node1 <none> <none>
nginx-bf5d5cf98-lpdpt 1/1 Running 0 16h 10.244.1.50 node1 <none> <none>
PS C:\Users\user> kubectl rollout restart deployment hello-kubernetes-api
deployment.apps/hello-kubernetes-api restarted
PS C:\Users\user> kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
hello-kubernetes-api-568bc8c74b-6fggb 1/1 Running 0 10s 10.244.1.54 node1 <none> <none>
hello-kubernetes-api-568bc8c74b-mzf9t 1/1 Running 0 12s 10.244.3.31 node2 <none> <none>
hello-kubernetes-api-568bc8c74b-xmssh 1/1 Running 0 15s 10.244.2.57 node3 <none> <none>
nginx-bf5d5cf98-d96gb 1/1 Running 0 16h 10.244.1.52 node1 <none> <none>
nginx-bf5d5cf98-gdgrk 1/1 Running 0 16h 10.244.1.53 node1 <none> <none>
nginx-bf5d5cf98-lpdpt 1/1 Running 0 16h 10.244.1.50 node1 <none> <none>
PS C:\Users\user>
PS C:\Users\user> kubectl get pods -l app=hello-kubernetes-api -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
hello-kubernetes-api-78dd74b6cd-q4vrd 1/1 Running 0 76m 10.244.2.7 node3 <none> <none>
hello-kubernetes-api-78dd74b6cd-qg966 1/1 Running 0 76m 10.244.3.5 node2 <none> <none>
hello-kubernetes-api-78dd74b6cd-tkg66 1/1 Running 0 17h 10.244.1.7 node1 <none> <none>
PS C:\Users\user>
끝.
'UNIX-Networking' 카테고리의 다른 글
| 쿠버네티스 클러스터 #8 Spring boot 로그 확인 (0) | 2026.01.21 |
|---|---|
| 쿠버네티스 클러스터 #7 안전한 시작, 종료 스크립트 (0) | 2026.01.20 |
| 쿠버네티스 클러스터 #5 Spring boot 어플리케이션 배포 (0) | 2026.01.19 |
| 쿠버네티스 클러스터 #4 로컬 Docker Disktop 설치 및 설정 (1) | 2026.01.19 |
| 쿠버네티스 클러스터 #3 - 쿠버네티스 설치 및 설정 (0) | 2025.12.19 |
