<1> Pod 와 컨테이너 알아보기
<2> 컨테이너는 Pod의 network namespace 를 공유한다.
<3> 파드에 라벨(레이블) 설정 후 셀렉터를 통한 확인
<4> 노드셀렉터(nodeSelector) 를 이용한 특정 노드에 파드 배포
<5> 실행 명령 및 파라미터
<1> Pod 와 컨테이너 알아보기
1
cat << EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: myweb2
spec:
containers:
- name: myweb2-nginx
image: nginx
ports:
- containerPort: 80
protocol: TCP
- name: myweb2-netshoot
image: nicolaka/netshoot
command: ["/bin/bash"]
args: ["-c", "while true; do sleep 5; curl localhost; done"]
EOF
// containers: s가 붙는다.
2
[root@test11 ~]# k get pods
NAME READY STATUS RESTARTS AGE
myweb2 0/2 ContainerCreating 0 20s
[root@test11 ~]# k get pod -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
myweb2 2/2 Running 0 32s 198.18.0.221 game1-nodepool-w-11gc <none> <none>
[root@test11 ~]# k get pods
NAME READY STATUS RESTARTS AGE
myweb2 2/2 Running 0 36s
// Pod안에 컨테이너가 모두 정상이어야 2/2 가 된다.
Pod 안에 컨테이너.
1개 또는 1개 이상이 존재한다.
3
Pod 자세히 보기
describe pod
[root@test11 ~]# kubectl describe pod myweb2
Name: myweb2
Namespace: default
Priority: 0
Node: game1-nodepool-w-11gc/10.0.2.14
Start Time: Thu, 10 Mar 2022 08:02:36 +0900
Labels: <none>
Annotations: <none>
Status: Running
IP: 198.18.0.221
IPs:
IP: 198.18.0.221
Containers:
myweb2-nginx:
Container ID: containerd://df219e3e869ab256a1927f1d6218b15ef56adf4f8afa861a87cdf697de645b09
Image: nginx
Image ID: docker.io/library/nginx@sha256:1c13bc6de5dfca749c377974146ac05256791ca2fe1979fc8e8278bf0121d285
Port: 80/TCP
Host Port: 0/TCP
State: Running
Started: Thu, 10 Mar 2022 08:02:40 +0900
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-8h5s2 (ro)
myweb2-netshoot:
Container ID: containerd://8364b227021f5b3ea7b32cba0302c2684a177d3863f230c0ca0d2e413500f47f
Image: nicolaka/netshoot
Image ID: docker.io/nicolaka/netshoot@sha256:d6942ec583d8e2818f5a5d7a71c303e861a70a11396ad9e9d25b355842e97589
Port: <none>
Host Port: <none>
Command:
// Pod 를 보면 컨테이너가 2개 보인다.
Containers:
myweb2-nginx:
myweb2-netshoot:
<2> 컨테이너는 Pod의 network namespace 를 공유한다.
1
Pod안의 컨테이너는 네트워크가 같다. IP 가 같다.
kubectl logs -f myweb2 -c myweb2-nginx
127.0.0.1 - - [09/Mar/2022:23:11:27 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.80.0" "-"
자기 자신이다.
2
myweb2-netshoot: 컨테이너 \들어가기, IP 확인하기, 나가기
[root@test11 ~]# kubectl exec -it myweb2 -c myweb2-netshoot -- zsh
myweb2 ~ ifconfig -a
eth0 Link encap:Ethernet HWaddr 4E:8C:B6:3C:59:27
inet addr:198.18.0.221 Bcast:0.0.0.0 Mask:255.255.255.255
UP BROADCAST RUNNING MULTICAST MTU:8950 Metric:1
myweb2 ~ exit
3
myweb2-nginx 컨테이너 내부 들어가서 확인 하기
kubectl exec -it myweb2 -c myweb2-netshoot -- zsh
myweb2 ~ ifconfig -a
eth0 Link encap:Ethernet HWaddr 4E:8C:B6:3C:59:27
inet addr:198.18.0.221 Bcast:0.0.0.0 Mask:255.255.255.255
Pod안의 컨테이너는 네트워크가 같다. IP 가 같다.
네트워크 데몬 확인
myweb2 ~ netstat -tnlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN -
netstat: /proc/net/tcp6: No such file or directory
myweb2 ~ exit
[root@test11 ~]#
4
Pod 모두 삭제
kubectl delete pod --all
5
k get pods
<3> 파드에 라벨(레이블) 설정 후 셀렉터를 통한 확인
labels.yaml
1
cat << EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: myweb1
labels:
environment: production
app: nginx
spec:
containers:
- image: nginx
name: myweb1
ports:
- containerPort: 80
protocol: TCP
---
apiVersion: v1
kind: Pod
metadata:
name: myweb2
labels:
environment: dev
app: nginx
spec:
containers:
- image: nginx
name: myweb2
ports:
- containerPort: 80
protocol: TCP
EOF
2
root@test11 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myweb1 1/1 Running 0 12s
myweb2 1/1 Running 0 12s
3
# 파드 라벨 정보 확인
[root@test11 ~]# kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
myweb1 1/1 Running 0 27s app=nginx,environment=production
myweb2 1/1 Running 0 27s app=nginx,environment=dev
[root@test11 ~]#
4
# 셀렉터를 통한 확인
[root@test11 ~]# kubectl get pod -l environment=production
NAME READY STATUS RESTARTS AGE
myweb1 1/1 Running 0 54s
5
[root@test11 ~]# kubectl get pod -l app=nginx
NAME READY STATUS RESTARTS AGE
myweb1 1/1 Running 0 66s
myweb2 1/1 Running 0 66s
6
# 셀렉터를 활용하여 특정 파드 삭제
[root@test11 ~]# kubectl delete pod -l environment=production
pod "myweb1" deleted
[root@test11 ~]# kubectl get pod -l app=nginx
NAME READY STATUS RESTARTS AGE
myweb2 1/1 Running 0 100s
7
# 라벨 제거
[root@test11 ~]# kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
myweb2 1/1 Running 0 2m28s app=nginx,environment=dev
[root@test11 ~]#
# 라벨의 키 뒤에 -
// app 라벨 제거함
[root@test11 ~]# kubectl label pod myweb2 app-
pod/myweb2 unlabeled
[root@test11 ~]#
[root@test11 ~]# kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
myweb2 1/1 Running 0 3m6s environment=dev
[root@test11 ~]#
8
# 다음 실습을 위해서 생성된 파드 삭제
kubectl delete pod --all
<4> 노드셀렉터(nodeSelector) 를 이용한 특정 노드에 파드 배포
1
Pod 가 특정 노드에 할당되도록 스케줄링, nodeSelector 라는 property 를 이용
워커노드 1대에 라벨 지정 후 파드가 해당 워커노드에 배포되는지 확인
2
# 노드 기본 라벨 정보 확인
kubectl get node --show-labels
[root@test11 ~]# kubectl get node --show-labels
NAME STATUS ROLES AGE VERSION LABELS
game1-nodepool-w-11gc Ready <none> 15h v1.21.9 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/instance-type=SVR.VSVR.STAND.C002.M008.NET.SSD.B050.G002,beta.kubernetes.io/os=linux,failure-domain.beta.kubernetes.io/region=1,failure-domain.beta.kubernetes.io/zone=2,kubernetes.io/arch=amd64,kubernetes.io/hostname=game1-nodepool-w-11gc,kubernetes.io/os=linux,ncloud.com/nks-nodepool=game1-nodepool,nodeId=10292321,regionNo=1,zoneNo=2
[root@test11 ~]#
# 커맨드로 노드1에 라벨 설정
[root@test11 ~]# kubectl label node game1-nodepool-w-11gc gpu=ndivia
node/game1-nodepool-w-11gc labeled
[root@test11 ~]# kubectl get node --show-labels
NAME STATUS ROLES AGE VERSION LABELS
game1-nodepool-w-11gc Ready <none> 15h v1.21.9 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/instance-type=SVR.VSVR.STAND.C002.M008.NET.SSD.B050.G002,beta.kubernetes.io/os=linux,failure-domain.beta.kubernetes.io/region=1,failure-domain.beta.kubernetes.io/zone=2,gpu=ndivia,kubernetes.io/arch=amd64,kubernetes.io/hostname=game1-nodepool-w-11gc,kubernetes.io/os=linux,ncloud.com/nks-nodepool=game1-nodepool,nodeId=10292321,regionNo=1,zoneNo=2
[root@test11 ~]#
3
cat << EOF > labels-node.yaml
apiVersion: v1
kind: Pod
metadata:
name: myweb
spec:
containers:
- image: nginx
name: myweb
ports:
- containerPort: 80
protocol: TCP
nodeSelector:
gpu: ndivia
EOF
kubectl apply -f labels-node.yaml
4
# 파드 배포 노드 확인
[root@test11 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
myweb 1/1 Running 0 10s 198.18.0.20 game1-nodepool-w-11gc <none> <none>
[root@test11 ~]#
# 파드를 3개 더 생성
cat labels-node.yaml | sed "s/name: myweb/name: myweb2/g" | kubectl apply -f -
cat labels-node.yaml | sed "s/name: myweb/name: myweb3/g" | kubectl apply -f -
cat labels-node.yaml | sed "s/name: myweb/name: myweb4/g" | kubectl apply -f -
cat labels-node.yaml
# 파드 배포 노드 확인 : 파드가 워커 노드에 분산 배치되지 않는다!
[root@test11 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
myweb 1/1 Running 0 3m12s 198.18.0.20 game1-nodepool-w-11gc <none> <none>
myweb2 1/1 Running 0 15s 198.18.0.174 game1-nodepool-w-11gc <none> <none>
myweb3 1/1 Running 0 14s 198.18.0.191 game1-nodepool-w-11gc <none> <none>
myweb4 1/1 Running 0 13s 198.18.0.224 game1-nodepool-w-11gc <none> <none>
// node를 2개 이상 생성해 테스트 하자
5
# 다음 실습을 위해서 생성된 파드 삭제
kubectl delete pod --all
<5> 실행 명령 및 파라미터
파드 생성 시 실행 명령(command = 도커의 Entrypoint)과 파라미터(arge = 도커의 Cmd)를 전달할 수 있습니다
1
# nginx 파드 생성
kubectl run cmd-args --image nginx
# 생성된 워커 노드 확인
kubectl get pod -owide
2
cat << EOF > cmd-args.yaml
apiVersion: v1
kind: Pod
metadata:
name: cmd-args
spec:
restartPolicy: OnFailure
containers:
- image: nginx
name: cmd-args-nginx
ports:
- containerPort: 80
protocol: TCP
command: ["/bin/echo"]
args: ["hello"]
EOF
3
kubectl apply -f cmd-args.yaml
4
# 파드가 실행 후 정상 종료된 상태이다
[root@test11 ~]# kubectl get pod -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
cmd-args 0/1 Completed 0 6s 198.18.0.26 game1-nodepool-w-11gc <none> <none>
[root@test11 ~]#
5
# 파드의 로그 확인
[root@test11 ~]# kubectl logs cmd-args
hello
[root@test11 ~]#
6
# 워커노드에서 컨테이너 상세 정보 확인 : Entrypoint 와 Cmd 값이 덮어씌어진것을 알 수 있다!
docker inspect <종료된 컨테이너 ID>
...
"Config": {
...
"Entrypoint": ["/bin/echo"]
"Cmd": ["hello"]
...
7
# 다음 실습을 위해서 생성된 파드 삭제
kubectl delete pod --all
다음 과정
https://brunch.co.kr/@topasvga/2235
https://brunch.co.kr/@topasvga/2240
감사합니다.