Pod는 쿠버네티스의 최소 실행 단위이다.
모든 프로세스는 Pod를 통해 수행된다.
특징
- Pod는 1개 이상의 컨테이너를 가질 수 있다. (실질적으로 3개 이상 넘어가는 경우는 거의 없다)
- Pod 내에 실행되는 컨테이너들은 반드시 동일한 노드에 할당되며 동일한 생명주기를 갖는다. Pod 삭제시 Pod 내의 모든 컨테이너도 전부 같이 삭제된다.
- Node IP와는 별개로 Cluster 내에서 접근가능한 고유 IP를 할당받는다. 쿠버네티스에서는 다른 Node에 위치한 Pod라도 NAT 통신 없이 Pod 고유 IP를 통해 접근할 수 있다.
- Pod 내의 컨테이너들은 서로 IP를 공유한다. 같은 Pod 내의 컨테이너끼리 localhost를 통해 접근 가능하며 포트를 이용하여 구분한다.
- Pod 안의 컨테이너 들은 동일한 volume과 연결이 가능하여 파일 시스템을 기반으로 서로 파일을 주고 받을 수 있다.
<구조 이미지> (Node안에 Pod 안에 컨테이너 안에~~~)
라벨링 시스템
라벨은 그냥 key, value 형태의 문자열이다.
Pod에 라벨을 부여한다는 것은 Pod의 metadata property에 key, value 형태의 문자열을 추가한다는 것과 같다.
# mynginx.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
hello: world
run: mynginx
name: mynginx
spec:
containers:
- image: nginx
name: mynginx
EOF
라벨링 시스템 활용
Pod가 특정 노드에 할당되도록 스케줄링 할 수 있다.
- master Node에 disktype=ssd 라벨을 부여하고, Pod 생성시 nodeSelector property를 사용해 특정 노드를 선택할 수 있다.
실행 명령 및 파라미터 지정
Pod 생성 시, 실행 명령과 파라미터 전달 가능
...
spec:
restartPolicy: OnFailure
containers:
- name: nginx
image: nginx
# 실행명령
command: ["/bin/echo"]
# 파라미터
args: ["hello"]
command와 args 사용해서 명령과 파라미터 전달
환경변수 설정
env property로 환경변수를 설정할 수 있다.
...
spec:
containers:
- name: nginx
image: nginx
env:
- name: hello
value: "world"
볼륨 연결
Pod 내부 스토리지의 생명주기는 Pod와 같아서 Pod가 삭제되면 저장된 데이터도 삭제된다.
Pod 내에서 생성된 데이터를 Pod 생명주기와 상관없이 지속적으로 저장하고 싶다면 볼륨을 따로 연결해야 한다.
# volume.yaml
apiVersion: v1
kind: Pod
metadata:
name: volume
spce:
containers:
- name: nginx
image: nginx
# 컨테이너 내부의 연결 위치 지정
volumeMounts:
- mountPath: /container-volume
name: my-volume
# host 서버의 연결 위치 지정
volumes:
- name: my-volume
hostPath:
path: /home
- volumeMounts : 컨테이너 내부에 사용될 볼륨 선언
- mountPath : 컨테이너 내부에 볼륨이 연결될 위치 지정
- name : volumeMounts와 volumes을 연결하는 식별자로 사용
- volumes : Pod에서 사용할 volume 지정
- name : volumeMounts와 volumes을 연결하는 식별자로 사용
- hostPath : 호스트 서버의 연결 위치 지정
리소스 관리
쿠버네티스에서는 컨테이너 실행에 필요한 리소스를 제약할 수 있는 메커니즘을 제공한다. (resources property)
- requests : 최소 리소스 사용량 정의
- limits : 최대 리소스 사용량 정의
각각 cpu, memory 사용량 지정 가능
컨테이너가 최대 리소사 사용량을 넘으면, CPU는 throttling이 발생하고 memory는OutOfMemory(OOM)이 발생한다.
상태 확인
livenessProbe : Pod가 정상적으로 동작하는지 확인
readinessProbe : 생성 직후, 트래픽을 받을 준비가 되었는지 확인 (초기화 완료 알림 용도)
초기화 컨테이너
메인 컨테이너 시작던에 명시적으로 초기화 작업 가능
initContainers property
Config 설정
설정값 따로 모아두고 필요할 때 꺼내 사용할 수 있는 메커니즘
ConfigMap
kubetctl create configmap <key> <data-source>
## 사용 예시
# game.properties 파일 생성
weapon=gun
health=3
potion=5
kubetctl create configmap game-config --from-file=game.properties
# configmap/game-config created
--from-literal은 사용자가 직접 설정값 지정
kubectl create configmap special-config \
--from-literal=special.power=10 \
--from-literal=special.strenth=20
활용방법
- Pod에서 사용할 볼륨 선언
- Pod 환경변수 (하나씩 : env, 모든 설정값 : envFrom)
민감 데이터 관리
secret 값 관리
# user-info.yaml
apiVersion: v1
kind: Secret
metadata:
name: user-info
type: Opaque
data:
username: YWRtaW4 # admin
password: cGFzc3dvcmQxMjM= # password123
kins를 Secret으로 지정
type은 Secret 리소스 타입. Opaque는 기본값
data는 저장할 민감데이터 입력 (실제 값을 base64로 인코딩)
만약 data 필드값을 직접 base64로 인코딩하지 않고 쿠버네티스가 대신 처리해주길 바란다면 stringData property 사용
# user-info.yaml
apiVersion: v1
kind: Secret
metadata:
name: user-info-string-data
type: Opaque
stringData:
username: admin
password: password123
활용
- 볼륨 연결 (volumeMounts: name, mountPath로 지정)
- 환경변수 env, envFrom
메타 데이터 전달
Pod의 메타데이터를 컨테이너에게 전달할 수 있는 메커니즘 제공 = Download API
실행되는 Pod의 정보를 컨테이너에 노출하고 싶을 때 사용
활용은 configMap, secret과 동일
'공부 > Kubernetes' 카테고리의 다른 글
쿠버네티스 네트워킹 (0) | 2024.09.25 |
---|---|
쿠버네티스 명령어 (0) | 2024.07.17 |
[NCP] Kubernetes Service 이용하기 (1) | 2024.07.13 |