Search

5. Pod

1. Pod 개념 및 사용하기

Pod란?

컨테이너를 표현하는 K8S API의 최소 단위
Pod에는 하나 또는 여러개의 컨테이너가 포함될 수 있음
single pod
kubectl run 명령(CLI)으로 생성
kubectl run webserver --image=nginx:1.14
Shell
복사
pod yaml 을 이용해 생성
# 파일명: pod-nginx.yaml apiVersion: v1 kind: Pod metadata: name: webserver spec: containers: -name: nginx-container image: nginx:1.14 imagePullPolicy: Always port: - containerPort: 80 protocol: TCP
YAML
복사
# Pod 실행 kubectl crate -f pod-nginx.yaml # 현재 동작중인 pod 확인 kubectl get pods # 결과보기 curl <pod's IP address>
Shell
복사
Multiful container pod
멀티 컨테이너 팟의 경우 -c를 통해 컨테이너를 명시해주어야함
# 파일명: pod-multi.yaml apiVersion: v1 kind: Pod metadata: name: multipod spec: containers: -name: nginx-container image: nginx:1.14 port: - containerPort: 80 - name: centos-container image: centos:7 command: - sleep - "10000"
YAML
복사
# Pod 실행 kubectl crate -f pod-multi.yaml # 현재 동작중인 pod 확인 kubectl get pods # Pod에 접속해서 결과보기 curl <pod's IP address> # 컨테이너 접속하기 kubectl exec multipod -it -c centos-container -- /bin/bash #로그 출력 kubectl logs multipod -c nginx-container
Shell
복사

2. LivenessProbe를 사용한 self-healing Pod

pod이 계속 실행할 수 있음을 보장
pod의 spec에 정의
# pod definition apiVersion: v1 kind: Pod metadata: name: nginx-pod spec: containers: - name: nginx-container image: nginx:1.14
YAML
복사
# LivenessProbe definition apiVersion: v1 kind: Pod metadata: name: nginx-pod spec: containers: - name: nginx-container image: nginx:1.14 livenessProbe: httpGet: path: / port: 80
YAML
복사

LivenessProbe 매커니즘

1.
httpGet probe : 지정한 IP 주소, port, path에 HTTP GET 요청을 보내, 해당 컨테이너가 응답하는지를 확인한다. 반환코드가 200이 아닌 값이 나오면 오류. 컨테이너를 다시 시작한다
livenessProbe: httpGet: path: / port: 80
YAML
복사
2.
tcpSocket probe : 지정된 포트에 TCP연결을 시도. 연결되지 않으면 컨테이너를 다시 시작한다.
livenessProbe: tcpSocket: port: 22
YAML
복사
3.
exec probe : exec 명령을 전달하고 명령의 종료코드가 0이 아니면 컨테이너를 다시 시작한다.
livenessProbe: exec: command: - ls - /data/file
YAML
복사

Liveness Probe 매개 변수

periodSeconds : health check 반복 실행 시간(초)
initialDelaySeconds : Pod 실행 후 delay할 시간(초)
timeoutSeconds : health check 후 응답을 기다리는 시간(초)
# LivenessProbe definition apiVersion: v1 kind: Pod metadata: name: nginx-pod spec: containers: - name: nginx-container image: nginx:1.14 livenessProbe: httpGet: path: / port: 80 initialDelaySeconds: 15 periodSeconds: 20 timeoutSeconds: 1 successThreshold: 1 failureThreshold: 3
YAML
복사

Liveness Probe example

liveness Probe는 pod의 spec에 정의한다.
아래 example에서 사용한 smlinux/unhealthy 컨테이너는 HTTP connection 이 있을 때 마다 내부 서부오류로 HTTP 500 ERROR를 발생한다.
# LivenessProbe definition apiVersion: v1 kind: Pod metadata: name: liveness-pod spec: containers: - name: smlinux/unhealthy image: unhealthy-container ports: - containerPort: 8080 protocol: TCP livenessProbe: httpGet: path: / port: 8080
YAML
복사

3. init container

앱 컨테이너가 실행 전에 미리 동작시킬 컨테이너
본 container 가 실행되기 전에 사전 작업이 필요한 경우 사용
초기화 컨테이너가 모두 실행된 후에 앱 컨테이너 실행
# kubernetes 에서 가져온 exam apiVersion: v1 kind: Pod metadata: name: myapp-pod labels: app.kubernetes.io/name: MyApp spec: containers: - name: myapp-container image: busybox:1.28 command: ['sh', '-c', 'echo The app is running! && sleep 3600'] initContainers: - name: init-myservice image: busybox:1.28 command: ['sh', '-c', "until nslookup myservice.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for myservice; sleep 2; done"] - name: init-mydb image: busybox:1.28 command: ['sh', '-c', "until nslookup mydb.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for mydb; sleep 2; done"]
YAML
복사
해당 .yaml 파일을 실행하면 init-myserviceinit-mydb 를 실행하기 전까진 myapp-container 를 실행할 수 없습니다.
또한 initContainer 는 위에서 부터 순차적으로 실행되며 init-myservice 가 실행되기전엔 init-mydb 또한 실행 될수 없습니다.
apiVersion: v1 kind: Service metadata: name: myservice spec: ports: - protocol: TCP port: 80 targetPort: 9376
YAML
복사
apiVersion: v1 kind: Service metadata: name: mydb spec: ports: - protocol: TCP port: 80 targetPort: 9377
YAML
복사

4. infra container(pause) 이해하기

pod의 환경을 만들어주는 컨테이너

5. static pod 만들기

static container

api 서버 없이 특정 노드에 있는 kubelet 데몬에 의해 직접 관리
/etc/kubernetes/manifests/ 디렉토리에 k8s yaml 파일을 저장 시 적용됨
static pod 디렉토리 구성
# kubelet config 파일을 열어보면 staticPod 의 경로를 알려줌 vi /var/lib/kubelet/config.yaml ... staticPodPath: /etc/kubernetes/manifests
YAML
복사
/etc/kubernetes/manifests 해당 위치에 .yaml 파일을 작성하면 해당 podstatic pod으로 생성됩니다.
마찬가지로 이는 master node에도 존재하는데 master node에서 작성한다면 해당 팟은 worker node에서 실행됩니다.
※ static pod을 만드는 문제도 출제되지만 static pod을 만드는 경로를 변경하는 문제도 출제됩니다.
# /var/lib/kubelet/config.yaml 파일에서 staticPodPath 값 변경 vi /var/lib/kubelet/config.yaml ... staticPodPath: <원하는 경로로 수정> ... # 디렉토리 수정시 kubelet 데몬 재실행 systemctl restart kubelet
YAML
복사

6. Pod에 resource(CPU, Memory) 할당하기

Pod Resource 요청 및 제한

Resource Requests
pod을 실행하기 위한 최소 리소스 양을 요청
Resource Limits
pod가 사용할 수 있는 최대 리소스 양을 제한
Memory limit을 초과해서 사용되는 pod는 종료(OOM Kill)되며 다시 스케줄링 된다.

Container Resource 설정 예

# resource를 할당한 yaml 파일 생성 vi pod-nginx-resources.yaml apiVersion: v1 kind: Pod metadata: name: nginx-pod-resource spec: containers: - name: nginx-container image: nginx:1.14 ports: - containerPort: 80 protocol: TCP resources: requests: cpu: 200m memory: 250Mi limits: cpu: 1 memory: 500Mi # 확인 kubectl get pods kubeclt get describe pod nignx-pod-resource ... Limits: cpu: 1 memory: 500Mi Requests: cpu: 200m memory: 250Mi ...
YAML
복사
memory
1MB = 1000KB
1MiB = 1024Kib
cpu
1core = 1000m
requests를 설정하면 별도의 limit이 걸리지 않습니다. 하지만 limits 를 설정하면 requests 값 또한 limits 값으로 설정됩니다.
requests 값에 맞는 worker node가 없다면 podpending 상태이며 스케줄링을 받지 못합니다.

7. 환경변수를 이용해 컨테이너에 데이터 전달하기

환경변수

Pod 내의 컨테이너가 실행될 때 필요로 하는 변수
컨테이너 제작시 미리 정의
NGINX Dockerfile의 예
ENV NGINX_VERSION 1.19.2
ENV NJS_VERSION 0.4.3
Pod 실행 시 미리 정의된 컨테이너 환경변수를 변경할 수 있다.

환경변수 사용 예

# pod-nginx-env.yaml apiVersion: v1 kind: Pod metadata: name: nginx-pod-env spec: containers: - name: nginx-container image: nginx:1.14 ports: - containerPort: 80 protocol: TCP env: - name: MYVAR value: "testvalue" # pod env 확인 kubectl get pods kubectl exec nginx-pod-env -- env
YAML
복사

8. Pod 구성 패턴의 종류

Pod 실행 패턴

Pod를 구성하고 실행하는 패턴
multi-container Pod

Pod 운영 실습

Create a static pod on node01 called mydb with image redis.
Create this pod on node01 and make sure that it is recreated/restarted automatically in case of a failure
Use /etc/kubernetes/manifests as the Static Pod path for example.
Kubernetes Configured for Static Pods
Pod mydb-node01 is Up and running
다음과 같은 조건에 맞는 Pod를 생성하시오.
Pod name: myweb, image: nginx:1.14
CPU 200m, Memory 500Mi 를 요구하고, CPU 1core, Memory 1Gi 제한 받는다.
Application 동작에 필요한 환경변수 DB=mydb를 포함한다.
namespace product에서 동작되어야한다.