backend/kubernetes docs

[kubernetes docs] Pod lifecycle & init container

seul chan 2020. 6. 4. 20:13

Pod Lifecycle

Pod phase (파드의 단계)

pod의 status 필드는 PodStatus 오브젝트로 정의됨

  • Pending: 파드가 쿠버네티스 시스템에 의해서 승인되었지만, 파드를 위한 하나 또는 하나 이상의 컨테이너 이미지 생성이 아직 완료되지 않았다. 여기에는 스케줄되기 이전까지의 시간 뿐만 아니라 오래 걸릴 수 있는 네트워크를 통한 이미지 다운로드 시간도 포함된다.
  • Running :파드가 한 노드에 결합되었고, 모든 컨테이너들의 생성이 완료되었다. 적어도 하나의 컨테이너가 동작 중이거나, 시작 또는 재시작 중에 있다.
  • Succeeded: 파드에 있는 모든 컨테이너들이 성공으로 종료되었고, 재시작되지 않을 것이다.
  • Failed: 파드에 있는 모든 컨테이너들이 종료되었고, 적어도 하나 이상의 컨테이너가 실패로 종료되었다. 즉, 해당 컨테이너는 non-zero 상태로 빠져나왔거나(exited) 시스템에 의해서 종료(terminated)되었다.
  • Unknown: 어떤 이유에 의해서 파드의 상태를 얻을 수 없다. 일반적으로 파드 호스트와의 통신 오류에 의해서 발생한다.

Pod condition (파드의 조건)

Container probe

Probe는 컨테이너에서 kubelet에 의해 주기적으로 수행되는 diagnostic

진단을 위해서 kubelet은 핸들러를 호출한다. 핸들러의 타입은 다음 3가지

  • ExecAction: 지정된 명령어 실행. 0으로 종료되면 성공으로 간주
  • TCPSocketAction: 지정된 포트에서 컨테이너의 IP 주소에 대해 TCP 검사 수행.
  • HTTPGetAction: 지정된 포트 및 경로에서 컨테이너의 IP 주소에 대해 HTTP Get 요청 수행. status code가 200보다 크도 400보다 작으면 성공으로 진단

probe의 결과는 3가지

  • Success
  • Failure
  • Unknown

kubelet은 실행중인 컨테이너들에 대해 선택적으로 세가지 종류의 probe를 수행 가능

  • livenessProbe: 컨테이너가 동작 중인지 여부. liveness probe에 실패한다면 kubelet은 컨테이너를 죽이고 재시작 정책의 대상이 됨. 만약 이를 제공하지 않으면 기본 상태는 Success
  • readnessProbe: 컨테이너가 요청을 처리할 준비가 되었는지 여부. readness probe 실패시 pod에 관련된 모든 서비스들의 endpoint에서 pod의 IP 주소를 제거.
  • startupProbe: 컨테이너 내의 애플리케이션이 시작되었는지를 나타냄. startup probe가 주어진 경우 성공할 때까지 나머지 probe가 활성화 되지 않는다.

언제 각각의 probe를 사용하면 되는지는 kubernetes 문서 참고

재시작 정책

PodSpec은 restartPolicyAlways, OnFailure, Never로 설정. default는 Always

Pod lifetime

일반적으로 pod는 사람, 혹은 controller가 명시적으로 pod를 삭제할 때 까지 남아있음

다양한 리소스가 있는데 다음 상황에서 사용

  • 예를 들어 웹 서버와 같이 종료되지 않을 것으로 예상되는 파드용 디플로이먼트(Deployment), 레플리카셋(ReplicaSet) 또는 스테이트풀 셋(StatefulSet)을 사용한다.
  • 배치 연산과 같이, 종료가 예상되는 파드를 위해서는 잡(Job)을 사용하길 바란다. 잡은 restartPolicy가 실패 시(OnFailure) 또는 절대 안 함(Never)으로 지정된 경우에 적합하다.
  • 적합한 노드 당 하나씩 실행해야 하는 파드에는 데몬셋(DaemonSet)을 사용한다.

Init container

initContainer는 pod 안의 container 중 가장 먼저 실행됨. initContainer가 실행되지 못하면 pod가 실행되지 않는다.

initContainer 코드는 멱등성(indempotent)을 유지해야함

initContainer 예시

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:
  containers:
  - name: myapp-container
    image: busybox:1.28
    command: ['sh', '-c', 'echo The app is running! && sleep 3600']
  initContainers:
  - name: init-myservice
    image: busybox:1.28
    command: ['sh', '-c', "until nslookup myservice.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for myservice; sleep 2; done"]
  - name: init-mydb
    image: busybox:1.28
    command: ['sh', '-c', "until nslookup mydb.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for mydb; sleep 2; done"]