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-myservice 와 init-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 파일을 작성하면 해당 pod은 static 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가 없다면 pod은 pending 상태이며 스케줄링을 받지 못합니다.
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에서 동작되어야한다.
답


