pod는 Kubernetes에서 작업할수 있는 가장 작은 작업단위로 어플리케이션 컨테이너, 저장소, 고유 네트워크 ip, 컨테이너 실행 옵션을 캡슐화하고 있다.
실제 어플리케이션을 배포할때는 파드를 직접배포하지 않고, deployment, replicaset daemonset, statufulset 또는 job과 같은 형태로 배포되어 실행된다.
- Pod 생성 단계
- kubectl 또는 기타 API 클라이언트로 Pod 생성 명령을 API 서버에 보낸다.
- API 서버는 Pod 객체를 etcd 데이터 저장소에 씁니다. 쓰기가 성공하면 승인이 API 서버와 클라이언트로 다시 전송됩니다.
- 이제 API 서버는 etcd의 상태 변경을 반영합니다.
- Scheduler는 API 서버를 계속 감시하고 있고, 관련 변경 사항(new pod)을 확인한다.
- 이 경우 아직, kube-scheduler는 새 Pod 객체가 API 서버에 생성되었지만 어떤 노드에도 바인딩되지 않은 상태를 확인한다.
- kube-scheduler는 노드를 포드에 할당하고 API 서버를 업데이트합니다.
- 이 변경 사항은 etcd 데이터 저장소로 전파하고, API 서버는 또한 새로운 Pod 객체를 노드 할당으로 반영합니다.
- 모든 노드의 Kubelet은 API 서버를 계속 감시하고 있고, 대상 노드의 Kubelet은 새 포드가 할당 되었음을 확인합니다.
- Kubelet은 Docker를 호출하여 노드에서 포드를 시작하고 컨테이너 상태를 API 서버로 다시 업데이트합니다.
- API 서버는 포드 상태를 etcd로 유지합니다.
- etcd가 성공적인 쓰기에 대한 승인을 보내면 API 서버는 이벤트가 승인되었음을 나타내는 승인을 kubelet에 다시 보냅니다.
-
추가로 Pod가 생성되거나 종료 될때, 구성할 수 있는 것
-
Init 컨테이너 사용
- Init 컨테이너는 기본 애플리케이션 컨테이너가 시작되기 전에 실행되는 컨테이너
- Init 컨테이너는 포드의 기본 컨테이너가 시작되기 전에 일부 초기 작업을 실행해야 할 때 유용 할 수 있다.
예 : 구성 파일 복사 및 구성 값 업데이트.
-
lifecycle hook
- kubelet은 Container Lifecycle Hooks 에 의해 트리거 된 코드를 실행할 수 있음
- 사용자는 컨테이너 수명주기의 특정 이벤트 동안 특정 코드를 실행할 수 있음
예 : 컨테이너가 종료되기 전에 정상 종료 스크립트 실행
- 두개의 hook가 있음
- PostStart : 컨테이너 생싱시 실행되지만, 컨테이너 Entrypoint 이후에 실행된다는 보장은 없음
- PreStop : 컨테이너가 종료되기 직전에 실행되는것으로 삭제 호출이 전송되기 전에 후크 실행이 필요할때 사용
- hook을 구현할수 있는 핸들러 제공
- Exec : 컨테이너 내에서 특정 명령을 실행할수 있음
- HTTP : 컨테이너의 특정 엔드 포인트에 대해 HTTP 요청을 실행
-
컨테이너 Probes
-
컨테이너에서 kubelet이 수행하는 진단하는 것으로 두가지의 Probes가 있음
- livenessProbe : 컨테이너가 실행 중인지 여부
- readnessProbe : 컨테이너가 요청을 처리할 준비가 되었는지 여부
- 이 probes가 실패시 엔드포인트 컨트롤러는 포드와 일치하는 모든 서비스의 엔드포인트 목록에서 컨테이너 ip를 제거
-
프로브 구현방법 세가지
- ExecAction : 컨테이너 내부에서 명령을 실행, 명령 0을 반환시 진단 성공
- TCPSocketAction : 컨테이너 IP 및 지정된 port에 대해 TCP 소켓 검사, 포트 열려있음 성공
-
HTTPGetAction : 지정된 포트, 경로를 사용하여 IP에 대해 HTTP Get 작업 실행, 응답이 200~400사이면 성공
포드 상태
Pending : 최초 기본 컨테이너가 아직 생성되지 않은 상태
Running : 기본 컨테이너가 1개 이상 실행 상태
Succeeded : Running 실행 후, 컨테이너 상태가 0으로 종료되어 다시 시작되지않는 상태
Fail : Running 실행 후, 하나 이상의 컨테이너가 비정상 종료되어 0이 아닌 상태) 모든 컨테이너가 종료된 상태
CrashLoopBackoff : 컨테이너가 시작되지 않은 상태로 여러번 시도됨
- Pod 종료 단계
- 사용자가 Pod를 삭제하라는 명령을 보냅니다.
- API 서버의 Pod 객체는 유예 기간과 함께 Pod가 '사용 불능'으로 간주되는 시간 (기본값 30 초)으로 업데이트됩니다.
- 아래 작업은 동시에 발생하는데,
- 포드는 클라이언트 명령으로 "terminating"으로 표시
- Kubelet은 2의 시간이 설정되어 Pod가 종료 된 것으로 표시되었음을 확인하면 Pod 종료 프로세스를 시작
- 엔드 포인트 컨트롤러는 포드가 삭제 될 예정임을 감시하므로 포드가 서비스를 제공 한 모든 엔드 포인트에서 포드를 제거
- 포드가 preStop hook 을 정의한 경우 포드 내부에서 호출됩니다.
- preStop은 유예 기간이 만료 된 후, 후크는 여전히 실행되고, 단계 (2)는 작은 (2 초) 연장 유예 기간으로 호출
- 포드의 프로세스에는 TERM신호가 전송됩니다.
- 유예 기간이 만료되면 포드에서 여전히 실행중인 모든 프로세스가 SIGKILL로 종료됩니다.
- Kubelet은 유예 기간 0 (즉시 삭제)을 설정하여 API 서버에서 포드 삭제를 완료합니다. 포드가 API에서 사라지고 더 이상 클라이언트에 표시되지 않습니다.