Profile picture

[k8s] 스펙을 지정하여 오브젝트 생성하기 - YAML

JaehyoJJAng2023년 04월 05일

Object Spec

내가 도커를 생성할 때 docker run <옵션들>을 사용하여 컨테이너를 띄웠듯이, 쿠버네티스에서도 kubectl create <Object> .. 명령으로 여러 오브젝트를 생성할 수 있다.

예를 들어, kubectl create deployment dpy-hname --image=sysnet4admin/echo-hname 명령으로 디플로이먼트를 생성을 하면 1개의 파드만 생성이 된다.
여러 개의 파드를 생성하기 위해서는 위 명령을 치고 난 후에, kubectl scale deployment dpy-hname --replicas=3 명령으로 파드 개수를 다시 지정해줘야 한다.

그렇다면 처음에 생성하면서 여러 개의 파드를 만들 수는 없을까?
create 커맨드에서는 replicas 옵션을 사용할 수 없고, scale 커맨드에서는 이미 만들어진 디플로이먼트에서만 사용할 수 있는데 방법이 뭐가 있을까?.

이런 설정을 적용하려면 필요한 내용을 파일로 작성해야 한다. 마치 docker-compose의 yaml 파일 처럼 말이다. 이 때 작성하는 파일을 **오브젝트 스펙(spec)**이라고 한다. 오브젝트 스펙은 일반적으로 YAML 문법으로 작성한다.


YAML 작성하기

3개의 nginx 파드를 디플로이먼트 오브젝트로 생성해보도록 하자. kubectl create 명령어로는 3개의 파드를 가진 디플로이먼트를 생성할 수 없으므로 오브젝트 스펙을 작성해 디플로이먼트를 만들어보지.

apiVersion: apps/v1 # API 버전
kind: Deployment # 오브젝트 종류
metadata:
  name: echo-hname
  labels:
    app: nginx
spec:
  replicas: 3 # 몇 개의 파드를 생성할 지 지정
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: echo-hname
          image: sysnet4admin/echo-hname # 사용할 이미지

apiVersion은 오브젝트를 포함하는 API의 버전을 의미한다. 여기서 사용하는 apps/v1은 여러 종류의 kind(오브젝트)를 가지고 있는데, 그 중에서 Deployment를 선택해 레플리카셋을 생성하였다. 레플리카셋은 몇 개의 파드를 생성할 지 replicas로 결정한다.


사용 가능한 API 버전을 확인하려면?

쿠버네티스에서 사용 가능한 API 버전은 kubectl api-versions 명령으로 확인할 수 있다. 쿠버네티스 버전에 따라 사용 가능한 API 버전이 다르니 작성 전 확인하기 바람.

admissionregistration.k8s.io/v1
admissionregistration.k8s.io/v1beta1
apiextensions.k8s.io/v1
apiextensions.k8s.io/v1beta1
apiregistration.k8s.io/v1
apiregistration.k8s.io/v1beta1
apps/v1
authentication.k8s.io/v1
authentication.k8s.io/v1beta1
authorization.k8s.io/v1
authorization.k8s.io/v1beta1
autoscaling/v1
autoscaling/v2beta1
autoscaling/v2beta2
batch/v1
batch/v1beta1
certificates.k8s.io/v1beta1
coordination.k8s.io/v1
coordination.k8s.io/v1beta1
crd.projectcalico.org/v1
discovery.k8s.io/v1beta1
events.k8s.io/v1beta1
extensions/v1beta1
networking.k8s.io/v1
networking.k8s.io/v1beta1
node.k8s.io/v1beta1
policy/v1beta1
rbac.authorization.k8s.io/v1
rbac.authorization.k8s.io/v1beta1
scheduling.k8s.io/v1
scheduling.k8s.io/v1beta1
storage.k8s.io/v1
storage.k8s.io/v1beta1
v1

파일 구조 살펴보기

image


생성하기

위에서 작성한 echo-hname.yaml 파일로 디플로이먼트를 생성해보도록 하자.

$ kubectl create -f ./echo-hname.yaml
deployment.apps/echo-hname created

파드의 개수가 3개가 맞는지 확인해보도록 하자.

$ kubectl get pods -o wide | grep -v "[AZ]" | wc -l
3

replicas 변경

echo-hname.yaml 파일을 수정해 파드를 3개에서 6개로 늘려보도록 하자.

$ sed -i 's/replicas: 3/replicas: 6/' ./echo-hname.yaml
  • -i,--in-place : 변경한 내용을 현재 파일에 바로 적용
  • s/ : 주어진 패턴을 원하는 패턴으로 변경. 여기서는 replicas: 3을 replicas: 6으로 변경

replicas의 값이 6으로 변경되었는지 확인

$ cat ./echo-hname.yaml

# ...
spec:
  replicas: 6 # 몇 개의 파드를 생성할 지 지정
  # ...

변경된 내용 적용

$ kubectl create -f ./echo-hname.yaml
Error from server (AlreadyExists): error when creating "./echo-hname.yaml": deployments.apps "echo-hname" already exists

그런데 "echo-hname이 이미 존재한다"는 에러가 발생하였다. scale 명령으로 파드 수를 임의로 늘리거나 줄일 수는 있지만, 파일(yaml)로 디플로이먼트의 파드 수를 조절하는 것은 불가능할까?


apply로 오브젝트 생성/관리

kubectl create로 디플로이먼트를 생성하면 위와 같이 파일의 변경사항을 바로 적용할 수가 없다.
이런 경우를 위해 쿠버네티스는 apply라는 명령어를 제공하고 있다.


1. replicas를 6으로 수정한 echo-hname.yaml 파일을 kubectl apply 명령으로 적용해보자

$ kubectl apply -f ./echo-hname.yaml
Warning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply
deployment.apps/echo-hname configured

오브젝트를 처음부터 apply로 띄운 것이 아니라 경고가 뜨지만 작동에는 문제가 없다. 하지만 일관성에 문제가 생길 수 있으므로 변경 사항이 발생할 가능성이 있는 오브젝트는 처음부터 apply로 생성하도록 하자.


2. 명령이 적용된 후에 echo-hname pod가 6개로 늘어났는지 확인하자. (AGE를 확인해 최근 추가된 파드 확인)

$ kubectl get pods -o wide
NAME                        READY   STATUS              RESTARTS   AGE   IP               NODE     NOMINATED NODE   READINESS GATES
echo-hname-7894b67f-664jj   1/1     Running             0          14m   172.16.221.138   w1-k8s   <none>           <none>
echo-hname-7894b67f-dbl2c   0/1     ContainerCreating   0          9s    <none>           w1-k8s   <none>           <none>
echo-hname-7894b67f-n4pqd   1/1     Running             0          9s    172.16.221.140   w1-k8s   <none>           <none>
echo-hname-7894b67f-nl9nw   1/1     Running             0          9s    172.16.221.141   w1-k8s   <none>           <none>
echo-hname-7894b67f-q6djw   1/1     Running             0          14m   172.16.221.137   w1-k8s   <none>           <none>
echo-hname-7894b67f-wtbpw   1/1     Running             0          14m   172.16.221.139   w1-k8s   <none>           <none>

Loading script...