쿠버네티스 ( kubernetes ) - 파드( Pod )

2021. 5. 25. 10:37Container/kubernetes

728x90
반응형

1. 파드란 ?

 

 - k8s에서 컨테이너를 실행하는 최소 단위 혹은 여러 개의 컨테이너를 포함

 - 하나의 파드에 속하는 모든 컨테이너들은 같은 노드에서 동작

 

 

2. 컨테이너 재사용 촉진을 위한 플랫폼

  • 파드 내부 컨테이너들은 파드의 IP주소와 포트번호를 공유한다.
  • 파드 내부 컨테이너들은 localhost 서로 통신할 있다.
  • 파드 내부 컨테이너들은 System V 프로세스 통신이나 POSIX 공유 메모리를 사용 서로 통신 가능하다.
  • 파드 내부 컨테이너들은 파드의 볼륨 마운트하여 파일 시스템을 공유할 있다.

파드 안에 컨테이너만 가능하며 , 다른 파드에 있는 컨테이너와는 불가능하다.

 

3. 파드는 일시적인 존재

  • 일시적인 존재로 이미지로부터 매번 생성 같은 오브젝트 이름으로 몇번이고 파드를 기동해도 이전에 컨테이너에서 수행한 변경 이력은 남지 않고, 이미지의 초기상태에서 시작할 뿐이다.
  • IP주소가 고정적이지 않다. 재기동시 다른 IP 부여됨. 파드에 요청을 보내고 싶을 경우에는 반드시 서비스를 사용해야한다.

 

4. 파드는 컨테이너의 실행 상태를 관리

  • 파드가 정지한 경우에는 담당 컨트롤러가 재기동 등의 정해진 처리를 수행
  • 파드 내부의 컨테이너가 정지한 경우 파드가 해당 컨테이너를 재시작
  • 설정에 따라선 정지한 컨테이너를 그대로 유지한 로그를 참조할 있음
  • 활성프로브 (Liveness Probe) 준비 상태 프로브 ( Readiness Probe ) 설정하여 내부 에플리케이션 상태를 감시할 있다.

 

5. 파드는 초기화 전용 컨테이너를 실행

  • 초기화만 담당하는 컨테이너를 설정할수 있다. 그러면 파드가 기동된 초기화 담당 컨테이너가 제일 먼저 실행되며, 초기화가 끝나면 핵심 기능을 수행하는 컨테이너들이 실행된다.

 

6. 파드의 라이플 사이클

  • k8s 트러블 슈팅 가장 많이 발생하는 것이 파드의 기동 실패 원인 분석이다.
  • 문제를 파악하기 위해서는 'kubectl get pods' 실행 하여 status열의 정보를 얻는것이 중요하다.

( status 열의 정보는 Kubernetes API 통해 획득한다. )

 

kubectl get pods 표시되는 status 의미

 

Status 의미와 대책
ContainerCreating 이미지를 다운로드중이거나, 컨테이너 생성을 의미 또는 컨피그맵과 시크릿이 마운트 되지않아 컨테이너 생성이 보류된 경우
CrashLoopBackoff 파드 내의 컨테이너가 종료되어 다음 기동 시까지 대기 상태에 있음을 의미한다. 2회이상 컨테이너가 종료되면, CrashLoopBackOff 시간 동안 대기하게 된다. 상황에서는 컨테이너 내의 프로세스를 재검토할 필요가 있다.
Pending 파드 생성요구를 받았지만 하나 이상의 컨테이너가 생성되지 않은 상태를 의미한다. 리소스 부족등의 이유로 스케줄이 되지 않은 경우에 해당된다.
Running 파드의 모든 컨테이너가 생성되어 실행 중임을 의미한다.
Terminating 컨테이너에 종료 요청 시그널을 보낸후 컨테이너가 종료할 때까지 대기중임을 의미한다. 유예시간을 넘겨도 컨테이너가 종료 없는 경우는, 컨테이너를 강제종료한다.
Succeeded 파드 모든 컨테이너가 정상적으로 종료했음을 의미한다.
Completed 파드 컨테이너가 정상적으로 종료되었음을 의미한다. 파드 내에 복수의 컨테이너가 있는 경우, 번째 컨테이너가 정상종료( Exit 코드 = 0 )하면 Completed 표시된다.
Error 컨테이너가 이상 종료 경우다. Exit 코드 0 경우에 이상 종료로 간주한다. 파드 내에 복수의 컨테이너가 있는 경우, 번재 컨테이너가 이상 종료 하면 Error 표시된다.
Failed 파드 내에 적어도 하나의 컨테이너가 이상 종료 했음을 의미한다.
Unknown 파드의 상태를 얻을 없는 상황을 의미한다.

 

7. 파드의 종료처리 흐름

  • 사용자가 kubectl delete pod 실행하면 종료처리가 시작되며 기본 유예 시간은 30초이다.
  • kubectl get pod status Terminating이라고 표시된다.
  • 다음은 가지 작업이 동시에 진행된다.

 

파드의 PreStop hook 정의되어 있으면, 파드내에서 호출된다. 유예시간을 넘어서면 Prestop hook 실행되고 있어도, 파드 내의 메인 프로세스에 SIGTERM 보내지며, 2초후에 SIGKILL 강제종료된다.

Prestop hook 정의되어 있지않으면, 곧바로 파드 내의 메인 프로세스에 SIGTERM신호가 송신되며 종료처리가 개시된다.

파드가 서비스 엔드포인트 목록에서 제거되며, 로드 밸런서(kube-proxy ) 목록에서도 제거된다.

유예시간을 넘어서서 파드 내의 프로세스가 살아 있다면, 파드의 메인 프로세스에 SIGKILL 보내어 강제 종료한다.

제거 대상인파드가 표시 되지 않게 된다.

 

kubectl delete 실행 할때 옵션 '--grace-period='를 통해 유예 시간을 별도로 지정할 있다. 여기에 0 설정하면 즉시 파드를 제거한다

 

출저 : 15단계로 배우는 도커와 쿠버네티스에서 참고하였습니다.

728x90
반응형