Kubernetes

[Kubernetes] Pod

hyerann 2021. 3. 29. 21:47
⚡️목표
Pod가 무엇인지 알아보고 기본적인 사용법을 익히고, YAML을 이용하여 설정파일을 작성해봅니다.

Pod

  • 쿠버네티스에서 관리하는 가장 작은 배포 단위
  • 한 개 또는 여러 개의 컨테이너를 포함

쿠버네티스와 도커의 차이점

  • 도커는 컨테이너를 만든다.
  • 쿠버네티스는 컨테이너 대신 Pod를 만든다.

 

빠르게 Pod 만들기

kubectl run

  • kubectl run echo --image ghrc.io/subicura/echo:v1
주의 ❗️
kubernetes v1.18 이상은 run 명령어가 Pod를 만들지만, v1.17 이하는 Deployment를 만든다.

생성된 Pod의 상태를 간략하게 확인할 수 있음

상태(STATUS)는 컨테이너가 정상적으로 생성되면 Running으로 바뀌고 오류가 있다면 에러 상태를 표시

더 상세하게 Pod의 상태 확인하기

  • kubectl describe pod [pod_name]

쿠버네티스를 운영하면서 가장 많이 확인하는 부분은 Events

-> 현재 Pod의 상태를 이벤트별로 확인할 수 있음

 

Pod 생성 분석

Pod는 다음과 같이 구성되어 있음

minikube 클러스터 안에 Pod가 있고, Pod 안에 컨테이너가 있음

 kubectl run  을 실행하고 Pod가 생성되는 과정

  1. Scheduler는 API 서버를 감시하면서 할당되지 않은 Pod가 있는지 체크
  2. Scheduler는 할당되지 않은 Pod를 감지하고 적절한 노드에 할당
  3. 노드에 설치된 kubelet은 자신의 노드에 할당된 Pod가 있는지 체크
  4. kubelet은 Scheduler에 의해 자신에게 할당된 Pod의 정보를 확인하고 컨테이너 생성
  5. kubelet은 자신에게 할당된 Pod의 상태를 API 서버에 전달

Pod 제거

  • kubectl delete pod [pod_name]

 

YAML로 설정파일(Spec) 작성하기

 kubectl run  명령어는 실전에서 거의 사용하지 않음

훨씬 더 복잡하고 다양한 설정이 필요한데 이를  kubectl  명령어로 표현하면 금방 복잡해지고 관리가 어려움

원하는 리소스를 YAML 파일로 작성하면 복잡한 내용을 표현하기 좋고 변경된 내용을 버전 관리할 수 있음

 

위에서 만든 Pod를 YAML 파일로 정의

 run  명령어로 생성할 떄와 차이점은 label이 추가되었음

쿠버네티스는 리소스를 관리할 때 name과 label 이용

 

필수 요소

정의 설명
version 오브젝트 버전 v1, app/v1, networking.k8s.io/v1, ...
kind 종류 Pod, ReplicaSet, Deployment, Service, ...
metadata 메타데이터 name과 label, annotation(주석)으로 구성
spec 상세 명세 리소스 종류마다 다름

version, kind, metadata, spec은 리소스를 정의할 때 반드시 필요한 요소

 

Pod 생성, 목록 조회

Pod 로그 확인

Pod 컨테이너 접속

Pod 제거

  • kubectl delete -f echo-pod.yml

 

컨테이너 상태 모니터링

컨테이너 생성과 실제 서비스 준비는 약간의 차이가 있음

서버를 실행하면 바로 접속할 수 없고 짧게는 수초, 길게는 수분의 초기화 시간이 필요한데 

실제로 접속이 가능할 때 서비스가 준비되었다고 말할 수 있음

쿠버네티스는 컨테이너가 생성되고 서비스가 준비되었다는 것을 체크하는 옵션을 제공하여 초기화하는 동안 서비스되는 것을 막을 수 있음

 

livenessProbe

컨테이너가 정상적으로 동작하는지 체크

정상적으로 동작하지 않는다면 컨테이너를 재시작하여 문제를 해결

정상이라는 것은 여러 가지 방식으로 체크할 수 있는데 여기서는 http get 요청을 보내 확인하는 방법 사용

일부러 존재하지 않는 path와 port를 입력했기 때문에 정상적으로 응답하지 않음

→ Pod가 여러 번 재시작되고 CrashLoopBackOff 상태로 변경됨

 

상태 체크

httpGet 외에 tcpSocket, exec 방법으로 체크할 수 있음

 

readinessProbe

컨테이너가 준비되었는지 체크

정상적으로 준비되지 않았다면 Pod로 들어오는 요청 제외

livenessProbe와 차이점은 문제가 있어도 Pod를 재시작하지 않고 요청만 제외함

READY 상태가 0/1인 것을 확인할 수 있음


 

출처: subicura.com/k8s/guide/pod.html

 

Pod

Pod이 무엇인지 알아보고 기본적인 사용법을 익힙니다. YAML을 이용하여 설정파일을 작성합니다.

subicura.com