- 쿠버네티스 컨트롤러 객체와 함께 파드 실행하기(with. 디플로이먼트) 게시글까지는 kubectl run 또는 create 명령어로 쿠버네티스 리소스(파드, 디플로이먼트, 레플리카셋)를 배포 하였다.
- run, create 명령어는 쿠버네티스에게 할 일을 사용자가 직접 명령하는 방식이다.
- 이번에는
매니페스트(Manifest)를 이용하여 쿠버네티스 리소스를 선언적으로 배포하는 방법을 정리 해보자.
- 쿠버네티스의 가장 중요한 특징 중 하나는
선언적 API환경을 제공한다는 것이다.- run, create 명령을 할 때 마다, 어떤 컨테이너를 사용할 것인지, 어떤 라벨을 지정할 것인지, 어떤 노드에 배포할 것인지, 얼마나 CPU, Memory 자원을 할당 할 것인지 등을 명시 하면서 쿠버네티스 리소스를 배포하는 것은 서비스 복잡도가 올라 가는 동시에 관리가 어렵고 불편해진다.
- 쿠버네티스에서는
매니페스트(Manifest)를 이용하여 어떤 리소스를 어떻게 배포할 것인지 선언할 수 있으며, 매니페스트를 이용하면 언제, 어떤 클러스터에서든 배포 가능 하다.- 매니페스트는 YAML, JSON 문법으로 사용할 수 있다.(보통 YAML 로 작성한다.)
- 예를 들어, deployment.yaml 파일에 디플로이먼트 배포를 위한 내용을 선언해 두고 이 파일을 쿠버네티스에게 제출 하면
알아서 리소스를 배포 해주는 것이다.
- 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
kubctl apply -f {파일이름}와kubctl create -f {파일이름}명령어 모두 매니페스트에 정의한 내용으로 쿠버네티스 리소스를 배포 해준다. 명령어의 차이는 아래와 같다.- create: 쿠버네티스 리소스를 최초 생성할 때 사용(이미 있는 리소스일 경우 동작하지 않는다.)
- apply: 쿠버네티스 리소스가 없으면 생상하고, 있으면 변경 사항을 업데이트 한다.
- 더 자세한 내용이 궁금하면, kubectl apply 명령어 공식 문서를 참고 해보자.