Home ☸️ [Kubernetes] Pod ☸️
Post
Cancel

☸️ [Kubernetes] Pod ☸️

☸️ About Pod

Pod는 K8s가 하나 이상의 Container를 관리하는데 사용하는 단위입니다.

Pod는 Cluster를 이루는 Worker Node 중 하나의 Worker Node에서 실행되며 하나의 Pod에 속한 모든 Container는 같은 Worker Node에서 실행됩니다.

☸️ Container 🔗 Pod

Container와 Pod의 관계는 다음과 같습니다.

특징설명
• Pod는 하나 이상의 Container를 포함 
• 하나의 Pod에 속한 모든 Container는 같은 가상환경을 공유• 한 Container의 실행이 또 다른 Container에 영향을 줄 수 있음
• Container가 같은 IP Address(Pod의 IP Address)를 공유
• Container들끼리 localhost로 통신이 가능
• File System 일부를 공유

☸️ Pod 🔗 Worker Node

Pod와 Node의 관계는 다음과 같습니다.

특징
• Pod가 생성되면 한 Node에 배정(Node Scheduling)
• Worker Node에서 Pod들을 관리

☸️ Pod 🔗 Network

Pod와 네트워크의 관계는 다음과 같습니다.

특징
• Pod는 자신만의 가상 IP Address를 가짐
• Cluster 내에서만 가상 IP Address로 접근이 가능하며 외부에서는 접근이 불가능
• Pod 간 통신에 TCP와 UDP를 지원
• Pod가 재생성되면 가상 IP Address가 변경(휘발성)

☸️ Pod에서 실행되는 Container 유형

Pod에서 실행되는 Container의 유형은 다음과 같습니다.

Container Type정의설명
• Init ContainerPod에서 가장 먼저 실행되어 초기화 역할을 담당하는 Container• Init Container가 모두 실행된 후 Application Container를 실행
• Init Container의 Image를 변경하면 Pod 자체를 재시작
• Init Container는 Pod 정의에 기재된 순서대로 실행
• Application ContainerApplication을 구동하는 ContainerApplication Container의 Image를 변경하면 해당 Application Container만 재시작
• Sidecar Container기존 Pod의 기능을 확장할 때 사용하는 보조 Container 
• Adapter Container서로 다른 출력을 가지는 Container들의 상호 호환성을 만들어주는데 사용하는 Container 
• Ambassador ContainerApplication Container와 Cluster 외부의 통신을 제어하고 단순화하는데 사용하는 Container• 네트워크 트래픽을 처리하는 Proxy 역할
• DB Ambassador Container에서는 UPDATE Query는 Master DB로 보내고, SELECT Query는 Slave DB로 보내는 역할

☸️ Pod의 LifeCycle

☸️ Pod의 Status

Phase설명예시
• PendingPod의 최초 상태PodScheduled ➜ Initialized ➜ Image Downloading까지의 상태
• RunningPending이후 Container가 실행 또는 재시작 상태 
• SucceededPod에 있는 모든 Container가 성공적으로 종료된 상태Terminated - Completed
• FailedPod에 있는 Container 중 하나 이상의 Container에 문제가 생겨 종료된 상태Terminated - Error
• UnknownPod에 통신 문제가 발생한 경우 
Conditions Type설명
• PodScheduledPod를 여러 Worker Node 중 한 Worker Node에 할당 여부
• InitializedInit Container의 실행 성공 여부
• ContainerReadyContainer들이 실행 준비가 되었는지 여부
• ReadyPod가 서비스할 준비가 되었는지 여부
Reason
• ContainerCreating
• ContainersNotReady
• PodCompleted

☸️ Container의 Status

State설명
• Waiting• Image Downloading 상태
• 문제가 생겨 재시작 되는 상태
• RunningContainer가 정상적으로 실행중인 상태
• TerminatedContainer가 종료된 상태
Reason설명
• ContainerCreatingContainer가 생성되고 있는 상태
• CrashLoopBackOffContainer가 재시작 되고 있는 상태
• ErrorContainer에 문제가 생긴 경우
• CompletedContainer가 작업을 모두 마친 경우

☸️ Probe

Probe는 Container에서 kubelet에 의해 주기적으로 수행되는 진단(diagnostic)입니다.

진단을 수행하기 위해서 kubelet은 Container에 의해서 구현된 Handler를 호출합니다. Handler에는 다음과 같이 세 가지 타입이 있습니다.

Handler설명성공 상태
• ExecActionContainer에서 지정된 명령어를 실행명령어 상태 코드가 0으로 종료
• TCPSocketAction지정된 포트에서 Container의 IP Address에 대해 TCP 검사를 수행포트가 활성화되어 있는 경우
• HTTPGetAction지정된 포트 및 경로에서 Container의 IP Address에 대해 HTTP GET 요청을 수행HTTP Response Status Code가 200보다 크고 400보다 작은 경우

☸️ Probe 종류

Probe에는 다음 세 가지 종류가 있습니다.

Probe진단 대상실패한 경우
• Readiness ProbeContainer가 요청을 처리할 준비가 되었는지 여부Container가 속한 Pod에 연관된 모든 Service들의 Endpoint에서 해당 Pod의 IP Address를 제거
• Liveness ProbeContainer의 동작 여부kublet이 해당 Container를 죽이고 재시작 되도록 함
• Startup ProbeContainer 내의 Application이 시작되었는지 여부• 성공할 때까지 다른 Probe는 활성화 되지 않음
• kublet이 해당 Container를 죽이고 재시작 되도록 함

☸️ Probe 사용 용도

Probe들의 사용 용도는 다음과 같습니다.

Probe사용 용도
• Readiness ProbeProbe가 성공한 경우에만 Pod에 트래픽을 전송하려고 하는 경우
• Liveness ProbeApplication이 Deadlock 상태에 머무르는 것을 감지하여 재시작하려고 하는 경우
• Startup ProbeService를 시작하는 데 시간이 오래 걸리거나 불규칙적인 Container를 사용하는 경우

☸️ QoS(Quality of Service) Classes

QoS는 Pod의 Scheduling과 제거 우선순위를 판단하는데 사용되는 값입니다.

QoS의 종류는 다음과 같습니다.

QoS제거 순위Class 정의
• Guaranteed$3$ 순위• Pod에 존재하는 모든 Container에 Memory와 CPU의 Request와 Limit의 값이 설정된 경우 • 각 Container 내에 Memory와 CPU의 Request와 Limit의 값이 같은 경우
• Burstable$2$ 순위
(OOM Score가 큰 Pod부터 제거)
• Request < Limit 인경우
• Request만 설정된 경우
• Pod에 존재하는 Container 중 한 Container에 Request와 Limit 값이 설정되어 있지 않은 경우
• Best-Effort$1$ 순위Pod에 존재하는 모든 Container에 Memory와 CPU의 Request와 Limit의 값 모두 설정되지 않은 경우

OOM(Out-Of-Memory) Score

  • Memory 실제 사용량($=$ Application의 Memory 사용량 $/$ Request Memory)
  • OOM Score가 클수록 제거 순위가 높음

☸️ Guaranteed

☸️ Burstable

☸️ Best-Effort

☸️ Node Scheduling

☸️ Pod가 할당될 Worker Node를 직접 선택하는 방법

• NodeNameNodeName이 일치하는 Worker Node에 Pod를 할당하는 방법
• NodeSelectorNodeSelector가 일치하는 Worker Node에 Pod를 할당하는 방법
• NodeAffinity• matchExpressions : key로 비교(operator: Exists, DoesNotExist, In, NotIn, Gt, Lt)
• required: matchExpressions에 해당하는 Node가 없는 경우 Pod가 할당되지 않음
• preferred: matchExpressions에 해당하는 Node가 없더라도 적절한 Node에 Pod가 할당(weight를 통해 가중치를 부여할 수 있음)

☸️ 여러 Pod들을 집중 또는 분산해서 Worker Node에 할당하는 방법

다음 두 방법은 기본적으로 NodeAffinity의 특징들을 그대로 가지고 있기 때문에 matchExpressions, required, preferred 모두 사용 가능합니다.

• Pod Affinity• 여러 Node들에 존재하는 Pod들 중 matchExpressions에 해당하는 Pod가 있는 Node에 할당
• topologyKey를 통해 Node의 범위를 제한할 수 있음
• Anti-Affinity• 여러 Node들에 존재하는 Pod들 중 matchExpressions에 해당하는 Pod가 있는 Node를 제외한 Node에 할당
• topologyKey를 통해 Node의 범위를 제한할 수 있음

☸️ 특정 Worker Node에 할당될 수 있는 Pod를 제한하는 방법

• Taint• effect - NoSchedule: Toleration이 정의된 Pod와 Taint가 정의된 Node를 비교했을 때 적절하지 않으면 해당 Node에 해당 Pod가 할당되지 않음(Ex. Master Node에 기본적으로 정의되어 있음)
• effect - PreferNoSchedule: Toleration이 정의된 Pod와 Taint가 정의된 Node를 비교했을 때 적절하지 않으면 해당 Node에 해당 Pod가 가급적 할당되지 않음
• effect - NoExecute: 해당 Node에 존재하는 Pod들까지 비교하여 적절한지 확인(다른 effect의 경우 이미 존재하는 Pod들까지 확인하지 않음)
• Toleration• Taint가 정의된 Node에 Pod를 할당하고 싶을 때 사용
• Taint의 label과 비교하는 operator: Equal, Exists
• Taint의 label 뿐 아니라 effect까지 일치해야 적절하다고 판단하여 Taint가 정의된 Node에 할당할 수 있음
• Pod가 적절하더라도 다른 Node에 할당될 수 있기 때문에 Taint가 정의된 Node에 할당하기 위해서는 별도의 옵션(Ex. nodeSelector)을 함께 사용해야 함
This post is licensed under CC BY 4.0 by the author.

☸️ [Kubernetes] Components ☸️

☸️ [Kubernetes] Controller ☸️