콤퓨우터/필기: KodeKloud CKA 강의

74. Static Pods

파란화면 2024. 5. 17. 00:20
반응형

쿠버의 아키텍처 돌아보기

  • 마스터 노드

    • kube-apiserver
    • etcd cluster
    • Controller Manager
    • kube-scheduler
  • 워커 노드

    • Kubelet
  • 워커노드의 Kublet은 Pod을 어떻게 배치할지에 대해 마스터노드의 Kube-apiserver에 의존

    • 이 결정은 Kube-scheduler에서 내림
      • 이것은 etcd에 저장됨

만약 마스터노드가 없다면?

워커노드 혼자서 떠있다면?

  • Kubelet 혼자서 노드를 독립적으로 관리하는 것은 가능하다!

    이런 상황에서 Pod을 만드려고 한다면, kube-apiserver 없이 kublet에 어떻게 Pod definition file을 넣을것인가?

    • kubelet이 특정 디렉토리에서 설정파일을 읽도록 설정할 수 있음
      • 이렇게 설정하면, Kubelet이 설정파일을 읽은 뒤에 Pod 스펙에 맞게 노드에 Pod을 생성하고, 유지한다
      • 이것을 Static Pod 이라고 함

근본적으로, Kubelet은 오직 Pod만 아는 친구이다

  • 따라서 Static하게 ReplicaSet, Deployment, Service 등을 생성하는 것은 불가능 - 오직 Pod만 이 방식으로 생성할 수 있다

그 디렉토리는 어떻게 설정하는가?

Kubelet의 systemd 서비스에서,

ExecStart=/usr/local/bin/kubelet \\
  ...
  --pod-manifest-path=/etc/Kubernetes/manifests
  또는
  --config=/path/to/config-file.yaml
  ...
  1. --pod-manifest-path을 바꿔주면 된다.
  2. 또는, --config=/path/to/config-file.yaml 같은 식으로 설정파일의 경로를 주고, 해당 설정파일에서 staticPodPath: /path/to/definition-file/ 같은 식으로 선언할 수도 있다.

kubeadmintool로 클러스터를 설정하는 경우 이 방식으로 설정됨

controlplane ~ ➜  ps -ef | grep kubelet
root        4312       1  0 20:00 ?        00:00:22 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --config=/var/lib/kubelet/config.yaml --container-runtime-endpoint=unix:///var/run/containerd/containerd.sock --pod-infra-container-image=registry.k8s.io/pause:3.9

이렇게 만들어진 Static Pod를 어떻게 확인하는가

당연히 지금은 kube-apiserver가 없기 때문에, kubectl이 작동하지 않는다

  • 쿠버가 사용하는 컨테이너 런타임 (CRI-O, Containerd, Docker)의 컨테이너 조회 명령어를 직접 입력하여 확인
    • CRI-O: crictl ps
    • ContainerD: nerdctl ps
    • Docker: docker ps

Static Pod와 Kube-Apiserver 관할의 Pod의 공존

Kubelet은 기본적으로

  • 먼저 Static Pods 설정파일 폴더를 보고, 그 다음에
  • HTTP API 엔드포인트를 통해 Pod 입력을 받는다.
    • Kube-apiserver는 이 API를 통해 Pod을 생성한다.

따라서 이 둘은 공존할 수 있다.

그렇다면 Kube-apiserver는 Static Pod을 알고 있는가?

  • ㅇㅇ (Worker가 Master에 연결된 경우)
  • 어떻게?
    • Worker가 Cluster의 일원일 경우 Kublet은 kube-apiserver에 Static Pod의 mirror object를 생성하기 때문이다
      • Read-only mirror or pod
      • kube-apiserver에서는 상태만 볼 수 있고, 편집 또는 삭제는 불가
        • 삭제하려면 직접 Worker 노드의 설정파일을 날려야함
# kubectl get pods -A -o wide
NAMESPACE      NAME                                   READY   STATUS    RESTARTS   AGE   IP             NODE           NOMINATED NODE   READINESS GATES
kube-flannel   kube-flannel-ds-868vm                  1/1     Running   0          18m   192.30.156.6   node01         <none>           <none>
kube-flannel   kube-flannel-ds-rzqmb                  1/1     Running   0          18m   192.30.156.3   controlplane   <none>           <none>
kube-system    coredns-69f9c977-44dph                 1/1     Running   0          18m   10.244.0.2     controlplane   <none>           <none>
kube-system    coredns-69f9c977-9csqs                 1/1     Running   0          18m   10.244.0.3     controlplane   <none>           <none>
kube-system    etcd-controlplane                      1/1     Running   0          18m   192.30.156.3   controlplane   <none>           <none>
kube-system    kube-apiserver-controlplane            1/1     Running   0          18m   192.30.156.3   controlplane   <none>           <none>
kube-system    kube-controller-manager-controlplane   1/1     Running   0          18m   192.30.156.3   controlplane   <none>           <none>
kube-system    kube-proxy-gj98n                       1/1     Running   0          18m   192.30.156.3   controlplane   <none>           <none>
kube-system    kube-proxy-tcpd4                       1/1     Running   0          18m   192.30.156.6   node01         <none>           <none>
kube-system    kube-scheduler-controlplane            1/1     Running   0          18m   192.30.156.3   controlplane   <none>           <none>

그래서 이걸 엊다 쓰는가

Control Plane 컴포넌트를 노드에 Pod 형태로 디플로이하기 위해 Static Pod를 사용할 수 있다

  • 우선 마스터 노드에 Kubelet을 깐다
  • 매니페스트 디렉토리에 쿠버 마스터노드의 각 구성요소 - kube-apiserver, controller-manager, etcd 를 Pod화한 yaml파일을 넣는다
  • ???
  • PROFIT!!!

kubeadm은 바로 이 방식을 통해 쿠버네티스 클러스터를 구성한다

  • kubectl get pods -n kube-system 해보면 알 수 있다
반응형