[K8S] Pod 생성 조회 및 삭제 / 로그 추출 / Static Pod 생성

HYEOB KIM·2022년 7월 14일
1

kubernetes

목록 보기
9/14

Pod

  • 컨테이너를 표현하는 쿠버네티스 API 최소 단위
  • 컨테이너가 하나 또는 여러 개의 컨테이너가 포함될 수 있습니다.

명령어로 Pod 생성, 조회 및 삭제

nginx 웹 서버 컨테이너를 pod로 동작시키기

  • pod name: web
  • image: nginx:1.14
  • port: 80
# 파드 생성
% kubectl run web --image=nginx:1.14 --port=80
# 파드 조회
% kubectl get pods
% kubectl get pods -o wide
# 파드 삭제
% kubectl delete pod web

yaml 파일로 Pod 생성, 조회 및 삭제

파드 생성 결과를 yaml 파일로 추출합니다.
(--dry-run 옵션을 통해 실제로 파드를 생성하지는 않습니다)

# 파드를 yaml 파일로 추출
% kubectl run web --image=nginx:1.14 --port=80 --dry-run=client -o yaml > web.yaml

% ls
web.yaml

% cat web.yaml
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: web
  name: web
spec:
  containers:
  - image: nginx:1.14
    name: web
    ports:
    - containerPort: 80
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

# 파드를 조회해보면 파드 생성 시에 --dry-run 옵션을 주었으므로 파드가 실제로 생성되진 않았습니다.
% kubectl get pod
NAME                        READY   STATUS    RESTARTS       AGE
eshop-cart-app              1/1     Running   4 (110d ago)   113d
front-end-8dc556958-fvlpx   1/1     Running   2 (111d ago)   133d
front-end-8dc556958-vcr4s   1/1     Running   3 (111d ago)   133d
nginx-79488c9578-qwnfk      1/1     Running   2 (110d ago)   111d
nginx-79488c9578-xpsvp      1/1     Running   1 (111d ago)   111d

이제 yaml 파일을 수정한 후 yaml 파일로 파드를 생성 및 삭제해봅시다.

% vim web.yaml
apiVersion: v1
kind: Pod
metadata:
  name: web
spec:
  containers:
  - image: nginx:1.14
    name: web
    ports:
    - containerPort: 80
    
# 수정 후에 yaml 파일을 이용해 파드를 실행
% kubectl apply -f web.yaml
pod/web created

% kubectl get pods web
NAME   READY   STATUS    RESTARTS   AGE
web    1/1     Running   0          8s

% kubectl get pods web -o wide
NAME   READY   STATUS    RESTARTS   AGE   IP            NODE          NOMINATED NODE   READINESS GATES
web    1/1     Running   0          15s   10.244.1.29   k8s-worker1   <none>           <none>

# yaml 파일을 이용해 파드 삭제
% kubectl delete -f web.yaml
pod "web" deleted

CKA 문제 유형

  • 작업 클러스터: 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"

1. k8s로 클러스터 이동

% kubectl config use-context k8s
Switched to context "k8s".

% kubectl config current-context
k8s

2. cka-exam이라는 이름의 네임스페이스 생성

% kubectl create namespace cka-exam
namespace/cka-exam created

3. 파드 생성 yaml 파일 만들기

% kubectl run pod-01 --image=busybox --dry-run=client -o yaml > pod-01.yaml

4. yaml 파일에 환경 변수 추가하기

환경변수 설정 방법은 쿠버네티스 공식 문서 - Pod Enviorment Variable를 참고하세요.
커맨드와 아규먼트 설정 방법은 쿠버네티스 공식 문서 - Pod Command를 참고하세요.

% vim pod-01.yaml

# 아래와 같이 수정합니다.
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: pod-01
  name: pod-01
  namespace: cka-exam
spec:
  containers:
  - image: busybox
    name: pod-01
    env:
    - name: CERT
      value: "CKA-cert"
    command: ["/bin/sh"]
    args: ["-c", "while true; do echo $(CERT); sleep 10; done"]

5. 파드 생성하기

% kubectl apply -f pod-01.yaml
pod/pod-01 created

% kubectl get pod pod-01 --namespace=cka-exam -o wide
NAME     READY   STATUS    RESTARTS   AGE   IP            NODE          NOMINATED NODE   READINESS GATES
pod-01   1/1     Running   0          73s   10.244.1.30   k8s-worker1   <none>           <none>

CKA 문제 유형 2

  • 작업 클러스터: hk8s
    파드 custom-app의 log를 모니터링하고 file not found 메세지를 포함하는 log 라인을 추출하세요.
    추출된 결과는 /opt/REPORT/2022/custom-app-log에 기록하세요.

1. hk8s로 클러스터 이동

% kubectl config use-context hk8s
Switched to context "hk8s".

% kubectl config current-context
hk8s

2. 실행 중인 파드 확인 후에 custom-app 파드의 로그 조회

# 실행 중인 파드를 조회해 custom-app이 있는지 확인
% kubectl get pod
NAME            READY   STATUS      RESTARTS       AGE
busybox-sleep   0/1     Error       2              135d
campus-01       1/1     Running     3 (110d ago)   135d
cka-webserver   0/1     Completed   2              135d
custom-app      0/1     Error       2              135d
fast-01         0/1     Error       2              135d
web             0/1     Completed   29             135d

# 로그 조회
% kubectl logs custom-app
find files
error: file not found
Today: Wed Mar  2 03:14:05 KST 2022
Hostname: console
find files
error: file not found
Today: Wed Mar  2 03:14:05 KST 2022
Hostname: console

3. 특정 로그 메세지 추출 후 지정 경로에 저장

# 'file not found'라는 메세지를 추출
% kubectl logs custom-app | grep "file not found"
error: file not found
error: file not found

# 지정 경로에 메세지 저장 후 확인
% kubectl logs custom-app | grep "file not found" > /opt/REPORT/2022/custom-app-log
% cat /opt/REPORT/2022/custom-app-log
error: file not found
error: file not found

Static Pod 생성

  • API 서버 없이 특정 노드에 있는 kubelet에 의해 직접 관리되는 Pod입니다.

  • /etc/kubernetes/manifests 디렉토리에 pod에 대한 yaml 파일을 저장 시 static pod가 생성됩니다.

  • staticPod의 경로 확인
    kubelet의 config 파일은 /var/lib/kubelet/config.yaml에 위치하고 이 안에 staticPodPath: /etc/kubernetes/manifests가 정의되어 있습니다.

% cat /var/lib/kubelet/config.yaml
...
staticPodPath: /etc/kubernetes/manifests
  • 디렉토리 수정 시 kubelet 데몬 재실행
% systemctl restart kubelet

static pod 만들기

1. hk8s-w1에 접속

% ssh hk8s-w1

2. root 유저로 전환

% sudo -i

3. /var/lib/kubelet/config.yaml에서 static pod의 경로를 확인(기본값: /etc/kubernetes/manifests)

% cat /var/lib/kubelet/config.yaml | grep staticPodPath
staticPodPath: /etc/kubernetes/manifests

4. static pod 생성

# static pod 경로로 이동
% cd /etc/kubernetes/manifests/

# yaml 파일을 생성해 static pod 생성
% kubectl run webserver --image=nginx:1.14 --port=80 --dry-run=client -o yaml > webserver.yaml

% ls
webserver.yaml

% cat webserver.yaml
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: webserver
  name: webserver
spec:
  containers:
  - image: nginx:1.14
    name: webserver
    ports:
    - containerPort: 80
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

# static pod 생성 확인
% kubectl get pods
NAME                READY   STATUS             RESTARTS         AGE
busybox-sleep       1/1     Running            3 (110d ago)     135d
campus-01           1/1     Running            3 (110d ago)     135d
cka-webserver       1/1     Running            3 (110d ago)     135d
custom-app          1/1     Running            3 (110d ago)     135d
fast-01             1/1     Running            3 (110d ago)     135d
web                 0/1     CrashLoopBackOff   44 (2m51s ago)   135d
webserver-hk8s-w1   1/1     Running            0                88s

# yaml 파일을 삭제함으로써 static pod 삭제
% rm webserver.yaml
rm: remove regular file ‘webserver.yaml’? y

# static pod 삭제 확인
% kubectl get pods
NAME            READY   STATUS             RESTARTS         AGE
busybox-sleep   1/1     Running            3 (110d ago)     135d
campus-01       1/1     Running            3 (110d ago)     135d
cka-webserver   1/1     Running            3 (110d ago)     135d
custom-app      1/1     Running            3 (110d ago)     135d
fast-01         1/1     Running            3 (110d ago)     135d
web             0/1     CrashLoopBackOff   44 (4m35s ago)   135d

CKA 문제 유형 3

  • 작업 클러스터: hk8s-w1
    hk8s-w1 노드에 nginx-static-pod.yaml라는 이름의 Static Pod를 생성하세요.
  • pod name: nginx-static-pod
  • image: nginx
  • port: 80

1. hk8s-w1에 접속

% ssh hk8s-w1

2. root 유저로 전환

% sudo -i

3. /var/lib/kubelet/config.yaml에서 static pod의 경로를 확인(기본값: /etc/kubernetes/manifests)

% cat /var/lib/kubelet/config.yaml | grep staticPodPath
staticPodPath: /etc/kubernetes/manifests

4. static pod 생성

% cd /etc/kubernetes/manifests/

% kubectl run nginx-static-pod --image=nginx --port=80 --dry-run=client -o yaml > nginx-static-pod.yaml

% kubectl get pod
NAME                       READY   STATUS             RESTARTS       AGE
busybox-sleep              1/1     Running            3 (110d ago)   135d
campus-01                  1/1     Running            3 (110d ago)   135d
cka-webserver              1/1     Running            3 (110d ago)   135d
custom-app                 1/1     Running            3 (110d ago)   135d
fast-01                    1/1     Running            3 (110d ago)   135d
nginx-static-pod-hk8s-w1   1/1     Running            0              10s
web                        0/1     CrashLoopBackOff   47 (25s ago)   135d

멀티 컨테이너 Pod

  • 하나의 Pod에 여러 개의 컨테이너가 포함되어 함께 실행되는 형태
  • 컨테이너 간에 의존성이 있다면 같이 하나의 파드로 묶어서 실행

CKA 문제 유형 4

  • 작업 클러스터: k8s
    4개의 컨테이너를 동작시키는 eshop-frontend 파드를 생성하세요.
  • pod image: nginx, redis, memcached, consul

1. k8s로 클러스터 이동

% kubectl config use-context k8s

2. eshop-frontend라는 이름의 파드를 생성

% kubectl run eshop-frontend --image=nginx --dry-run=client -o yaml > eshop-frontend.yaml

% vim eshop-frontend.yaml

# 아래와 같이 편집합니다.
$ cat eshop-frontend.yaml
apiVersion: v1
kind: Pod
metadata:
  name: eshop-frontend
spec:
  containers:
  - image: nginx
    name: eshop-frontend
  - image: redis
    name: redis-frontend
  - image: memcached
    name: memcached-frontend
  - image: consul
    name: consul-frontend
    
% kubectl apply -f eshop-frontend.yaml
pod/eshop-frontend created
 
% kubectl get pod eshop-frontend
NAME             READY   STATUS              RESTARTS   AGE
eshop-frontend   0/4     ContainerCreating   0          28s

사이드카 컨테이너 Pod(CKA 필수 유형)

  • 기본 컨테이너 기능을 확장하기 위해 사용합니다.
  • 본래의 컨테이너는 기본 서비스에 충실하고, 추가 기능을 별도의 컨테이너에 적용합니다.
  • 웹서버는 기본 서비스에 충실하고, 추가로 생성되는 웹서버 로그는 별도의 사이드카 컨테이너가 수집해서 외부 log aggregator로 전송하는 형태의 서비스입니다.
main container -----> volume -----> sidecar container
    nginx           shared-logs          busybox

yaml 파일을 통해 예시를 살펴봅시다.

apiVersion: v1
kind: Pod
metadata:
  name: webserver
spec:
  volumes:
  - name: shared-logs
    emptyDir: {}
  containers:
  - name: main
    image: nginx
    volumeMounts:
    - name: shared-logs
      mountPath: /var/log/nginx
  - name: sidecar
    image: busybox
    command: ["sh","-c","while true; do cat /log/access.log /log/error.log; sleep 10; done"]
    volumeMounts:
    - name: shared-logs
      mountPath: /log

main 컨테이너의 /var/log/nginx에 들어있는 로그를 shared-logs라는 볼륨에 마운트하고 sidecar 컨테이너에서 shared-logs/log에 마운트합니다. 이후 sidecar 컨테이너에서 commandaccess.logerror.log 파일을 보여주도록 명령어를 입력합니다.

CKA 문제 유형 5

  • 작업 클러스터: k8s
    현재 운영중인 eshop-cart-app 파드의 로그를 Kubernetes built-in logging 아키텍처(예: kubectl logs)에 통합하는 로그 스트리밍 사이드카 컨테이너를 운영하세요.
  • busybox 이미지를 사용. price라는 이름의 사이드카 컨테이너르르 기존 eshop-cart-app에 추가
  • price 컨테이너는 아래의 command 실행
    "/bin/sh", "-c", "tail -n+1 -f /var/log/cart-app.log"
  • /var/log에 마운트된 볼륨을 사용하여 사이드카 컨테이너에서 로그 파일 cart-app.log를 사용
  • eshop-cart-app 파드와 cart-app 컨테이너를 수정하지 마세요.

쿠버네티스 공식 문서 - 사이드카 컨테이너를 참고하세요.

1. 실행중인 eshop-cert-app 파드를 yaml 파일로 추출

% kubectl get pod eshop-cart-app -o yaml > eshop-cart-app.yaml

2. yaml 파일 수정

% vim eshop-cart-app.yaml

# 공식문서를 참고해서 아래와 같이 수정합니다.
apiVersion: v1
kind: Pod
metadata:
  name: eshop-cart-app
spec:
  containers:
  - command:
    - /bin/sh
    - -c
    - 'i=1;while :; do echo -e "$i: Price: $((RANDOM % 10000 + 1))" >> /var/log/cart-app.log;
      i=$((i+1)); sleep 2; done'
    image: busybox
    imagePullPolicy: Always
    name: cart-app
    volumeMounts:
    - mountPath: /var/log
      name: varlog
  - name: price
    image: busybox
    args: [/bin/sh, -c, 'tail -n+1 -f /var/log/cart-app.log']
    volumeMounts:
    - name: varlog
      mountPath: /var/log
  volumes:
  - emptyDir: {}
    name: varlog

3. 기존의 Pod를 지우고 yaml 파일로 Pod를 새로 생성

# 기존의 eshop-cart-app 파드를 삭제합니다.
% kubectl delete pod eshop-cart-app
pod "eshop-cart-app" deleted

# 파드를 yaml 파일로 다시 생성합니다.
% kubectl apply -f eshop-cart-app.yaml
pod/eshop-cart-app created

# 정상 동작 확인
% kubectl get pod eshop-cart-app
NAME             READY   STATUS    RESTARTS   AGE
eshop-cart-app   2/2     Running   0          13s

4. 사이드카 컨테이너에서 로그 확인

% kubectl logs eshop-cart-app -c price
...
192: Price: 5915
193: Price: 8018
194: Price: 5189
195: Price: 2873
profile
Devops Engineer

0개의 댓글