쿠버네티스의 컨트롤 플레인 노드에 있는 kube-scheduler
는 파드가 생성되면 파드를 적절한 노드로 스케줄링한다. 하지만 kube-scheduler
가 없다면(장애가 난다면), 또는 kube-apiserver
가 없다면 파드를 생성하거나 스케줄링을 할 수 없다.
하지만 kube-scheduler
, kube-apiserver
의 도움 없이 파드를 배포할 수도 있다. 실제로 파드를 직접 배포하는 컴포넌트는 각 노드에서 구동 중인 kubelet
이기 때문이다. (사실은 kube-apiserver
가 kubelet
에게 파드가 생성되었으니 파드를 배포시키라고 지시한다.)
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-scheduler
와 kube-apiserver
에 의해 배포되는 파드가 아니기 때문에 etcd에 저장되지 않을 것이라고 생각될 수 있다. 하지만 우리는 Static pod를 kubectl로 조회할 수 있다! 그 이유는 kubelet
이 Static pod를 생성하면 kube-apiserver
가 Static pod에 대한 mirror object 를 생성한다. 이 오브젝트는 read-only 라서 조회만 가능할 뿐 Static Pod를 apiserver를 통해 편집하거나 삭제할 수 없다고 한다.
실제로 파드의 이미지를 편집하려고 하면 되긴 되는데 mirror object가 편집되어 kubectl describe
와 kubectl 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)
'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 |
댓글