
파드(Pod)는 쿠버네티스에서 생성하고 관리할 수 있는 배포 가능한 가장 작은 컴퓨팅 단위이다.
파드 (고래 떼(pod of whales)나 콩꼬투리(pea pod)와 마찬가지로)는 하나 이상의 컨테이너의 그룹이다. 이 그룹은 스토리지 및 네트워크를 공유하고, 해당 컨테이너를 구동하는 방식에 대한 명세를 갖는다. 파드의 콘텐츠는 항상 함께 배치되고, 함께 스케줄 되며, 공유 콘텍스트에서 실행된다. 파드는 애플리케이션 별 "논리 호스트"를 모델링한다. 여기에는 상대적으로 밀접하게 결합된 하나 이상의 애플리케이션 컨테이너가 포함된다. 클라우드가 아닌 콘텍스트에서, 동일한 물리 또는 가상 머신에서 실행되는 애플리케이션은 동일한 논리 호스트에서 실행되는 클라우드 애플리케이션과 비슷하다.
쿠버네티스 공식 docs에서 나와있는 말이다. 쉽게 얘기하자면 Pod는 여러 컨테이너를 감싸고 있는 콩껍질과 같다.
또한 노드에서 컨테이너를 실행하기 위한 가장 기본적인 배포 단위이며 여러 노드에 1개 이상의 Pod를 분산 배포/실행 가능하다.
쿠버네티스가 생성하는 Pod의 특징으로는
1. Pod를 생성할 때 노드에서 유일한 IP를 할당한다(서버 분리 효과)
2. Pod 내부 컨테이너 간에 localhost로 통신 가능
3. Pod 안에서 네트워크와 볼륨 등 자원을 공유할 수 있다

또한 PodIP는 클러스터 내부에서만 접근할 수 있다.

Pod과 컨테이너 설계시 고려할 점(Pod:Container = 1 : 1 or 1 : N)
1. 컨테이너들의 라이프 사이클이 같아야 한다
Pod 라이프 사이클 = 컨테이너들의 라이프사이클
컨테이너 A가 종료되었을 때 컨테이너 B 실행이 의미 있는지
2. 스케일링 요구사항이 같은가
웹 서버 vs 데이터베이스, 트래픽이 많은 vs 그렇지 않은
3. 인프라 활용도가 더 높아지는 방향으로
쿠버네티스가 노그 리소스 등 여러 상태를 고려하여 Pod를 스케쥴링
노드에 배포되는 과정
- 사용자로부터 Pod 배포 요청을 수락한다.
- 요청받은 수만큼 Pod Replica를 생성한다.
- Pod를 배포할 적절한 노드를 선택한다.
- 컨테이너 런타임에게 이미지 다운로드를 명령하고 Pod 실행을 준비하고 Pod 상태를 업데이트한다.
- 이미지를 다운로드하고 컨테이너를 실행한다

이제 Pod를 생성해보고 컨테이너 내부에서 사용할 환경변수를 선언해 보자
(컨테이너 이미지는 pod의 세부사항을 환경변수로 볼 수 있게 준비된 이미지이다)
apiVersion: v1 #파드를 배할때 사용하는 api버전은 v1이다
kind: Pod # 무엇을 만들것인지 지정 우리는 Pod를 만들기 때문 Pod를 지정
metadata: #리소스의 이름이나 labels 등을 지정 한다
name: hello-app #Pod의 이름
spec: #Pod안에 배포될 컨테이너의 스펙 정의라고 보면되겠다
containers:
- name: hello-app #컨테이너 이름 정의
image: yoonjeong/hello-app:1.0 #실행할 컨테이너 이미지
ports: #컨테이너 실행할 port
- containerPort: 8080
env: #실행한 컨테이너에 전달할 환경변수 세팅
- name: POD_NAME #여기서부터는 자세하게 설명해보겠다
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: NAMESPACE_NAME
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: NODE_IP
valueFrom:
fieldRef:
fieldPath: status.hostIP
- name: STUDENT_NAME
value: 박민혁
- name: GREETING
value: 안녕하세요. $(STUDENT_NAME)
resources:
limits:
memory: "128Mi"
cpu: "100m"
작성이 완료되었다면 아래의 명령어로 실행시켜주자
$ kubectl apply -f <실행할 yaml파일 경로>
문제없이 실행했다면 created가 뜨고 Pod가 정말 실행이 되었는지를 확인하기 위해
$ kubectl get pod -o wide #여기서 -o는 output의 의미이고 wide 상세한정보를 나타낸다

이번에는 배포한 yaml 파일은 josn형식으로 확인해 보자
$ kubectl get pod/hello-app -o json
확인하기 전에 위의 yaml파일에서 환경변수를 설정해놨는데 어떤 걸 설정해놨는지 알아보자
POD_NAME: Pod의 이름은 필드에서 metadata.name
POD_IP: Pod의 IP는 status.podIP
NAMESPACE_NAME: 네임스페이스는 metadata.namespace (namespace를 별도로 지정해주지 않으면 "default"값으로 되어있다)
NODE_NAME: Pod가 실행될 노드의 이름은 spec.nodeName
NODE_IP: status.hostIP

확인해보면 metadata.name을 확인해보면 yaml에 세팅한 Pod의 이름을 확인할 수 있다 metadata.namespace도 마찬가지이다.

status.podIP와 status.hostIP도 확인할 수 있다
이번에는 파드를 localhost에 포트포워딩을 해서 컨테이너로 환경변수가 잘 전달이 되었는지 확인해 보자
$ kubectl port-forward pod/hello-app 8080:8080

curl 명령어로 확인해 보면

환경변수로 세팅한 값들이 잘 적용이 된 걸 확인할 수 있다
다음에는 Pod간의 통신에대해 얘기해보겠다
'DevOps > K8s' 카테고리의 다른 글
[K8s] 쿠버네티스 Deployment의 개념 (2) | 2022.12.22 |
---|---|
[K8s] 쿠버네티스 ReplicaSet의 개념 (0) | 2022.12.22 |
[K8s] 쿠버네티스 Label과 Selector (0) | 2022.12.21 |
[K8s] 쿠버네티스 Pod간의 네트워크 (1) | 2022.12.21 |
[k8s] 쿠버네티스의 개념 - 1 (0) | 2022.12.08 |