Kubernetes 매니페스트(Manifest)

지금까지는 기본적으로 대부분이 커멘드 내에 Pod 등의 정보를 넣어 커멘드를 실행하였지만, 매번 원하는 것이 익숙해 지도록 커멘드의 예제를 들어 갔다. 예를 들어, 이전 섹션의 Deployment를 시작한 다음 Pod 수를 늘리는 등의 작성 방법이 전형적인 예이다. 이렇게 매번 하고 싶은 것을 명령하는 것을 명령적이라고 한다. 이 방법은 어떻게(how)에 주목하고 있다.

이에 대해서 최종적으로 얻고 싶은 상태를 입력하여 지정ㅎ새서 작성을 실행하는 것을 선언적이라고 한다. 선언적인 경우에는 정보(what)에 주목해 작성을 실행한다.

Kubernetes에서는 선언적인 기술 방법으로서, yaml 파일(매니페스트)에 정보를 기재하는 방법을 이용한다. 이 yaml 파일안에 최종적으로 얻고 싶은 Pod 등의 정보(what)를 기입하는 것으로 목적의 것을 Kubernetes에 자동으로 작성한다. 이 때 Kubernetes에서는 어떻게(how) 만드는 방법은 생각할 필요가 없기 때문에, 이 how를 추상화할 수 있다는 점이 선언적인 방법의 장점이라고 할 수 있다.

예를 들면, 다음의 2개는 같은 것을 명령적(kubectl run)에 기재한 것과 선언적(pod.yaml)으로 작성된 예제이다.

명령적 : kubectl run

kubectl run --image gcr.io/google-samples/hello-app:1.0 --restart Never Helloworld

선언적: pod.yaml

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: helloworld
  name: helloworld
spec:
  containers:
  - env:
    - name: TEST_ENV
      value: Hello_World
    image: gcr.io/google-samples/hello-app:1.0
    ports:
    - containerPort: 8080

명령적 작성에서 선언적 작성으로의 변환은 아래의 커맨드를 통해 수행하는 것도 가능하다.

kubectl run --image gcr.io/google-samples/hello-app:1.0 --restart Never helloworld -o yaml helloworld > pod.yaml

이렇게 yaml을 지정하여 kubectl run과 동일한 Pod를 생성하려면 kubectl apply 명령으로 작성한 yaml 파일을 지정하여 가능하다.

kubectl apply -f pod.yaml

다음에 yaml 파일의 작성한 내용에 대해서 알아 보겠다. 다만, 모든 내용을 여기에 다 언급하면, 양이 방대해지므로 일부만 언급을 하돌고 하겠다. 다른 항목에 대해서는 공식 문서를 참고 주길 바란다. 위에서 설명한 pod.yaml 파일이 아마도 가장 간단한 형태일 것이다. 그러나 대규모 구성도 동일하다.

이 yaml 파일의 1단에 기재되어 있는 것으로 부터 보도록 하자. 크게 네 가지 항목이 있다는 걸 알 수 있다. 그 항목은 각각 다음과 같은 의미를 갖는다.

key 의미
apiVersion 표시하고 싶은 Kubernetes Object의 Version을 지정
kind apiVersion 으로 지정한 Kubernetes Object 세트 중에서 사용하고 싶은 타입을 지정
예:Pod, ReplicaSet, Deployment
metadata 객체 정보 지정 (이름 등 고유하게 식별하기 위한 정보)
spec 객체에 적용하길 원하는 것을 지정

위의 4개 항목은 yaml 파일을 작성할 때 필수 항목이다. 또, 작성 대상의 종류에 따라 2단 이후에는 작성하는 항목은 바뀌므로, 자세한 설명은 생략한다.

이번에 작성한 파일에 대해서는 아래와 같은 설정을 작성되어 있다.

1단째 2단째 3단째 설명
metadata - - -
- creationTimestamp - 노드 생성 시간을 남길지 여부 설정
- labels - Kubernetes 노드 레이블 (공식 문서 참고)
- 이름 - namespace 내에서 고유한 객체의 이름 설정
spec - - -
- containers - 컨테이너 사양 설정
- - env 환경 변수를 컨테이너로 지정
- - image docker 이미지의 리포지토리 및 태그
- - ports 포드 외부에서 요청을 받기 위해 열린 포트 목록