[Kubernetes] 3.파드는 언제든지 죽을 수 있다.

2 minute read

파드는 쿠버네티스의 최소 단위이다.

컨테이너 인프라 환경 구축을 위한 쿠버네티스/도커 도서를 읽고 정리한 내용입니다.

<kubenetes 기초 활용: Kubenetes 완벽 이해 1탄> 강의를 듣고 정리한 내용입니다.

파드(Pods)

파드는 쿠버네티스에서 생성하고 관리할 수 있는 배포 가능한 가장 작은 컴퓨팅 단위이다.

파드는 애플리케이션의 구성요소이다.

파드는 클러스터에서 실행 중인 컨테이너의 집합이다.

파드는 단일 목적을 위한 하나 이상의 컨테이너의 집합이다.

파드 당 하나의 컨테이너를 사용하는 모델이 일반적이다.

  • 특징
    • 한 개 이상의 컨테이너 실행
    • 동일 노드에 할당
    • IP 공유
    • Node IP와 별개의 고유 IP
    • 다른 Pod 에서 NAT 없이 직접 접근
    • 로컬 volume 공유

파드는 언제든지 죽을 수 있다.

수명 주기 중 단 한번만 노드에 스케줄 된다.

오류, 업데이트 등 상태 변화가 생기면 kubelet에 의해 죽고 새로 실행된다.

  • Container State

WaitingRunningTerminated

  • Container Probe

파드 내 컨테이너에서 kubelet가 파드의 상태를 확인하기위해 주기적으로 수행되는 진단(diagnostic)이다.

self-healing

단일 파드가 아니라, 디플로이먼트의 레플리카셋에 의해 관리되고 있는 파드에 해당된다.

파드 내부에서 kill 명령어를 통해 파드를 죽이면 곧 다시 실행된다.

파드 외부에서 delete pod 로 삭제하면 곧 다시 실행된다.

다시 실행된 파드는 삭제된 파드와 다른 파드이며 새롭게 스케줄된다.

delete deployment를 통해 해당 파드가 속한 상위 디플로이먼트를 삭제하면 파드도 함께 삭제된다.

파드 만들기

일반적으로 파드는 직접 만들지 않는다.

디플로이먼트(Deployment)나 잡(Job)과 같은 워크로드 리소스를 사용하여 파드를 생성한다.

파드를 생성하는 방법에는 크게 세가지가 있다.

  • kubectl run *
  • kubectl create *
  • kubectl apply -f *.yaml

apply 명령어를 이용해 디플로이먼트 그룹 안에 관리되도록 파드를 생성하는 것이 일반적이다.

yaml 정의서 (앱 정의서)

apiVersion: v1 # scope 정의, java package
kind: Pod # 리소스 타입 정의, java class
metadate: # 메타정보
	labels: # 라벨정보
		run: mynginx # 라벨 key:value
	name: mynginx # 리소스의 이름
spec: # 리소스 정의
	containers: # 컨테이너 정의
	- name: nginx # 컨테이너의 이름, - : 리스트를 표현
		image: nginx # 컨테이너의 이미지
  • yaml 통해 pod 생성하기
    • apply 선언형 명령 방식으로 pod 생성
kubectl apply -f {file name}.yaml

ex.

apiVersion: app/v1
kind: Deployment
metadata:
	name: hello
	labels: 
		app: nginx
spec:
	replicas: 3
	selector:
		matchLabels:
			app: nginx
	template:
		metadata:
			labels:
				app: nginx
		# begin of PodTemplate
		spec:
			containers:
      - name: hello
				image: helloimage
				command: []
			restartPolicy: OnFailure
		# end of PodTemplate

위와 같이 정의된 yaml 파일이 있을 때, 다음 명령어로 디플로이먼트를 만들고 그 안에 파드를 생성할 수 있다.

kubectl apply -f helloDeployment.yaml

즉석 Pod 리소스 생성

cat << EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: mynginx
  name: mynginx
spec:
  containers:
  - name: nginx
    image: nginx
    - containerPort: 80
EOF

Pod LifeCycle


Reference