Scheduling-Static Pods

2024. 12. 31. 16:42쿠버네티스/쿠버네티스

728x90
반응형

https://www.geeksforgeeks.org/careate-static-pod-in-kubernetes/

Static Pod는 Kubernetes의 컨트롤 플레인 없이도 개별 노드에서 실행할 수 있는 Pod입니다. 이는 kubelet이 직접 관리하며, Kubernetes API 서버나 스케줄러의 개입 없이 작동합니다. 아래는 Static Pod에 대한 주요 개념, 작동 방식, 생성 방법, 그리고 사용 사례를 정리한 내용입니다.

Static Pod란?

  • 독립적인 관리: Static Pod는 kubelet이 직접 관리하며, Kubernetes의 다른 컨트롤 플레인 구성 요소(API 서버, 스케줄러 등) 없이도 실행됩니다
  • Pod 정의 파일 기반: Static Pod는 특정 디렉토리에 저장된 Pod 정의 파일을 기반으로 kubelet이 생성 및 관리합니다.
  • Mirror Pod 생성: Static Pod가 생성되면, kubelet은 Kubernetes API 서버에 읽기 전용 Mirror Pod를 등록하여 클러스터 내에서 해당 Pod를 확인할 수 있도록 합니다
  • 제한된 기능: Static Pod는 ReplicaSet, Deployment, Service와 같은 고급 Kubernetes 리소스를 지원하지 않습니다. 이는 kubelet이 Pod 수준에서만 작동하기 때문입니다

Static Pod의 주요 특징

  1. 디렉토리 기반 관리:
    • kubelet은 설정된 디렉토리(예: /etc/kubernetes/manifests)를 주기적으로 확인하여 정의 파일을 읽고 Static Pod를 생성합니다.
    • 파일이 추가되면 새로운 Pod가 생성되고, 파일이 삭제되면 해당 Pod도 삭제됩니다
  2. 자동 복구:
  3. Mirror Pod:
    • Static Pod는 API 서버에 Mirror Pod로 등록되며, 이는 읽기 전용 상태로 클러스터 내에서 확인 가능합니다.
    • Mirror Pod의 이름은 원래 이름 뒤에 노드 이름이 붙어 표시됩니다(예: static-web-node01)
  4. kubectl 명령어 제한:
    • Static Pod는 API 서버를 통하지 않으므로 kubectl 명령어로 직접 제어할 수 없습니다.
    • 대신 docker ps 또는 crictl ps 명령어로 상태를 확인해야 합니다

Static Pod 생성 방법

  1. Pod 정의 파일 준비:
    YAML 형식으로 Static Pod의 정의 파일을 작성합니다.
apiVersion: v1
kind: Pod
metadata:
  name: static-nginx
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80

 

디렉토리에 배치:
정의 파일을 kubelet이 감시하는 디렉토리(예: /etc/kubernetes/manifests/)에 복사합니다.

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

 

파일 수정 및 삭제:

  • 정의 파일을 수정하면 kubelet이 자동으로 변경 사항을 반영하여 새로고침합니다.
  • 정의 파일을 삭제하면 해당 Static Pod도 자동으로 삭제됩니다

Static Pod의 주요 사용 사례

  1. 컨트롤 플레인 구성 요소 배포:
    • Kubernetes 클러스터의 초기화 시, API 서버, etcd, 컨트롤러 매니저와 같은 컨트롤 플레인 구성 요소를 Static Pod로 배포할 수 있습니다.
    • 예를 들어, kubeadm 도구는 이러한 방식을 사용하여 클러스터를 설정합니다
  2. 독립적인 서비스 실행:
    • 클러스터 외부에서 독립적으로 실행해야 하는 서비스(예: 네트워크 플러그인 또는 로깅 에이전트)를 배포할 때 유용합니다.
  3. 노드 수준 서비스 실행:
    • 특정 노드에서만 실행되어야 하는 애플리케이션을 배포하는 데 적합합니다.

항목 Static Pods DaemonSets
관리 주체 kubelet (API 서버 없음) DaemonSet 컨트롤러 (API 서버 필요)
배포 방식 지정된 디렉토리에 정의 파일 배치 API 서버를 통해 모든 적합한 노드에 배포
스케줄링 방식 스케줄러 비개입 (노드 고정) 스케줄러가 노드 선택
사용 사례 컨트롤 플레인 구성 요소 배포 클러스터 전역 서비스 배포 (예: 모니터링 에이전트)
kubectl 지원 여부 제한적 (Mirror Pod만 조회 가능) 완전한 제어 가능

 

 

https://www.reddit.com/r/kubernetes/comments/jthf7m/what_is_the_real_use_case_for_static_pods_in/?rdt=52271

https://themapisto.tistory.com/135

https://www.kubeblog.com/basics/exploring-static-pods/

https://kubernetes.io/docs/tasks/configure-pod-container/static-pod/

https://www.geeksforgeeks.org/careate-static-pod-in-kubernetes/

https://www.geeksforgeeks.org/careate-static-pod-in-kubernetes/

https://kubernetes.io/docs/tasks/configure-pod-container/static-pod/

Kubelet의 config 옵션 및 Static Pod 관련 설정

Kubernetes에서 kubelet은 노드에서 Pod를 실행하고 관리하는 핵심 구성 요소입니다. config 옵션은 kubelet의 설정을 YAML 또는 JSON 파일로 정의하여 관리할 수 있도록 해줍니다. 이를 통해 명령줄 플래그 대신 설정을 간소화하고 노드 배포를 쉽게 관리할 수 있습니다. 또한, Static Pod와 관련된 설정도 이 파일을 통해 구성할 수 있습니다.

Kubelet의 config 옵션

1. config 파일 경로 확인

  • kubelet의 설정 파일 경로는 kubelet 실행 시 사용된 명령줄 플래그에서 확인할 수 있습니다.
  • 다음 명령어를 사용하여 경로를 찾을 수 있습니다:
ps -aux | grep kubelet | grep config.yaml
  • 일반적으로 /var/lib/kubelet/config.yaml에 위치합니다.

2. config 파일 내용

  • config 파일은 kubelet의 다양한 매개변수를 설정하는 데 사용됩니다. 아래는 예제입니다:
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
staticPodPath: "/etc/kubernetes/manifests"
syncFrequency: "1m0s"
fileCheckFrequency: "20s"
httpCheckFrequency: "20s"
address: "192.168.1.16"
port: 10250
readOnlyPort: 10255
tlsCertFile: "/var/lib/kubelet/pki/kubelet.crt"
tlsPrivateKeyFile: "/var/lib/kubelet/pki/kubelet.key"
rotateCertificates: true
evictionHard:
  memory.available: "100Mi"
  nodefs.available: "10%"
  imagefs.available: "15%"

주요 필드 설명:

  • staticPodPath: Static Pod 정의 파일이 저장될 디렉토리 경로를 지정합니다(기본값은 /etc/kubernetes/manifests).
  • syncFrequency: kubelet이 상태를 동기화하는 주기를 정의합니다.
  • fileCheckFrequency: Static Pod 디렉토리를 확인하는 주기를 설정합니다.
  • evictionHard: 자원이 부족할 때 Pod를 제거하는 기준을 정의합니다.

3. Static Pod 설정

Static Pod는 API 서버 없이 kubelet이 직접 관리하는 Pod입니다. 이를 설정하려면 다음 단계를 따릅니다:

(1) Static Pod 디렉토리 확인:

  • staticPodPath 값으로 지정된 디렉토리를 확인합니다(기본값은 /etc/kubernetes/manifests).

(2) Static Pod 정의 파일 생성:

  • Static Pod 정의 파일을 해당 디렉토리에 생성합니다.
  • 예제 YAML 파일:
apiVersion: v1
kind: Pod
metadata:
  name: static-nginx
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80

(3) Static Pod 생성 및 관리:

  • 정의 파일을 /etc/kubernetes/manifests/에 복사하면 kubelet이 이를 감지하고 자동으로 Static Pod를 생성합니다.
  • 정의 파일 수정 시 변경 사항이 자동 반영되며, 삭제 시 해당 Static Pod도 삭제됩니다.

 

How many static pods exist in this cluster in all namespaces?

  • 보통 노드 이름끝네 "노드이름"이 붙는다. 아래 예는 총 4개의 static pod 존재

Which of the below components is NOT deployed as a static pod?

 
  • kube-apiserver
  • coredns
  • kube-controller-manager
  • etcd

What is the path of the directory holding the static pod definition files?

  • cat /var/lib/kubelet/config.yaml , staticPodPath부분보면 됨.
  • /etc/kubernetes/manifests/

How many pod definition files are present in the manifests directory?

ls /etc/kubernetes/manifests/
etcd.yaml  kube-apiserver.yaml  kube-controller-manager.yaml  kube-scheduler.yaml

 

What is the docker image used to deploy the kube-api server as a static pod?

  • kubectl describe pod kube-apiserver-controlplane -n kube-system

 

Create a static pod named static-busybox that uses the busybox image and the command sleep 1000

kubectl run static-busybox --image=busybox --restart=Never --dry-run=client -o yaml  --command -- sleep 1000 > static-busybox.yaml

cp static-busybox.yaml /etc/kubernetes/manifests/

kubectl get pod
NAME                          READY   STATUS    RESTARTS   AGE
static-busybox-controlplane   1/1     Running   0          10s

 

Edit the image on the static pod to use busybox:1.28.4

 

We just created a new static pod named static-greenbox. Find it and delete it.

  • rm /etc/kubernetes/manifests/static-busybox.yaml 

함정이있군요 node1으로 가야함

kubectl get node -o wide
#ip주소 알아내면
ssh <ip주소>
cat /var/lib/kubelet/config.yaml
#staticPodPath 위치 확인

  • rm /etc/just-to-mess-with-you/greenbox.yaml

반응형