[Kubernetes] Pod
⚡️목표
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가 생성되는 과정
- Scheduler는 API 서버를 감시하면서 할당되지 않은 Pod가 있는지 체크
- Scheduler는 할당되지 않은 Pod를 감지하고 적절한 노드에 할당
- 노드에 설치된 kubelet은 자신의 노드에 할당된 Pod가 있는지 체크
- kubelet은 Scheduler에 의해 자신에게 할당된 Pod의 정보를 확인하고 컨테이너 생성
- 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