수 많은 우문은 현답을 만든다

Openshift Administration (POD) 본문

개발지식/Openshift (k8s)

Openshift Administration (POD)

aiden.jo 2020. 7. 14. 16:20

안녕하세요, 조영호입니다.

오늘은 Kubernetes의 가장 최소 동작단위인 POD(파드) 운영에 대해서 간단하게 알아보겠습니다. 다음시간에는 Node.js 애플리케이션을 배포해보는 훈련을 해보겠습니다 !

POD 란?

파드는 하나 이상의 컨테이너와 환경들로 구성되어있는 k8s 운영에서의 가장 작은 단위입니다. 각 파드는 자체 내부 IP 주소와 Port가 할당되므로 포드 내의 컨테이너는 로컬 스토리지와 네트워킹을 공유 할 수 있습니다. 파드는 생명 주기를 가지고 있으며 목적에 따라 어떤 노드에서 실행된 뒤 제거될 수도 있고, 계속 엑세스를 유지할 수도 있습니다.

 

Viewing Pods

1. oc get pods

 : 파드 목록을 얻어옵니다.

$oc get pods
docker-registry-2-kznqs                 1/1       Running   0          11h
dockergc-fjj6d                          1/1       Running   0          23d
dockergc-mbbss                          1/1       Running   2          23d
dockergc-qlxdl                          1/1       Running   0          23d
dockergc-zsv69                          1/1       Running   0          23d

 

1-1. oc get pods -o wide

: 파드의 상세 보기를 얻습니다. -o wide 옵션은 추가로 IP와 각 파드들이 어느 Worker Node에 배포되었는지 보여줍니다.

$oc get pods -o wide
myapp-pod       1/1       Running   0          16m       10.131.0.44   worker-3.fyre.ibm.com   <none>
mysql-2-xhl4h   1/1       Running   0          13d       10.129.0.30   worker-2.fyre.ibm.com   <none>

 

1-2. oc get pods --all-namespaces

: 모든 Project의 Pod들을 얻어옵니다. 같은 옵션으로 route, dc, service 등도 출력할 수 있습니다. 

$oc get pods --all-namespaces
NAMESPACE                           NAME                                           READY     STATUS             RESTARTS   AGE
database                            mysql-1-mqsh6                                  1/1       Running            0          12d
database                            nodejs-ex-1-97lzn                              1/1       Running            0          11d
default                             docker-registry-2-kznqs                        1/1       Running            1          19d
default                             dockergc-fjj6d                                 1/1       Running            0          41d
default                             dockergc-mbbss                                 1/1       Running            2          41d
default                             dockergc-qlxdl                                 1/1       Running            0          41d
default                             dockergc-zsv69                                 1/1       Running            0          41d

 

 

 

2. oc describe pod <PodName>

: 특정 파드의 세부사항을 출력합니다.

$oc describe pod dockergc-fjj6d
Name:               dockergc-fjj6d
Namespace:          default
Priority:           0
Start Time:         Sun, 28 Jun 2020 22:37:02 -0700
Labels:             app=dockergc
...
    Ready:          True
    Restart Count:  0
    Requests:
      cpu:        50m
      memory:     30Mi
    Environment:  <none>
    Mounts:
    ...

 

 

 

3. oc logs <PodName>
: 특정 파드의 로그를 출력합니다. 에러가 나거나 파드가 죽거나 하는 일들이 빈번하게 일어나며 이때 유용하게 사용됩니다.

$oc logs dockergc-fjj6d
I0721 21:27:10.755420       1 dockergc.go:241] docker build garbage collection daemon
I0721 21:27:10.755554       1 dockergc.go:245] MinimumGCAge: {1h0m0s}, ImageGCHighThresholdPercent: 80, ImageGCLowThresholdPercent: 60
I0721 21:27:10.803540       1 dockergc.go:149] gathering disk usage data
I0721 21:27:10.815829       1 dockergc.go:158] usage is under high threshold (37061MB < 190777MB)
...

 

 

4. oc delete pod <PodName>
; 특정 파드를 삭제합니다. 파드는 삭제되어도 deployment 같은 배포 정책에 의해서 다시 재 생성됩니다. 배포 정책이 없다면 그냥 삭제됩니다. 이 내용은 후에 따로 다루도록 하겠습니다

$oc delete pod iperf-slow
pod "iperf-slow" deleted

 

 

 

5. oc adm top pods
: 파드들의 시스템 자원 사용량을 출력합니다.

$ oc adm top pods
dockergc-fjj6d                          0m           31Mi            
dockergc-mbbss                          1m           22Mi            
dockergc-qlxdl                          1m           30Mi            
dockergc-zsv69                          0m           31Mi     

 

 

 

6. oc adm manage-node <NodeName> --list-pods
: 특정 노드의 모든 파드를 출력합니다. NodeName은 띄어쓰기로 여러개를 사용할 수 있습니다 :)

$oc adm manage-node master --list-pods
NAMESPACE                           NAME                                           READY     STATUS    RESTARTS   AGE
default                             docker-registry-2-kznqs                        1/1       Running   0          1d
default                             dockergc-mbbss                                 1/1       Running   2          23d
default                             registry-console-1-6wjvq                       1/1       Running   0          1d
default                             router-1-rqkbm                                 1/1       Running   0          1d
kube-service-catalog                apiserver-csxxl                                1/1       Running   2          23d
kube-service-catalog                controller-manager-m94bx  

 

 

 

Creating Pod

파드를 운영하는 방법 말고 실제로 필요한 파드를 만드는 방법을 살펴보겠습니다. Docker Engine에서는 Dockerfile을 작성해서 컨테이너를 만들 수 있고 kubernetes와 k8s 기반인 Openshift에서는 yaml 파일을 작성하여 파드를 만들 수 있습니다. yaml을 작성하기 이전에 우리는 만들고자하는 파드의 이미지가 먼저 있는지 확인해야합니다.

 

1. NodeJS 이미지 검색하기

$oc get images | grep nodejs
sha256:fe6d5c8658...  registry.redhat.io/rhscl/nodejs-8-rhel7@sha256:fe6d5c8658...
sha256:74a3ef2964...  registry.redhat.io/rhoar-nodejs/nodejs-10@sha256:74a3ef2964...

 

 

2. Yaml 파일 만들기

$vi node.yaml

apiVersion: v1
kind: Pod
metadata:
 name: node-pod
 labels:
   app: nodeapp
spec:
 containers:
 - name: nodeapp-container
   image: registry.redhat.io/rhscl/nodejs-8-rhel7@sha256:fe6d5c8658...
   command: ['sh', '-c', 'echo Hello nodejs! && sleep 3600']

YAML 파일은 Yet Another Markup Language의 줄임말로 사람이 쉽게 읽을 수 있는 데이터 직렬화 양식으로써 개발 된 표기 방법이다. YAML 표기법에서는 들여쓰기(identation)가 문법에 중요한 요소로 작용하니 주의해야합니다. Kubernetes와 이를 기반으로 한 Openshift는 YAML 파일로 서비스들을 정의할 수 있습니다.

 

제가 처음 k8s를 공부할때 가졌던 질문은 "갑자기 등장한 YAML이 어려워보이는데 굳이 이걸 써서 얻는 장점이 뭘까..?" 였습니다. 지금의 제가 과거에 제게 답변을 하자면, YAML은 선언적 방법(declarative)으로 기존에 쓰던 순차적 방법(imperative)인 'A커맨드를 치고 B커맨드를 치고 C를 치고..' 일일히 서비스마다 반복 해주던 것을 단순화 시키는 장점이 있습니다. YAML 파일에 한 번만 선언해놓으면 K8s가 알아서 배포하고 서비스를 운영해주기 때문이죠.

 

 

이번에는 위 YAML 파일의 내용을 살펴보겠습니다.

  • apiVersion: v1
    k8s API의 명세로, k8s 커맨드 및 OCP 커맨드도 이 API를 사용합니다. 사용자의 명령과 모든 k8s 컴포넌트 간에는 REST API 호출이 발생합니다. 추가적으로 알파/베타/그룹 등의 개념이 있습니다.
  • kind: Pod
    생성할 리소스 타입을 정의합니다. Pod, Service, Deployment, ...

  • metadata:
      name: node-pod
      labels:
        app: nodeapp
    파드를 구분할 수 있는 메타데이터 name, label 값을 부여합니다. name은 각 namespace(OCP에서는 project 라함)에서 유일한 구분자로 사용되며 중복될 수 없습니다. 같은 이름으로 파드를 생성하면 이미 있다는 에러가 뜹니다. label은 selector 역할로 파드를 조회, 선택, 지정 할때 사용할 수 있으며 key : value 관계를 가집니다(여기서는 app : nodeapp으로 지정).

  • spec:
      containers:

      - name: nodeapp-container
         image: registry.redhat.io/.../nodejs-8-rhel7@sha256:f3sr...
         command: ['sh', '-c', 'echo Hello nodejs! && sleep 3600']

    - spec은 생성할 파드의 구체적인 내용을 정의합니다. 여기서는 containers에 한 개의 컨테이너민 정의되었지만 구성하고자 하는 서비스에 따라 여러개의 컨테이너가 정의될 수 있습니다(ex: apache, tomcat, mysql).

    - name은 각 파드 내에서 컨테이너를 구분할 수 있는 유일한 구분자로 컨테이너 이름을 지정해주고 컨테이너 생성에 사용 될 이미지를 지정해줍니다.

    - image는 Openshift Registry에서 관련된 이미지를 검색해서 가져오며 존재하지 않는 이미지를 사용하면 imagePullBackOff 에러가 발생합니다. (예를들어, 'nodejs-8'로 시작되는 이미지가 있는 경우 그냥 nodejs-8 이라고만 입력해도 알아서 이미지를 끌어옵니다. 하지만 레지스트리에 존재하지 않는 nodenode 라고 입력을 하면 imagePullBackOff 에러가 발생합니다. 또한, 그냥 node 라고 적으면 가장 최신 버전의 Nodejs v14가 설치됩니다.)

    - commnad는 컨테이너가 생성되고나서 초기에 실행될 명령이나 스크립트를 미리 정의할 수 있게 합니다. 환경 설정이나 설치 등을 입력해놓으면 매우 편합니다. Dockerfile의 CMD 역할을 한다고 보시면 됩니다. 자세한 설명은 여기를 참고해주세요.

 

3. Pod 생성하기

$oc create -f node.yaml (혹은 oc apply -f node.yaml)

 

 

4. Pod 접속해서 NodeJS 설치 확인하기

$oc get pods
node-pod        1/1       Running   0          17m

$oc exec -it node-pod /bin/sh
sh-4.2$ 

$sh-4.2$ node -v
v8.17.0

 

오늘도 감사합니다.