Kubernetes Pods

Pod 란?

Pod(파드)는 Application의 최소 실행 단위이며, Kubernetes에서 관리의 기본 단위로써 그룹화한 가상 호스트와 같은 것을 의미한다.
즉, Kubernetes에서 컨테이너, 혹은 컨테이너들의 묶음을 지칭하는 이름이다. 그냥 단순하게 컨테이너라고 보면 된다.

이 Pod는 가상 Network Interface(동일한 IP, 파일 시스템)를 공유하기 때문에 가상 호스트와 같은 역할을 한다.
하나 혹은 다수의 Application container, storage, network 등의 정보를 포함한다.

Pod의 특징

  • Pod에는 각각 고유한 private IP 할당한다.
  • Pod 안에 있는 container는 pod 의 IP를 local host 로 공유한다.
  • Pod는 사실상 Pod를 가지고 있는 virtual machine이라고 할 수 있다.

Pod 제어

이러한 Pod를 만들고 정보를 확인하는 방법을 살펴 보겠다.

Pod 기동 - kubectl run

우선은 Pod의 기동에 대해 알아보겠다. 아래 명령을 실행하면 Pod가 기동된다.

kubectl run –-image [이미지명]:[태그명] (옵션) [Pod명]

아래 명령으로 WebServer인 nginx를 띄어보도록 하겠다.

kubectl run webserver --image=nginx:1.14 --port 80

실행 결과:

% kubectl run webserver --image=nginx:1.14 --port 80
pod/webserver created

kubectl run에 대해서도 docker run과 마찬가지로 다양한 옵션을 지정할 수 있다. 예를 들어, -e 옵션을 사용하여 환경 변수를 설정할 수 있다. 기타 옵션은 아래 페이지를 참조하여라.

Pod 목록 조회 - kubectl get

Pod 목록을 보려면 다음과 같은 명령을 실행한다.

kubectl get pods

실행 결과:

% kubectl get pods
NAME        READY   STATUS              RESTARTS   AGE
webserver   0/1     ContainerCreating   0          4s

생성하자 마자 바로 실행하면 위와 같이 상태가 생성중(ContainerCreating)이라는 메세지가 나온다.

% kubectl get pods
NAME        READY   STATUS    RESTARTS   AGE
webserver   1/1     Running   0          16s

시간이 좀 더 지나서 해보면, 실행 상태(Running)라는 메세지가 나온다.

Pod 목록을 상세하게 더 보려면 다음과 같은 명령을 실행한다.

kubectl get pods -o wide

실행 결과:

% kubectl get pods -o wide
NAME        READY   STATUS              RESTARTS   AGE   IP       NODE       NOMINATED NODE   READINESS GATES
webserver   0/1     Running             0          9s    <none>   minikube   <none>           <none>

Pod 상세 조회 - kubectl describe

Pod의 메타데이터를 보려면, 다음 명령을 실행한다.

kubectl describe pod [Pod명]

실행 결과:

% kubectl describe pod webserver
Name:             webserver
Namespace:        default
Priority:         0
Service Account:  default
Node:             minikube/192.168.49.2
Start Time:       Fri, 09 Sep 2022 08:36:18 +0900
Labels:           run=webserver
Annotations:      <none>
Status:           Running
IP:               172.17.0.3
IPs:
  IP:  172.17.0.3
Containers:
  webserver:
    Container ID:   docker://dddee2b98f8badd1a09208d99e02ba881f79091a9670e42862a7aa5f45ec4200
    Image:          nginx:1.14
    Image ID:       docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d
    Port:           80/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Fri, 09 Sep 2022 08:36:30 +0900
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-xmw8p (ro)
Conditions:
  Type              Status
  Initialized       True
  Ready             True
  ContainersReady   True
  PodScheduled      True
Volumes:
  kube-api-access-xmw8p:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       <nil>
    DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  22s   default-scheduler  Successfully assigned default/webserver to minikube
  Normal  Pulling    22s   kubelet            Pulling image "nginx:1.14"
  Normal  Pulled     11s   kubelet            Successfully pulled image "nginx:1.14" in 11.180480547s
  Normal  Created    11s   kubelet            Created container webserver
  Normal  Started    10s   kubelet            Started container webserver

Pod log 확인 - kubectl logs

Pod의 로그를 보고 싶다면, 다음 명령을 실행한다.

kubectl logs [Pod명]

실행 결과:

% kubectl logs webserver
172.17.0.4 - - [08/Sep/2022:23:38:30 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.85.0-DEV" "-"

Pod 실행 결과 확인 - curl

curl 명령어로 접속이 되는지 확인 해보겠다.

curl [IP]

실행 결과:

$ curl 172.17.0.3
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

Pod에 들어가 보기 - kubectl exec

작성한 Pod 안에 들어가기 위해서는 다음의 커멘드를 실행한다.

kubectl exec -it [Pod명] [이미지명]

실행 결과:

Pod 안으로 들어간다.

% kubectl exec webserver -it -- /bin/bash
root@webserver:/#

nginx의 첫페이지 파일이 있는 경로 이동한다.

root@webserver:/# cd /usr/share/nginx/html/

내용을 확인 한다.

root@webserver:/usr/share/nginx/html# cat index.html
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

내용을 수정한다.

root@webserver:/usr/share/nginx/html# echo "Hello, devkuma" > index.html

수정된 내용이 반영되었는지, 서버에 접속해 본다.

$ curl 172.17.0.3
Hello, devkuma

Pod에서 포트 포워드 - kubectl port-forward

kubectl port-forward 8080:80

yaml 파일 만들어서 Pod를 기동

여기서는 Pod 기동을 yaml으로 생성해서, 그 yaml를 이용해서 Pod를 기동시켜 보도록 하겠다.

  1. 명령어 만들기
    먼저 --dry-run 플래그 사용해서 실행되지 않는 명령어를 만들어 보자.

    kubectl run webserver --image=nginx:1.14 --port 80 --dry-run=client
    

    --dry-run 플래그를 사용하면, 실제로 실행되지는 않고, 클러스터로 보낼 객체를 미리 볼 수 있다.

    실행 결과:

    % kubectl run webserver --image=nginx:1.14 --port 80 --dry-run=client
    pod/webserver created (dry run)
    
  2. yaml 설정 내용 확인하기

    kubectl run webserver --image=nginx:1.14 --port 80 --dry-run=client -o yaml
    

    실행 결과:

    % kubectl run webserver --image=nginx:1.14 --port 80 --dry-run=client -o 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: {}
    
  3. yaml 파일 만들기
    이 파일 내용을 webserver-pod.yaml 파일명으로 yaml을 생성한다.

    % kubectl run webserver --image=nginx:1.14 --port 80 --dry-run=client -o yaml > webserver-pod.yaml
    
  4. 기존 생성된 Pod 삭제하기 기존에 동일한 이름의 webserver Pod는 삭제한다.

    % kubectl delete pod webserver
    pod "webserver" deleted
    
  5. yaml로 새로운 Pod 생성하기 yaml 파일로 새로 파드를 생성해 보자.

    kubectl create -f webserver-pod.yaml
    

    재대로 생성이 되었는지 확인 한다.

    % kubectl get pods
    NAME        READY   STATUS    RESTARTS   AGE
    webserver   1/1     Running   0          12s
    

Pod를 삭제 - kubectl delete

생성한 Pod를 삭제하려면, 다음 명령을 실행한다.

kubectl delete pod [Pod 명]

실행 결과:

% kubectl delete pod webserver
pod "webserver" deleted

Pod 배포하기

kubectl create deployment mainui --image=httpd: --replicas=3
kubectl get deployment.apps
kubectl describe deployment.apps mainui
kubectl get pods
kubectl get pods -o wide
kubectl edit deployment.apps maini



최종 수정 : 2024-01-18