쿠버네티스 매니페스트를 이용하여 파드 배포하기(with. YAML)

김재민·2024년 9월 2일

Background


  • 쿠버네티스 컨트롤러 객체와 함께 파드 실행하기(with. 디플로이먼트) 게시글까지는 kubectl run 또는 create 명령어로 쿠버네티스 리소스(파드, 디플로이먼트, 레플리카셋)를 배포 하였다.
  • run, create 명령어는 쿠버네티스에게 할 일을 사용자가 직접 명령하는 방식이다.
  • 이번에는 매니페스트(Manifest) 를 이용하여 쿠버네티스 리소스를 선언적으로 배포하는 방법을 정리 해보자.

1. 선언적 API 란?


  • 쿠버네티스의 가장 중요한 특징 중 하나는 선언적 API 환경을 제공한다는 것이다.
  • run, create 명령을 할 때 마다, 어떤 컨테이너를 사용할 것인지, 어떤 라벨을 지정할 것인지, 어떤 노드에 배포할 것인지, 얼마나 CPU, Memory 자원을 할당 할 것인지 등을 명시 하면서 쿠버네티스 리소스를 배포하는 것은 서비스 복잡도가 올라 가는 동시에 관리가 어렵고 불편해진다.
  • 쿠버네티스에서는 매니페스트(Manifest) 를 이용하여 어떤 리소스를 어떻게 배포할 것인지 선언할 수 있으며, 매니페스트를 이용하면 언제, 어떤 클러스터에서든 배포 가능 하다.
  • 매니페스트는 YAML, JSON 문법으로 사용할 수 있다.(보통 YAML 로 작성한다.)
  • 예를 들어, deployment.yaml 파일에 디플로이먼트 배포를 위한 내용을 선언해 두고 이 파일을 쿠버네티스에게 제출 하면
    알아서 리소스를 배포 해주는 것이다.

1-1. 매니페스트로 파드 배포 해보기

  • run 명령어와 매니페스트를 이용 하여 파드를 배포하고 describe 정보를 비교해보자.

🏷️ 이전에는 아래와 같이 run 명령어로 파드를 배포 했었다.(쿠버네티스 Pod란?)

# 파드 이름: hello-kiamol-run / 컨테이너 이미지: kiamol/ch02-hello-kiamol
$ kubectl run hello-kiamol-run --image=kiamol/ch02-hello-kiamol
>> pod/hello-kiamol-run created

$  kubectl get pod
>>
NAME                              READY   STATUS    RESTARTS      AGE
hello-kiamol-run                  1/1     Running   0             23s

# 파드의 컨테이너 이름 조회
>> 
$ kubectl get pod/hello-kiamol-run -o jsonpath='{.spec.containers[*].name}'
>> hello-kiamol-run

$ kubectl describe pod/hello-kiamol-run
>>
Name:             hello-kiamol-run
Namespace:        default
Priority:         0
Service Account:  default
Node:             docker-desktop/192.168.65.4
Start Time:       Wed, 04 Sep 2024 23:26:08 +0900
Labels:           run=hello-kiamol-run
Annotations:      <none>
Status:           Running
IP:               10.1.2.92
IPs:
  IP:  10.1.2.92
Containers:
  hello-kiamol-run:
    Container ID:   docker://89c2249633b3989fe1e81ff37e411bde9864bf2417d831bcfb0cba4e970445ce
    Image:          kiamol/ch02-hello-kiamol
    Image ID:       docker-pullable://kiamol/ch02-hello-kiamol@sha256:8a27476444b4c79b445f24eeb5709066a9da895b871ed9115e81eb5effeb5496
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Wed, 04 Sep 2024 23:26:11 +0900
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-54c6j (ro)

🏷️ 위 명령어와 동일하게 동작 하도록 매니페스트를 선언하면 아래와 같다.(파드, 컨테이너 이름만 다르게 하였다.)

# pod.yaml 파일 편집 후 아래 yaml 내용으로 입력 하자.
$ vim pod.yaml
# 쿠버네티스 API 버전 정의
apiVersion: v1
# 배포 하려는 리소스 유형 정의
kind: Pod
# 리소스의 메타데이터(name 은 필수 정의 항목이다.)
metadata:
  name: hello-kiamol-manifest
# 배포할 리소스의 스펙 정의
spec:
  containers:
    - name: hello-kiamol-manifest
      image: kiamol/ch02-hello-kiamol
$ kubectl apply -f pod.yaml
>> pod/hello-kiamol-manifest created

$ kubectl get pod
>>
NAME                              READY   STATUS    RESTARTS      AGE
hello-kiamol-manifest             1/1     Running   0             56s
hello-kiamol-run                  1/1     Running   0             5m49s

$ kubectl get pod/hello-kiamol-manifest -o jsonpath='{.spec.containers[*].name}'
>> hello-kiamol-manifest

$ kubectl describe pod/hello-kiamol-manifest
>>
Name:             hello-kiamol-manifest
Namespace:        default
Priority:         0
Service Account:  default
Node:             docker-desktop/192.168.65.4
Start Time:       Wed, 04 Sep 2024 23:31:01 +0900
Labels:           <none>
Annotations:      <none>
Status:           Running
IP:               10.1.2.93
IPs:
  IP:  10.1.2.93
Containers:
  hello-kiamol-manifest:
    Container ID:   docker://033eba26bd58a1880befa03c147e6c819f5e52c224694e0196eea2b8b4c5d3ee
    Image:          kiamol/ch02-hello-kiamol
    Image ID:       docker-pullable://kiamol/ch02-hello-kiamol@sha256:8a27476444b4c79b445f24eeb5709066a9da895b871ed9115e81eb5effeb5496
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Wed, 04 Sep 2024 23:31:04 +0900
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-gg5p9 (ro)
  • 위에서 run 명령어로 배포한 파드 정보와 yaml 파일(매니페스트) 선언 후 apply 명령으로 배포한 파드 간 차이가 없는 것을 알 수 있다.
  • 그런데 사용자 입장에서 배포 편의성은 크게 다르다.
  • run 명령어는 옵션 정보를 포함한 전체 명령 텍스트를 배포 시점 마다 다시 입력해야한다.
  • 매니페스트를 사용하면 필요한 내용을 yaml 파일에 선언해 놓고 필요할 때 yaml 파일만 불러와서 제출 하면 된다.
    또한, 매니페스트는 버전 관리가 가능해진다.
  • 물론 매니페스트를 이용하면 선언할 내용이 늘어나서 작성 시 복잡도가 더 높아지겠지만, 확장성, 편의성 등을 고려 했을 때 많은 경우에서 매니페스트 활용도가 높아진다.

🏷️ 아래와 같이 원격 저장소에 있는 매니페스트 파일로도 쿠버네티스 리소스를 배포할 수 있다. 즉, Git 저장소에 올려 놓고 반복, 확장 사용 하면서 버전 관리할 수 있다.

$ kubectl apply -y https://github.com/sixeyed/kiamol/blob/master/ch02/pod.yaml

1-2. kubectl apply 명령어

  • kubctl apply -f {파일이름}kubctl create -f {파일이름} 명령어 모두 매니페스트에 정의한 내용으로 쿠버네티스 리소스를 배포 해준다. 명령어의 차이는 아래와 같다.
  • create: 쿠버네티스 리소스를 최초 생성할 때 사용(이미 있는 리소스일 경우 동작하지 않는다.)
  • apply: 쿠버네티스 리소스가 없으면 생상하고, 있으면 변경 사항을 업데이트 한다.
  • 더 자세한 내용이 궁금하면, kubectl apply 명령어 공식 문서를 참고 해보자.
profile
안녕하세요. 데이터 엔지니어 김재민 입니다.

0개의 댓글