2021. 5. 25. 10:37ㆍContainer/kubernetes
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단계로 배우는 도커와 쿠버네티스에서 참고하였습니다.
'Container > kubernetes' 카테고리의 다른 글
| 쿠버네티스 ( kubernetes ) - 컨트롤러( Controller ) (0) | 2021.05.25 |
|---|---|
| 쿠버네티스 ( kubernetes ) - 서비스( Service )와 클러스터 네트워크 (0) | 2021.05.25 |
| 쿠버네티스(kubernetes)의 기본개념에 관하여... (0) | 2021.05.25 |
| 컨테이너의 이해 (0) | 2021.05.25 |
| 쿠버네티스란? (0) | 2021.05.25 |