
Pod은 쿠버네티스의 가장 기본적인 배포 단위다.
마스터 노드에서는 워커노드로 Pod을 전달하고 워커노드에서는 Pod을 수행하는 구조다.
파드는 1개 이상의 컨테이너가 캡슐화 되어 클러스터 안에서 배포되는 가장 작은 단위라고 생각하면 된다.
![]()
파드는 다음과 같은 특징들을 가지고 있다.
- 기본적으로 하나의 파드에는 하나 이상의 컨테이너가 포함된다. 필요에 따라 여러개가 표함될 수도 있다.
- 파드는 노드IP와 별개 고유 IP를 할당 받으며, 파드 안에 컨테이너들이 공유한다.
- 파드 자체는 일반적으로 1개의 IP만을 가질 수 있다.(단, Multus CNI 이용 등 특정 조건에 한해 2개를 가질 수도 있긴하다.)
- 파드 안에 컨테이너들은 동일한 볼륨을 연결할 수 있다.
- 파드는 클러스터내에 배포 최소 단위이고 특정 네임스페이스 안에서 실행된다.
- 파드는 기본적으로 반영속적이다.
반영속적이라는 말은, 결국 쿠버네티스에서 파드는 무언가 구동중인 상태를 유지하기 위해 동원되는 일회성 자원이며, 필요에 따라서 언제든 삭제될 수 있다는 것이다 이 점을 유념하자. 영속적자원으로는 [[Service]] 가 존재한다.
왜 Pod 단위로 묶어서 배포하는 것일까?
- Pod 내부 컨테이너 간의 IP 및 Port 공유를 통한 용이성 향상
N개의 컨테이너가 한 개의 Pod에 탑재되어 배포된 어플리케이션을 고려해보자.
이 어플리케이션 안의 컨테이너끼리는 실시간으로 데이터를 교환하며, 그에 따라 상태를 업데이트 한다.
두 컨테이너는 별도의 IP호출 없이 localhost를 통해 통신이 가능하다.
Container
Pod는 기본적으로 한 개 이상의 컨테이너들로 구성되어 있다.
Pod 안의 컨테이너들은 서비스가 서로 연결될 수 있도록 포트를 가지고 있다.
여기서, 한 컨테이너는 하나 이상의 포트를 가질 수 있지만, 한 포트를 여러 컨테이너가 공유하지는 못하게 됩니다.
Pod은 또한 생성될 때 고유 ip가 생성됩니다.
Pod를 IP를 통해서 접근할 경우 쿠버네티스 클러스터 내에서만 접근이 가능하고, 외부에서는 접근이 불가능합니다.
Label
Pod 뿐만 아니라 모든 오브젝트에서 다 쓰입니다.
하지만, Pod에서 가장 많이 사용합니다. Label을 사용하는 이유는 목적에 따라 오브젝트들을 분류할 수 있으며, 오브젝트들을 따로 연결하기 위해서 사용합니다. 구성은 키와 밸류 형태로 만들어집니다.
Node Schedule
Pod은 여러 노드들 중 한 노드에 올라가야합니다.
직접 노드를 선택하는 방법과 쿠버네티스가 자동으로 선택하는 방법이 존재합니다.
쿠버네티스 스케쥴러가 판단하여 노드를 고를 수 있습니다
- CPU 사용량
- 메모리 사용량
파드 정의
단일 컨테이너 파드(파드 내에 컨테이너 한개)를 정의해보겠다. nginx 예시 명령어로도 할 수 있지만 이번에는 manifest로 작성해보겠다. yaml파일을 생성해준다.
```yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx-container
image: nginx
apiVersion: 객체 생성에 쓰일 쿠버네티스 api 버전을 의미한다. 객체 종류에 따라 버전이 조금 다른 것을 유의하고 파드와 서비스는 v1, 레플리카셋과 디플로이먼트등은 apps/v1으로 쓰인다.metadata.labels: 파드 구동에 영향을 주지 않는 순수 키-밸류 메타 데이터 영역이다. 원하는 조합으로 부여할 수 있다. 여러 파드가 돌아가는 환경에서 여러 작업(재배포 등)수행을 특정 파드들만 실행되도록 할 수 있다.spec.containers: 실제 파드에 담길 컨테이너의 속성을 정의한다. 도커 컴포즈와 유사한 내용이라고 생각하면 된다.
아래는 주요 명령어다 보고 외우자(ㅠㅠ)
# 클러스터 내 파드 목록 조회(default 네임스페이스)
kubectl get pods
# 클러스터 내 특정 네임스페이스의 파드 목록 조회
kubectl get pods -n <namespace>
# 파드 목록의 상세 조회(사설IP, 노드정보 포함)
kubectl get pods -o wide
# nginx 파드를 수정
kubectl edit pod nginx
# nginx 파드의 상세 정보 확인
kubectl describe pod nginx
# nginx 파드 내 구동 중인 컨테이너의 로그 확인
kubectl logs nginx
# nginx 파드의 컨테이너에 접속하여 sh를 대화형으로 실행
kubectl exec -it nginx -- /bin/sh
# nginx 파드 삭제
kubectl delete pod nginx
네임스페이스는 하나의 클러스터 안에서 다양한 워크로드 리소스들이 필요에 따라 격리하는 데 사용되는 요소다 나중에 더 알아보도록 하겠다.
멀티 컨테이너 파드 관리를 하려면 containers로 작성해 이 부분에 여러 컨테이너들을 정의하면 된다.
yaml 파일로 파드를 생성하는 방법은
# 생성된 yaml 파일로 파드 구동(선언형 방식)
kubectl apply -f pod1.yaml
# 생성된 yaml 파일로 파드 구동(명령형 방식)
kubectl create -f pod1.yaml
하나 추가 팁으로 yaml 명세의 기본 골격을 파일 형태로 저장할 수도 있다.
# Redis 파드 명세를 yaml 파일로 생성
kubectl run redis --image=redis --dry-run=client -o yaml > redis.yaml
멀티 컨테이너 파드의 경우, 컨테이너 로그 확인 또는 접속시 컨테이너 명을 지정해줘야한다.
'Server & Infra.' 카테고리의 다른 글
| [K8s] Probe 알아보기 (2) | 2024.03.12 |
|---|---|
| [K8s] Pod 생명주기와 재시작 정책 (0) | 2024.03.12 |
| [K8s] 노드 컴포넌트 알아보자 (0) | 2024.03.12 |
| [K8s] 컨트롤 플래인 알아보기 (0) | 2024.03.12 |
| [K8s] 쿠버네티스 클러스터 (0) | 2024.03.12 |