[ 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