티스토리 뷰
kubectl은 kubeadm init 시, master node에서 실행이 가능하다. 이 때 /etc/kubernetes/admin.conf 파일이 생성된다. 하지만 실제 kubectl은 마스터 노드 이외의 워커 노드에서도 동작할 수 있다. admin.conf 파일을 워커 노드에 복사 후, 워커 노드에서 kubectl 실행 시 정상 동작한다.
아래는 마스터 노드의 /etc/kubernetes/admin.conf를 워커 노드의 ./ 에 복사 후, kubectl 명령을 내린 결과이다. conf 파일 명시를 위해 --kubeconfig 옵션을 추가한다.
vagrant@w3-k8s:~$ kubectl get nodes --kubeconfig admin.conf
NAME STATUS ROLES AGE VERSION
m-k8s Ready control-plane 6d1h v1.29.14
w1-k8s Ready <none> 6d1h v1.29.14
w2-k8s Ready <none> 6d1h v1.29.14
w3-k8s Ready <none> 6d1h v1.29.14
클러스터의 모든 노드를 정상적으로 확인할 수 있다.
kubelet은 파드 생성, 상태 관리, 복구 등을 담당한다. kubelet에 문제가 생기면 파드가 정상적으로 관리되지 않는다.
간단한 nginx 파드를 마스터 노드에서 배포하면 아래와 같다.
이 때 -f 옵션은 파드를 실행할 yaml 파일 지정을 위해 사용한다. (filename option)
vagrant@m-k8s:~$ kubectl create -f ./simple-nginx/nginx-pod.yaml
pod/nginx-pod created
vagrant@m-k8s:~$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-pod 1/1 Running 0 56s 10.244.3.2 w3-k8s <none> <none>
3번 워커에 정상적으로 파드가 배포되었다.
3번 워커에서 현재 kubelet이 동작 중임을 systemctl status kubelet으로 확인하고, inactive 상태면 start 해준다.
vagrant@w3-k8s:~$ systemctl status kubelet
● kubelet.service - kubelet: The Kubernetes Node Agent
Loaded: loaded (/lib/systemd/system/kubelet.service; enabled; vendor prese>
Drop-In: /usr/lib/systemd/system/kubelet.service.d
└─10-kubeadm.conf
Active: active (running) since Wed 2025-03-05 12:46:54 UTC; 42min ago
...
3번 워커에 실제로 nginx 파드가 배포되어 있는 지는 kubectl get pods -o wide 또는 해당 노드에서 crictl pods 로 확인할 수 있다.
vagrant@w3-k8s:~$ sudo crictl pods
WARN[0000] runtime connect using default endpoints: [unix:///var/run/dockershim.sock unix:///run/containerd/containerd.sock unix:///run/crio/crio.sock unix:///var/run/cri-dockerd.sock]. As the default settings are now deprecated, you should set the endpoint instead.
ERRO[0000] validate service connection: validate CRI v1 runtime API for endpoint "unix:///var/run/dockershim.sock": rpc error: code = Unavailable desc = connection error: desc = "transport: Error while dialing: dial unix /var/run/dockershim.sock: connect: no such file or directory"
POD ID CREATED STATE NAME NAMESPACE ATTEMPT RUNTIME
0f840b0d55bc1 8 minutes ago Ready nginx-pod default 0 (default)
9bb9bdc14cf4c 44 minutes ago Ready kube-proxy-7nngt kube-system 1 (default)
f56fd85489c62 44 minutes ago Ready kube-flannel-ds-7g2vg kube-flannel 1 (default)
9cc2cda38de56 6 days ago NotReady kube-proxy-7nngt kube-system 0 (default)
이제 강제로 kubelet을 종료 (sudo systemctl stop kubelet) 후, 마스터 노드에서 nginx-pod를 삭제하면 다음과 같다.
kubectl delete pod nginx-pod
pod "nginx-pod" deleted
^Cvagrant@m-k8s:~$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-pod 1/1 Terminating 0 11m 10.244.3.2 w3-k8s <none> <none>
마스터에서는 삭제 명령을 내렸지만, 워커 노드의 kubelet이 동작하고 있지 않기 때문에 Terminating 상태만 유지가 되고 있다.
이후, 3번 워커에서 kubelet을 재시작한 뒤, 마스터에서 다시 파드 동작을 확인하면 다음과 같다.
vagrant@m-k8s:~$ kubectl get pods -o wide
No resources found in default namespace.
이를 통해 kubelet에 문제가 생기면 파드가 제대로 관리되지 않음을 알 수 있다.
'메모 > kubernetes' 카테고리의 다른 글
쿠버네티스 주요 구성 요소 (파드 배포 중심) (0) | 2025.02.28 |
---|---|
vagrant 이용한 kubernetes 환경 프로비저닝 (0) | 2025.02.27 |