1. Pod란?
- 컨테이너를 표현하는 k8s API의 최소 단위
- Pod에는 하나 또는 여러 개의 컨테이너가 포함될 수 있음
2. Pod 생성
2-1. 명령어로 CLI 모드에서 생성
- nginx 웹 서버 컨테이너를 pod로 동작시키기
# pod name: web, image: nginx:1.14, port: 80인 파드 생성
$ kubectl run web --image=nginx:1.14 --port=80
✍ --dry-run 옵션 : 파드를 생성 할 수 있는지 없는지 실제로 실행시키지 않고 여부만 알려줌
2-2. yaml 템플릿으로 생성
- nginx 웹 서버 컨테이너를 pod로 동작시키기
# pod name: web, image: nginx:1.14, port: 80인 파드 생성
<yaml 파일>
apiVersion: v1
kind: Pod
metadata:
name: web
spec:
containers:
- image: nginx:1.14
name: web
ports:
- containerPort: 80
# yaml 파일을 만든 뒤 yaml 파일 실행
$ kubectl apply -f web.yaml
※ 문제1: Pod 생성하기
(참고 URL: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#%EC%85%B8-%EC%95%88%EC%97%90%EC%84%9C-%EC%BB%A4%EB%A7%A8%EB%93%9C-%EC%8B%A4%ED%96%89%ED%95%98%EA%B8%B0)
- 작업 클러스터 : k8s
- 'cka-exam'이라는 namespace를 만들고, 'cka-exam' namespace에 아래와 같은 Pod를 생성하시오.
- pod Name : pod-01
- image : busybox
- 환경변수 : CERT = "CKA-cert"
- command : /bin/sh
- args : -c "while true; do echo $(CERT); sleep 10; done"
- 작업 클러스터 변경
$ kubectl config use-context k8s
- 'cka-exam' namespace 생성
$ kubectl create namespace cka-exam
- 이름이 pod-01, image가 busybox인 pod 생성 및 yaml 파일 생성
$ kubectl run pod-01 --image=busybox --dry-run -o yaml > 2-1.yaml
- 2-1.yaml 파일 수정
apiVersion: v1
kind: Pod
metadata:
name: pod-01
namespace: cka-exam
spec:
containers:
- env:
- name: CERT
value: CKA-cert
image: busybox
name: pod-01
command: ["/bin/sh"]
args: ["-c","while true; do echo $(CERT); sleep 10;done"]
- 수정한 2-1.yaml 파일 apply
$ kubectl apply -f 2-1.yaml
3. Static Pod 만들기
- API 서버 없이 특정 노드에 있는 kubelet에 의해 직접 관리
- /etc/kubernetes/manifests/ 디렉토리에 pod yaml 파일을 저장 시 적용됨
- static pod 디렉토리 구성
# cat /var/lib/kubelet/config.yaml
<config.yaml 파일 내용>
...
staticPodPath: /etc/kubernetes/manifests
# systemctl restart kubelet
만약 hk8s-w1에 static Pod를 만든다면?
1. ssh로 hk8s-w1 서버에 접속
2. sudo -i로 root 권한을 얻음
3. /etc/kubernetes/manifests 디렉토리에 pod yaml파일을 저장
※ 문제2: static pod 생성하기
- hk8s-w1 노드에 nginx-static-pod2.yaml 라는 이름의 Static Pod를 생성하시오.
- pod name: nginx-static-pod2
- image: nginx
- port: 80
-
hk8s-w1 노드에 접속
-
root 계정으로 변경 후 어디에다가 static Pod를 만들어야하는지 확인
📌 staticPodPath 경로 확인
-
/etc/kubernetes/manifests 경로로 이동하여 static pod 생성 후 실행
-
실행 결과 확인
4. multi-container
- 하나의 Pod에 여러 개의 컨테이너가 포함되어 함께 실행됨
※ 문제3: multi container Pod 생성하기
(참고 URL: https://kubernetes.io/docs/tasks/access-application-cluster/communicate-containers-same-pod-shared-volume/#creating-a-pod-that-runs-two-containers)
- 작업 클러스터 : k8s
- 4개의 컨테이너를 동작시키는 eshop-frontend Pod를 생성하시오.
- pod image: nginx, redis, memcached, consul
-
k8s 클러스터로 이동
-
eshop-frontend Pod 생성
-
3-2.yaml 파일 수정 후 저장
-
3-2.yaml 파일 apply
-
결과 확인
5. sidecar-container
- 기본 컨테이너 기능을 확장하기 위해 사용
- 본래의 컨테이너는 기본 서비스에 충실하고, 추가 기능을 별도의 컨테이너를 이용해 적용
- 웹서버는 기본서비스에 충실하고, 추가로 생성되는 웹서버 로그는 별도의 사이드 카 컨테이너가 수집하여 외부 log aggregator로 전송하는 형태의 서비스
※ 문제4 : sidecar container Pod 생성하기
(참고 URL: https://kubernetes.io/docs/concepts/cluster-administration/logging/#sidecar-container-with-logging-agent)
- 작업 클러스터 : k8s
- 현재 운영중인 eshop-cart-app Pod의 로그를 Kubernetes built-in logging 아키텍처에 통합하는 로그 스트리밍 사이드카 컨테이너를 운영하시오.
- busybox 이미지를 사용하여 price라는 이름의 사이드카 컨테이너를 기존 eshop-cart-app에 추가합니다.
- 새 price 컨테이너는 다음과 같은 command를 실행해야 합니다.
Command: /bin/sh, -c, "tail -n+1 -f /var/log/cart-app.log"
- /var/log에 마운트 된 볼륨을 사용하여 사이드카 컨테이너에서 로그 파일 cart-app.log를 사용해야 합니다.
- eshop-cart-app Pod와 cart-app 컨테이너를 수정하지 마시오.
-
k8s 클러스터로 이동
-
eshop-cart-app 파드를 yaml 파일로 복사하여 저장 후 편집 실행(기존에 eshop-cart-app 파드가 존재)
-
yaml 파일 수정(sidecar container 추가) 후 저장
- 3-3.yaml 파일 apply
- 결과 확인
📌 eshop-cart-app를 log로 확인