1. 파드 개념

  • 파드는 쿠버네티스가 관리하는 컨테이너 묶음
  • 파드에 속한 컨테이너들은 하나의 노드 안에서 실행되고 자원을 공유함

2. 파드 사용

파드의 템플릿 설정 예시 - pod-sampel.yaml

Info Notice: 여기에서 템플릿은 오브젝트나 컨트롤러가 어떤 상태여야 하는지 젹용할 때 사용하는 yaml 파일을 의미

apiVersion: v1
kind: Pod
metadata:
  name: kubernetes-simple-pod
  labels:
    app: kubernetes-simple-pod
spec:
  containers:
  - name: kubernetes-simple-pod
    image: arisu1000/simple-container-app:latest
    ports:
    - containerPort: 8080
항목 설명
.metadata.name 파드 이름
.metadata.labels.app 오브젝트 식별 레이블
.spec.containers[].name 컨테이너 이름 설정
.spec.containers[].image 컨테이너에서 사용할 이미지
.spec.containers[].ports[].containerPort 컨테이너 접속용 포트

아래 명령으로 파드를 실행

kubectl apply -f pod-sample.yaml

3. 파드 생명 주기

파드 생성 부터 삭제까지 생명 주기는 아래 5가지로 정의

항목 설명
Pending 파드 생성 중
Running 파드 안 컨테이너가 실행 중
Succeeded 파드 안 컨테이너가 정상 종료
Failed 파드 안 컨테이너 중 비정상적으로 종료되지 않는 상태
Unknown 파드 상태 할 수 없음

파드 상태는 kubectl describe pods 파드명 실행 후 Status 항목으로 확인 가능

파드 Conditions 항목은 파드의 현재 상태 정보로 Type과 Status로 구분되어 있음

항목 설명
Initialized 모든 초기화 컨테이너가 성공적으로 시작 완료
Ready 요청을 수행할 수 있음
ContainersReady 파드 안 컨테이너가 준비상태
PodScheduled 파드가 하나의 노드로 스케쥴 완료 상태
Unschedulable 제약으로 당장 파드를 스케쥴 할 수 없음

4. kubelet으로 컨테이너 진단

컨테이너 실행 후에는 kubelet이 컨테이너를 주기적으로 진단함

Probe
컨테이너 진단에 2가지 프로브 필요

  • livenessProbe: 컨테이너가 실행됐는지 확인. 진달 실패시 컨테이너 재시작
  • readinessProbe: 컨테이너가 실행된 후 서비스 요청에 응답할 수 있는지 진단

Handler
컨테이너 진단은 kubelet이 컨테이너가 구현한 아래 세가지 유형의 핸들러를 호출하여 실행

  • ExecAction: 컨테이너 안에 지정된 명령 수행
  • TCPSocketAction: 컨테이너 안에 지정된 IP와 포트로 TCP 상태 확인
  • HTTPGetAction: 컨테이너 안에 지정된 IP와 포트로 HTTP GET 요청 보냄

진단결과
진단 결과는 세 가지로 구분

  • Success: 컨테이너가 진달에 성공
  • Failure: 컨테이너가 진단에 실패
  • Unknown: 컨테이너 상태 알 수 없음

5. 컨테이너 유형

5.1 초기화 컨테이너

  • 앱 컨테이너 실행 전 파드를 초기화
  • 여러개 구성 가능하고 탬플릿(yaml) 명시한 순서대로 초기화 실행
  • 초기화 컨테이너는 실행 실패 시 성공할 때까지 재시작
  • readinessProbe 지원하지 않음
apiVersion: v1
kind: Pod
metadata:
  name: kubernetes-simple-pod
  labels:
    app: kubernetes-simple-pod
spec:
  initContainers:
  - name: init-myservice
    image: arisu1000/simple-container-app:latest
    command: ['sh', '-c', 'sleep 2; echo helloworld01;']
  - name: init-mydb
    image: arisu1000/simple-container-app:latest
    command: ['sh', '-c', 'sleep 2; echo helloworld02;']
  containers:
  - name: kubernetes-simple-pod 
    image: arisu1000/simple-container-app:latest
    command: ['sh', '-c', 'echo The app is running! && sleep 3600']

5.2 파드 인프라 컨테이너

  • 모든 파드에서 항상 실행되는 pause 컨테이너
  • 파드 안에 기본 네트워크로 실행
  • kubelet에 –pod-infra-container-image 옵션으로 지정 가능

5.3 스태틱 파드

  • kube-apiserver를 통하지 않고 kubelet이 직접 실행하는 파드
  • kubelet 옵션 중 –pod-manifest-path에 지정한 디렉토리에 스태딕 파드 탬플릿을 두면 kebelet이 스태틱 파드로 실행
  • 스태틱 파드 예 : mac 환경에 설치된 docker-desktop에서 아래 스크립트를 통해 스태틱 파드 탬플릿 확인 가능
~# screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty
[Enter 입력]
docker-desktop:~# cd /etc/kubernetes/manifests 
docker-desktop:~# ls -alF

6. Pod 정보 확인

kubectl describe pods whms-pod 

Name:         whms-pod
Namespace:    default
Priority:     0
Node:         minikube/192.168.99.100
Start Time:   Mon, 17 Aug 2020 06:02:37 +0000
Labels:       app=whms-pod
Annotations:  Status:  Running
IP:           172.17.0.3
IPs:
  IP:  172.17.0.3
Containers:
  whms-pod:
    Container ID:   docker://600c885e88a717f651d3b25de5295fc96541565e102772eed8cc145f9a78c616
    Image:          sftth/whms:latest
    Image ID:       docker-pullable://sftth/whms@sha256:bf79e4c73874e98f64347251428eca9e75d4dfb378ccdf4a630d52a746dbbd30
    Port:           8080/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Mon, 17 Aug 2020 06:05:13 +0000
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-7qmh7 (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  default-token-7qmh7:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-7qmh7
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:          <none>

Conditions

Type

정보 설명
Initialized 초기화 컨테이너가 성공적으로 시작 완료
Ready 요청 실행 가능, 로드배런싱 풀에 추가 필요
ContainerReady 모든 컨테이너가 준비 상태
PodScheduled 파드가 하나의 노드로 스케쥴을 완료
Unschedulable 자원 부족, 기타 제약으로 지금 파드를 스케쥴 할 수 없음

Status

  • True, False, Unknown 값을 출력

댓글남기기