정적 파드 만들기
정적 파드 만들기 (Create static Pods)
이 페이지는 노드에서 정적 파드(static Pod)를 만드는 방법을 보여드려요. 정적 파드가 무엇이고 언제 사용해야 하는지에 대한 개요는 정적 파드를 참고하세요.
출처: 문서
본문
시작하기 전에 (Before you begin)
쿠버네티스 클러스터가 필요하고, kubectl 명령줄 도구가 클러스터와 통신하도록 구성돼 있어야 해요. 이 튜토리얼은 컨트롤 플레인 호스트가 아닌 노드가 두 개 이상 있는 클러스터에서 실행하는 것을 권장해요. 아직 클러스터가 없다면 minikube로 만들거나 다음 쿠버네티스 플레이그라운드 중 하나를 사용할 수 있어요.
- iximiuz Labs
- Killercoda
- KodeKloud
버전을 확인하려면 kubectl version을 입력하세요. 이 페이지는 CRI-O를 사용해 Pod를 실행하고 노드가 Fedora 운영체제를 실행한다고 가정해요. 다른 배포판이나 쿠버네티스 설치에 대한 지침은 다를 수 있어요.
정적 파드 만들기 (Create a static pod)
정적 파드는 파일시스템 호스팅 구성 파일이나 웹 호스팅 구성 파일 중 하나로 구성할 수 있어요.
파일시스템 호스팅 정적 파드 매니페스트 (Filesystem-hosted static Pod manifest)
매니페스트는 특정 디렉터리의 JSON 또는 YAML 형식의 표준 Pod 정의예요. kubelet 구성 파일의 staticPodPath: <the directory> 필드를 사용하세요. kubelet은 그 디렉터리를 주기적으로 스캔하고, YAML/JSON 파일이 나타나면/사라지면 정적 파드를 생성/삭제해요. kubelet은 지정된 디렉터리를 스캔할 때 마침표로 시작하는 파일은 무시한다는 점을 주의하세요.
주의: kubelet은 정적 파드 디렉터리에서 마침표로 시작하지 않는 모든 파일을 처리해요. 파일 확장자로 필터링하지 않아요. 예를 들어
cp kube-apiserver.yaml kube-apiserver.yaml.backup으로 매니페스트의 백업을 만들면, kubelet이 두 파일을 모두 읽고 각각에서 정적 파드를 만들려고 시도해요. 두 파일이 같은 이름의 Pod를 정의하면 결과 동작은 정의되지 않으며, 백업의 구식 스펙이 현행 매니페스트 대신 조용히 적용될 수 있어요. 백업을 만들면 정적 파드 디렉터리 밖(예:/etc/kubernetes/backup/)에 저장하세요.
예를 들어 간단한 웹 서버를 정적 파드로 시작하는 방법은 이래요.
정적 파드를 실행할 노드를 선택해요. 이 예시에서는 my-node1이에요.
ssh my-node1
/etc/kubernetes/manifests 같은 디렉터리를 선택하고 그곳에 웹 서버 Pod 정의를 배치해요. 예를 들어 /etc/kubernetes/manifests/static-web.yaml:
# kubelet이 실행되는 노드에서 이 명령을 실행
mkdir -p /etc/kubernetes/manifests/
cat <<EOF >/etc/kubernetes/manifests/static-web.yaml
apiVersion: v1
kind: Pod
metadata:
name: static-web
labels:
role: myrole
spec:
containers:
- name: web
image: nginx
ports:
- name: web
containerPort: 80
protocol: TCP
EOF
그 노드에서 kubelet 구성 파일에 staticPodPath 값을 설정하도록 kubelet을 구성해요. 자세한 내용은 구성 파일을 통한 kubelet 매개변수 설정을 참고하세요.
대안적이고 폐기된 방법은 명령줄 인자를 사용해 그 노드의 kubelet이 로컬에서 정적 파드 매니페스트를 찾도록 구성하는 것이에요. 폐기된 방식을 사용하려면 --pod-manifest-path=/etc/kubernetes/manifests/ 인자로 kubelet을 시작하세요.
kubelet을 재시작해요. Fedora에서는 다음을 실행하면 돼요.
# kubelet이 실행되는 노드에서 이 명령을 실행
systemctl restart kubelet
웹 호스팅 정적 파드 매니페스트 (Web-hosted static pod manifest)
Kubelet은 --manifest-url=<URL> 인자로 지정된 파일을 주기적으로 다운로드하고, 그것을 Pod 정의를 포함하는 JSON/YAML 파일로 해석해요. 파일시스템 호스팅 매니페스트가 동작하는 방식과 비슷하게, kubelet은 일정에 따라 매니페스트를 다시 가져와요. 정적 파드 목록에 변경 사항이 있으면 kubelet이 이를 적용해요.
이 접근 방식을 사용하려면:
YAML 파일을 만들어 웹 서버에 저장해서 그 파일의 URL을 kubelet에 전달할 수 있게 해요.
apiVersion: v1
kind: Pod
metadata:
name: static-web
labels:
role: myrole
spec:
containers:
- name: web
image: nginx
ports:
- name: web
containerPort: 80
protocol: TCP
선택한 노드의 kubelet 구성 파일에 staticPodURL 필드를 포함시켜 이 웹 매니페스트를 사용하도록 kubelet을 구성해요.
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
staticPodURL: "<manifest-url>"
kubelet을 재시작해요. Fedora에서는 다음을 실행하면 돼요.
# kubelet이 실행되는 노드에서 이 명령을 실행
systemctl restart kubelet
정적 파드 동작 관찰하기 (Observe static pod behavior)
kubelet이 시작하면 정의된 모든 정적 파드를 자동으로 시작해요. 정적 파드를 정의하고 kubelet을 재시작했으므로 새 정적 파드가 이미 실행 중이어야 해요.
(노드에서) 다음을 실행해 실행 중인 컨테이너(정적 파드 포함)를 볼 수 있어요.
# kubelet이 실행되는 노드에서 이 명령을 실행
crictl ps
출력은 대략 다음과 같을 거예요.
CONTAINER IMAGE CREATED STATE NAME ATTEMPT POD ID
129fd7d382018 docker.io/library/nginx@sha256:... 11 minutes ago Running web 0 34533c6729106
참고:
crictl은 이미지 URI와 SHA-256 체크섬을 출력해요.NAME은docker.io/library/nginx@sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31처럼 보일 거예요.
API 서버에서 미러 파드를 볼 수 있어요.
kubectl get pods
NAME READY STATUS RESTARTS AGE
static-web-my-node1 1/1 Running 0 2m
참고: kubelet이 API 서버에서 미러 파드를 만들 권한이 있는지 확인하세요. 권한이 없다면 생성 요청이 API 서버에 의해 거부돼요.
정적 파드의 라벨은 미러 파드로 전파돼요. 그 라벨을 셀렉터 등을 통해 평소처럼 사용할 수 있어요.
kubectl로 API 서버에서 미러 파드를 삭제하려고 시도해도 kubelet은 정적 파드를 제거하지 않아요.
kubectl delete pod static-web-my-node1
pod "static-web-my-node1" deleted
파드가 여전히 실행 중인 것을 볼 수 있어요.
kubectl get pods
NAME READY STATUS RESTARTS AGE
static-web-my-node1 1/1 Running 0 4s
kubelet이 실행되는 노드로 돌아가 컨테이너를 수동으로 중지해 볼 수 있어요. 시간이 지나면 kubelet이 이를 알아차리고 Pod를 자동으로 재시작하는 것을 볼 수 있을 거예요.
# kubelet이 실행되는 노드에서 이 명령들을 실행
crictl stop 129fd7d382018 # 컨테이너 ID로 교체
sleep 20
crictl ps
CONTAINER IMAGE CREATED STATE NAME ATTEMPT POD ID
89db4553e1eeb docker.io/library/nginx@sha256:... 19 seconds ago Running web 1 34533c6729106
올바른 컨테이너를 식별하면 crictl로 그 컨테이너의 로그를 얻을 수 있어요.
# 컨테이너가 실행되는 노드에서 이 명령들을 실행
crictl logs <container_id>
10.240.0.48 - - [16/Nov/2022:12:45:49 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.47.0" "-"
10.240.0.48 - - [16/Nov/2022:12:45:50 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.47.0" "-"
10.240.0.48 - - [16/Nove/2022:12:45:51 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.47.0" "-"
crictl로 디버깅하는 방법에 대해 더 알아보려면 crictl로 쿠버네티스 노드 디버깅하기를 방문하세요.
정적 파드의 동적 추가 및 제거 (Dynamic addition and removal of static pods)
실행 중인 kubelet은 구성된 디렉터리(이 예시에서는 /etc/kubernetes/manifests)를 주기적으로 스캔해 파일이 나타나면/사라지면 Pod를 추가/제거해요.
# 이는 파일시스템 호스팅 정적 파드 구성을 사용한다고 가정
# 컨테이너가 실행되는 노드에서 이 명령들을 실행
mv /etc/kubernetes/manifests/static-web.yaml /tmp
sleep 20
crictl ps
# nginx 컨테이너가 실행 중이지 않음을 볼 수 있음
mv /tmp/static-web.yaml /etc/kubernetes/manifests/
sleep 20
crictl ps
CONTAINER IMAGE CREATED STATE NAME ATTEMPT POD ID
f427638871c35 docker.io/library/nginx@sha256:... 19 seconds ago Running web 1 34533c6729106
다음 단계 (What's next)
- 정적 파드
- 컨트롤 플레인 컴포넌트용 정적 파드 매니페스트 생성
- 로컬 etcd용 정적 파드 매니페스트 생성
crictl로 쿠버네티스 노드 디버깅하기crictl에 대해 더 배우기- kubelet이 관리하는 정적 파드로 etcd 인스턴스 설정하기