[K8S] 1.Pod

 

 

Pod란?

 

  • Docker에서 최소 배포 단위가 컨테이너라면, k8s에서는 최소 배포 단위가 Pod 다.
  • Pod는 1개 이상의 컨테이너를 가질 수 있으며 다음과 같은 특징을 지닌다.
    • k8s에서는 일반적으로 1개의 Pod에 1개의 컨테이너를 포함시킨 후 컨테이너 대신 Pod를 관리하지만, 컨테이너간 밀접하게 연결되어있고 리소스를 공유해야 한다면 1개의 Pod안에 2개이상의 컨테이너를 포함시켜 캡슐화한다.
    • Pod는 1개이상의 컨테이너가 하나의 완전한 애플리케이션으로 동작하도록 추상화 한다.(같은 Pod 내의 컨테이너들은 네트워크 인터페이스를 같이 공유한다.)

 

 

Pod 오브젝트 yaml 파일 정의 및 생성

 

# nginx-pod.yaml


apiVersion: v1 # yaml 구문 분석 버전을 나타냄
kind: Pod
metadata:
  name: nginx-pod # Pod의 이름을 설정
spec:
  containers:
  - image: nginx:1.14.2 # Pod에 포함시킬 컨테이너 설정 
    name: nginx # 컨테이너의 이름을 설정
    ports:
    - containerPort: 8081 # 컨테이너가 바인딩할 port 번호를 지정하며, 이 port는 Pod IP와 함께 사용할 수 있다.
    
    
    
    
# 추가적인 내용은 https://docs.openshift.com/container-platform/3.5/architecture/core_concepts/pods_and_services.html 여기를 참조.

 

kubectl apply -f nginx-pod.yaml

 

 

Nginx Pod에 요청 날려보기

 

kubectl get pods -o wide

# 정상적으로 동작중인것을 확인할 수 있고, 
# Pod IP는 172.16.154.186로 할당됐으며
# nginx-pod.yaml 내 containerPort 값을 80으로 설정했으니 
172.16.154.186:80 or 172.16.154.184 로 요청을 날려보자.

# NAME                                   READY   STATUS    RESTARTS   AGE   IP               NODE                     NOMINATED NODE   READINESS GATES
# nginx-pod                              1/1     Running   0          20m   172.16.154.186   k8s-worker-1.novalocal   <none>           <none>


# woker node에 생성된 Pod는 k8s 클러스터 외부로 부터 접근이 불가능하니 master node 내에서 요청을 날려본다. 
curl --request GET http://172.16.154.186

 

 

아래와 같이 응답을 정상적으로 받을 수 있다.

 

<!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 생성 상태 확인

 

# 파드 상태를 확인한다. -w 를 추가로 붙이면 실시간으로 모니터링할 수 있다.
kubectl get -f nginx-pod.yaml

# NAME        READY   STATUS    RESTARTS   AGE
# nginx-pod   1/1     Running   0          12m

# NAME : pod이름 목록이며 기본적으로 (deployment-name + random-string) 형식을 이룬다. (random-string은 pod-template-hash를 시드로 사용한다.)
# READY : 사용 가능한 pod 내 컨테이너 개수를 표시한다. 사용가능 컨테이너 수 / 의도한 pod 내 컨테이너수 
# STATUS : Pod 상태를 표시
# RESTARTS : Pod가 restart 된 횟수
# AGE : Pod가 실행된 시간을 표시한다.

# 더 자세히 확인한다.
kubectl describe -f nginx-pod.yaml

# 내용이 많아서 Events 부분만 간단히 보면 다음과 같이 nginx 이미지를 도커허브에서 pull하고 컨테이너로 실행하여 Pod가 잘 생성된것을 확인할 수 있다.

# Events:
#   Type    Reason     Age   From                             Message
#   ----    ------     ----  ----                             -------
#   Normal  Scheduled  12m   default-scheduler                Successfully assigned default/nginx-pod to k8s-worker-1.novalocal
#   Normal  Pulling    12m   kubelet, k8s-worker-1.novalocal  Pulling image "nginx:1.14.2"
#   Normal  Pulled     11m   kubelet, k8s-worker-1.novalocal  Successfully pulled image "nginx:1.14.2"
#   Normal  Created    11m   kubelet, k8s-worker-1.novalocal  Created container nginx
#   Normal  Started    11m   kubelet, k8s-worker-1.novalocal  Started container nginx

 

 

 

 

Pod 내 컨테이너 로그 확인

 

kubectl logs nginx-pod -c nginx

# 방금 curl을 날렸던 로그를 확인할 수 있다.
172.16.41.0 - - [02/Oct/2021:10:32:40 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"

 

 

 

 

 

Pod의 리소스 공유와 통신

 

Pod는 Pod에 속한 컨테이너간 데이터 공유와 통신을 지원한다.

 

 

 

 

Pod의 LifeCycle & 컨테이너 상태

 

Pod 의 Phase는 Pod LifeCycle 중 어느 단계에 해당하는지 나타낸다.

 

Phase 설명
Pending Pod를 아직 실행할 준비가 되지 않은 상태를 뜻함, 컨테이너 이미지 다운로드 시간도 포함됨.
Running 모든 컨테이너가 실행전 생성을 마치고 , 적어도 하나의 컨테이너가 실행중이거나, 시작 또는 재시작 중에 있을 경우의 상태를 뜻함.
Succeeded Pod에 있는 모든 컨테이너들이 성공적으로 종료된상태를 뜻함. 재시작되지는 않음.
Failed Pod에 있는 모든 컨테이너들이 종료됐지만 적어도 하나 이상의 컨테이너가 실패로 종료될경우의 상태를 뜻함.
Unknown 어떤 이유에 의해서 Pod의 상태를 얻을 수 없는 상태를 뜻함. Ex) Pod와 노드간 통신오류, Pod 삭제가 정상적으로 이루어지지 않은경우

 

Pod의 단계뿐만 아니라 파드 내부의 각 컨테이너 상태를 확인할 수 있다.

 

Container Status 설명
Running 컨테이너가 문제없이 실행되고 있음을 나타낸다.
Terminated 컨테이너가 실행 이후 완료(종료?) 됐거나 어떠한 이유로 실패했기 때문에 뜨는 상태다. 정확한 이유도 kubectl 를 통해 확인이 가능하다.
Waiting 컨테이너가 시작을 완료하는 데 필요한 작업(예를 들어, 컨테이너 이미지 레지스트리에서 컨테이너 이미지 가져오거나, 시크릿(Secret) 데이터를 적용하는 작업)을 계속 실행하고 있는 중이다.

 

Pod의 Phase와 Pod 내의 컨테이너 상태를 확인하고 싶다면 아래의 커맨드를 입력해보면된다.

 

kubectl describe pod nginx-pod

 

Name:         nginx-pod
Namespace:    default
Priority:     0
Node:         k8s-worker-1.novalocal/192.168.0.12
Start Time:   Sat, 02 Oct 2021 20:57:48 +0900
Labels:       <none>
Annotations:  cni.projectcalico.org/podIP: 172.16.154.187/32
              kubectl.kubernetes.io/last-applied-configuration:
                {"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"name":"nginx-pod","namespace":"default"},"spec":{"containers":[{"image":"ngi...
Status:       Pending
IP:
Containers:
  nginx:
    Container ID:
    Image:          nginx:1.14.2
    Image ID:
    Port:           80/TCP
    Host Port:      0/TCP
    State:          Waiting
      Reason:       ContainerCreating
    Ready:          False
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-9bxv2 (ro)
...

 

위의 내용은 Pod 생성 커맨드를 입력한 직후에 describe 커맨드를 입력한 내용이다.

Status 는 Pod의 Phase이며 아직 Pending 중인것으로 확인되고

Containers.nginx.State 는 nginx 컨테이너 상태이며 Waiting 상태인것으로 확인된다.

 

 

 

참고

 

https://kubernetes.io/ko/docs/home/

 

쿠버네티스 문서

쿠버네티스는 컨테이너화된 애플리케이션의 배포, 확장 및 관리를 자동화하기 위한 오픈소스 컨테이너 오케스트레이션 엔진이다. 오픈소스 프로젝트는 Cloud Native Computing Foundation에서 주관한다.

kubernetes.io

 

 

 

 

'☸ Kubernetes' 카테고리의 다른 글

[K8S] 2.Replica Set & Deployment  (0) 2021.10.03