본문 바로가기
DevOps/Kubernetes

쿠버네티스 Static Pods

by 비어원 2022. 7. 16.
728x90

쿠버네티스의 컨트롤 플레인 노드에 있는 kube-scheduler 는 파드가 생성되면 파드를 적절한 노드로 스케줄링한다. 하지만 kube-scheduler가 없다면(장애가 난다면), 또는 kube-apiserver가 없다면 파드를 생성하거나 스케줄링을 할 수 없다.

 

하지만 kube-scheduler, kube-apiserver 의 도움 없이 파드를 배포할 수도 있다. 실제로 파드를 직접 배포하는 컴포넌트는 각 노드에서 구동 중인 kubelet이기 때문이다. (사실은 kube-apiserverkubelet 에게 파드가 생성되었으니 파드를 배포시키라고 지시한다.)

 

kube-apiserver 가 시키지 않고도 kubelet 이 스스로 파드를 배포하게 만들 수 있다. 노드의 /etc/kubernetes/manifests 디렉터리에 파드 매니페스트 파일을 추가하면 kubelet이 해당 디렉터리를 지속적으로 감시하여 매니페스트 파일에 정의되어있는 desired state로 만드려고 한다. (파드를 지속적으로 유지시킨다.) 이러한 파드를 Static Pod 라고 한다.

Static Pod - Control Plane

kubelet은 /etc/kubernetes/manifests 디렉터리에 정의된 매니페스트 파일을 통해 Static Pod를 생성한다. 그리고 Static Pod를 생성하면 자동으로 Pod이름 뒤에 -{nodename} 이 붙는다. 그래서 이름 만으로 어떤 파드가 Static Pod로 배포되었는지 알 수 있다.

 

실제로 쿠버네티스 컨트롤플레인 컴포넌트들은 Static Pod로 배포된다.

실제로 컨트롤플레인 노드애 접속하여 /etc/kubernetes/manifests 파일목록을 확인해보면 아래와 같다.

 

Static Pod 생성

그러면 직접 Static Pod를 생성해보자. /etc/kubernetes/manifests 에 파드 yaml파일을 만들어주기만 하면 된다.

/etc/kubernetes/manifests/nginx-static.yaml

apiVersion: v1
kind: Pod
metadata:
  labels:
    app: nginx-static
  name: nginx-static
spec:
  containers:
  - image: nginx:alpine
    name: nginx
  restartPolicy: Always

 

일정 시간이 흐르고 파드를 조회하면 Static Pod가 배포됨을 알 수 있다.

$ kubectl get po
NAME                   READY   STATUS    RESTARTS   AGE
nginx-static-k8s-cp1   1/1     Running   0          83s

 

kube-apiserver와 Static Pod

Static Pod는 kube-schedulerkube-apiserver 에 의해 배포되는 파드가 아니기 때문에 etcd에 저장되지 않을 것이라고 생각될 수 있다. 하지만 우리는 Static pod를 kubectl로 조회할 수 있다! 그 이유는 kubelet 이 Static pod를 생성하면 kube-apiserver 가 Static pod에 대한 mirror object 를 생성한다. 이 오브젝트는 read-only 라서 조회만 가능할 뿐 Static Pod를 apiserver를 통해 편집하거나 삭제할 수 없다고 한다.

 

실제로 파드의 이미지를 편집하려고 하면 되긴 되는데 mirror object가 편집되어 kubectl describekubectl get -o yaml 명령어로 조회했을 때 편집된 결과가 나오지만 파드가 다시 띄워지지는 않는다.

$ kubectl set image pod/nginx-static-k8s-cp1 nginx=nginx:1.17
pod/nginx-static-k8s-cp1 image updated

 

실제로 조회해보면 spec의 이미지는 변경되었지만 status의 실제 컨테이너 이미지는 변경되지 않았다. 오류가 안나도 어 편집 되네? 하고 속으면 안된다. (1.24.1 버전 기준으로는 그렇다.)

$ kubectl get po -o custom-columns='NAME:.metadata.name,IMAGE:.spec.containers[0].image,ACTUAL_IMAGE:.status.containerStatuses[0].image'
NAME                   IMAGE        ACTUAL_IMAGE
nginx-static-k8s-cp1   nginx:1.17   docker.io/library/nginx:alpin

 

명령어로 삭제하면 삭제는 되긴 되지만 디플로이먼트가 관리하는 파드처럼 자동 재배포된다. 그래서 Static Pod를 apiserver를 통해 편집하거나 삭제할 수 없다 고 하는 것이다. 명령어로 되긴 되지만 실제로는 안된다.

 

Use Case

Static Pod는 쿠버네티스 컨트롤 플레인에 의존하지 않는 파드를 배포할 때 사용하면 된다. (컨트롤플레인 그 자체도 그렇게 만들어짐.)

 

기타 설정

  • kubelet 이 구동될 때 --pod-manifest-path 옵션에 의해 kubelet이 감시할 디렉터리가 결정된다. (default: /etc/kubernetes/manifests)  
728x90

'DevOps > Kubernetes' 카테고리의 다른 글

[2] 쿠버네티스 클러스터 설치  (0) 2023.02.25
[10] 쿠버네티스 Ingress  (0) 2022.07.21
[9] 쿠버네티스 볼륨  (0) 2022.02.20
[8] 쿠버네티스 서비스  (0) 2022.02.09
[7] 쿠버네티스 디플로이먼트  (0) 2022.01.23

댓글