반응형
쿠버의 아키텍처 돌아보기
마스터 노드
- kube-apiserver
- etcd cluster
- Controller Manager
- kube-scheduler
워커 노드
- Kubelet
워커노드의 Kublet은 Pod을 어떻게 배치할지에 대해 마스터노드의 Kube-apiserver에 의존
- 이 결정은 Kube-scheduler에서 내림
- 이것은 etcd에 저장됨
- 이 결정은 Kube-scheduler에서 내림
만약 마스터노드가 없다면?
워커노드 혼자서 떠있다면?
Kubelet 혼자서 노드를 독립적으로 관리하는 것은 가능하다!
이런 상황에서 Pod을 만드려고 한다면, kube-apiserver 없이 kublet에 어떻게 Pod definition file을 넣을것인가?
- kubelet이 특정 디렉토리에서 설정파일을 읽도록 설정할 수 있음
- 이렇게 설정하면, Kubelet이 설정파일을 읽은 뒤에 Pod 스펙에 맞게 노드에 Pod을 생성하고, 유지한다
- 이것을 Static Pod 이라고 함
- kubelet이 특정 디렉토리에서 설정파일을 읽도록 설정할 수 있음
근본적으로, 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
...
--pod-manifest-path
을 바꿔주면 된다.- 또는,
--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
- CRI-O:
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 노드의 설정파일을 날려야함
- Worker가 Cluster의 일원일 경우 Kublet은 kube-apiserver에 Static Pod의 mirror object를 생성하기 때문이다
# 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
해보면 알 수 있다
반응형
'콤퓨우터 > 필기: KodeKloud CKA 강의' 카테고리의 다른 글
84-87. Monitor Cluster Components, Managing Application Logs (0) | 2024.05.17 |
---|---|
80. Configuring Scheduler Profiles (0) | 2024.05.17 |
71. DaemonSet (0) | 2024.05.17 |
67. Resource Requests and Limits (0) | 2024.05.14 |
59-63. Taints, Tolerations, Node Selectors, Affinity (0) | 2024.05.14 |