[ CKA ] #2. Pod (1)

※ 본 글은 작성 후에도 기재 순서의 변경 및 내용 업데이트 예정
CKA 시험은 오픈북 형식으로 크롬에서 몇 가지 URL 를 허용해준다.
대부분의 커맨드 및 설명은 공식문서에 있으나, 시험 중에 바로바로 찾으려면 평소에 숙달이 되어야 한다
주요 명령어의 북마크 등을 미리 설정해 놓는 것도 좋을 것 같다.

Pod ?

Kubernetes 에서 최소 배포 단위 
최소 옵션으로 생성 시, Pod 라는 하나의 공간 안에 서비스 Container 와 
Pod의 Network 정보를 가지고 있는 /pause 컨테이너로 기본적인 생성이 된다.
즉 Pod 라는 최소 단위 안에는, 컨테이너가 한 개 이상 및 볼륨 등의 다른 서비스도 존재할 수 있다.
외부에서는 Pod 의 Network 만 인지하고 있겠지만, /pause 가 내부 컨테이너들을 포트로 구분하는 역할을 해준다.

Pod Create

# 실행 전에 yaml 형식의 사전 테스트 모드인 dry run 을 항상 실행해보는 것이 좋다
$ kubectl run hello --image=nginx --dry-run=client -o yaml 
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: hello
  name: hello
spec:
  containers:
  - image: nginx
    name: hello
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

# 실제 실행은 위 명령어를 | (파이프)를 사용하여 실제 적용(apply) 의 - 표준 입력으로 넘겨 사용 하는 형식도 권장한다

kubectl run hello2 --image=nginx --dry-run=client -o yaml | kubectl apply -f -
kubectl get pods -o wide

# nodeName 을 추가하여 원하는 노드에 pod 생성이 가능하다. 
이 방식은 Taint 의 스케쥴을 무시한다.  
yaml 파일에 nodeName 을 추가 지정해 주면 된다. 
$ kubectl run hi --image=nginx --dry-run=client -o yaml  > hi.yaml
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: hi
  name: hi
spec:
  containers:
  - image: nginx
    name: hi
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
  nodeName: user-controller      ## Node 기입 
status: {}

# 정의된 YAML 을 이용한 Pod 생성 
$ kubectl create -f hi.yaml
$ kubectl get pods -o wide
NAME                     READY   STATUS    RESTARTS   AGE     IP                NODE              NOMINATED NODE   READINESS GATES
hello-776c774f98-894tt   1/1     Running   0          18h     192.168.153.193   user-worker       <none>           <none>
hi                       1/1     Running   0          3m10s   192.168.136.5     user-controller   <none>           <none>

Pod status 확인하기

$ kubectl describe pod hi

# Pod 에 직접 접근해보기. -- kubectl 의 arg 와의 옵션 구분을 위해 -- 를 사용이 권장되는 추세이다
$ kubectl exec -it hi -- /bin/bash 
root@hi:/# 

어플리케이션 Pod 배포하기

# 다중 수량 옵션인 --replicas 를 지정할 수 있다. deployment 옵션이 커맨드에 들어간다.
$ kubectl create deployment web --image=nginx --replicas=3
deployment.apps/web created
$ kubectl get pods -o wide | grep -i web
web-76b56fd968-c2pk9     1/1     Running   0          11s   192.168.153.217   user-worker       <none>           <none>
web-76b56fd968-chr4w     1/1     Running   0          11s   192.168.136.6     user-controller   <none>           <none>
web-76b56fd968-mmdfn     1/1     Running   0          11s   192.168.153.218   user-worker       <none>           <none>

Pod log 확인하기

# Pod info 확인
kubectl describe pod hi 

# Pod log 확인 
kubectl logs hi 

# journal Log(kubelet) 확인
sudo journalctl -u kubelet

# 하위 레벨 Log 확인. 
hi POD 내의 Container 탐색. 
/pause 컨테이너가 Pod의 포워딩 네트워크 정보. nignx 컨테이너가 서비스 컨테이너이다
$ sudo docker ps -a | grep -i hi
d507d8b298c3   nginx                       "/docker-entrypoint.…"   26 hours ago   Up 26 hours                         k8s_hi_hi_default_6a1464a1-0fea-4ff8-a5c6-426afe281173_0
d8fb1a992247   k8s.gcr.io/pause:3.6        "/pause"                 26 hours ago   Up 26 hours                         k8s_POD_hi_default_6a1464a1-0fea-4ff8-a5c6-426afe281173_0

# nginx Service Container info
$ sudo docker inspect d507d8b298c3
$ sudo docker logs d507d8b298c3

# Pod Network info
$ sudo docker inspect d8fb1a992247
$ sudo docker logs d8fb1a992247

# Container 레벨에서 접근해보기. 서비스 컨테이너만 접근 가능하다
$ sudo docker exec -it d507d8b298c3 ls
bin   docker-entrypoint.d   home   media  proc  sbin  tmp
boot  docker-entrypoint.sh  lib    mnt    root  srv   usr
dev   etc                   lib64  opt    run   sys   var

$ sudo docker exec -it d507d8b298c3 /bin/bash
root@hi:/#

# 컨테이너 내에 Net 관련 명령어가 없어 불편하다면 nsenter 를 사용해본다.
ip 명령이 없어서 확인이 어렵다
$ $ sudo docker exec -it d507d8b298c3 ip addr
OCI runtime exec failed: exec failed: container_linux.go:380: starting container process caused: exec: "ip": executable file not found in $PATH: unknown

컨테이너 PID 추출한다
$ sudo docker inspect --format '{{ .State.Pid }}' d507d8b298c3
1244489

nsenter 를 사용하여 해당 PID 를 대상으로 클라이언트(pod namespace가 위치한) 레벨의 명령어 실행이 가능하다.
$ sudo nsenter -t 1244489 -n ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
    link/ipip 0.0.0.0 brd 0.0.0.0
4: eth0@if12: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1480 qdisc noqueue state UP group default
    link/ether c6:3d:04:5d:80:82 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.136.5/32 scope global eth0
       valid_lft forever preferred_lft forever

Pod delete

# 일반 Pod 삭제
$ kubectl delete hi

# 어플리케이션 Pod Delete. replicas 로 다중 배포한 모두가 삭제된다. 
$ kubectl delete deployment web
deployment.apps "web" deleted
$ kubectl get pods -o wide | grep -i web
-

참고 자료

Pod :  https://kubernetes.io/docs/concepts/workloads/pods/
Pod Networking : https://www.digitalocean.com/community/tutorials/how-to-inspect-kubernetes-networking
image_print
카테고리: Kubernetes