- 컨테이너를 다루는 기본 단위
- 포드는 1개 이상의 컨테이너로 구성된 컨테이너의 집합
- 도커 스웜모드에서의 서비스 개념과 비슷하다
- Pod와 컨테이너를 생성할려면 아래 YAML 파일로 작성해서 실행시킬 수 있다
apiVersion: v1
kind: Pod
metadata:
name: my-nginx-pod
spec:
containers:
- name: my-nginx-container
image: nginx:latest
ports:
- containerPort: 80
protocol: TCP
- 쿠버네티스에서 YAML 파일 작성 포맷은 위와 같은데, 각 항목들을 설명하면 다음과 같다
- apiVersion : YAML 파일에 정의한 오브젝트의 API 버전 정보
- kind : 리소스의 종류, 위 예제에선 Pod를 생성하기 위해 적은것이며, 종류는 api-resources 명령어로 확인할 수 있다
- metadata : 리소스의 부가 정보, 예제에선 이름을 지정
- spec : 리소스의 상세 정보, 예제에선 컨테이너를 생성할 것이나 지정하고, 이름 설정, image는 nginx 도커 이미지를 지정, ports는 컨테이너와 통신하기 위한 포트를 지정한 것
- 그리고 아래 명령어로 Pod를 실행하고 삭제할 수도 있다
$ kubectl apply -f example.yaml
$ kubectl delete -f example.yaml
- 기능만 보면 Docker 컨테이너와 다를바 없어 보이는데, 왜 굳이 Pod라는 개념을 사용할까? 이는 여러 리눅스 namespace를 공유하는 컨테이너들을 집합으로 사용하기 위함이다
- 예시를 들자면, 한 Pod 내 nginx와 ubuntu 관련 컨테이너를 생성했다 가정하면, ubuntu 컨테이너로 bash 접속을 하여 localhost로만 쳐도 nginx 응답을 받아올 수 있다
- 이는 한 Pod 내 nginx 컨테이너와 ubuntu 컨테이너가 네트워크 namespace를 공유하고 있기 때문에 가능한 일이다
- 그리고 쿠버네티스를 실제로 활용할 땐, 1개의 Pod엔 1개의 컨테이너를 사용하는 경우가 대부분이다, 그럼 왜 하나의 Pod에 여러개의 컨테이너를 넣을수가 있는 걸까? 싶다
- nginx 같은 경우를 예로 들면, 웹 서버 컨테이너로써 말고도, 웹 서버의 로그나 모니터링을 하고 싶은 부가 기능이 필요할 때, 사이드카 컨테이너로 추가해서 사용할 수 있을 것이다
- 그래서 하나의 Pod는 하나의 완전한 어플리케이션이라고 지칭하며, 어플리케이션을 위한 여러 기능을 사용할 수 있다는 것