전체 목차

 

지난 챕터에서 간단한 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>

 

끝.

+ Recent posts