brunch

You can make anything
by writing

C.S.Lewis

by Master Seo Mar 10. 2022

113. Pod 와 컨테이너 알아보기 3/8


<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


감사합니다.

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari