[k8s] 쿠버네티스 오브젝트 관리

업데이트:     Updated:

카테고리:

태그:

🎯쿠버네티스 오브젝트 관리 방법

  1. Imperative Commands
  2. Imperative Object Configuration
  3. Declarative Object Configuration

구성 파일을 이용한 선언형 관리

명령형 방식에서는 오브젝트를 생성(create), 업데이트(replace), etc 동작에 따라 하위 명령이 달라진다. 반면 선언적 방법에서는 apply 명령 하나로 모든 동작을 수행한다. apply 명령이 어떤 동작을 수행할지는 쿠버네티스가 자체적으로 판단한다.

$ kubectl apply -f <디렉토리>/

오브젝트 생성

  • 지정한 디렉토리 내 구성 파일에 정의된 모든 오브젝트를 생성하기 위해 kubectl apply 명령을 사용한다.
  • kubectl apply 명령을 통해 생성된 오브젝트는 kubectl.kubernetes.io/last-appliced-configuration: '{...}' 어노테이션을 자동으로 설정한다.
  • 해당 어노테이션은 오브젝트를 생성하기 위해 사용했던 오브젝트 구성 파일의 내용을 포함한다.
  • 다음은 예시 구성 파일에 의해 생성된 오브젝트에 자동으로 설정된 어노테이션을 보여준다.
kind: Deployment
metadata:
  annotations:
    # ...
    # This is the json representation of simple_deployment.yaml
    # It was written by kubectl apply when the object was created
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"apps/v1","kind":"Deployment",
      "metadata":{"annotations":{},"name":"nginx-deployment","namespace":"default"},
      "spec":{"minReadySeconds":5,"selector":{"matchLabels":{"app":nginx}},"template":{"metadata":{"labels":{"app":"nginx"}},
      "spec":{"containers":[{"image":"nginx:1.14.2","name":"nginx",
      "ports":[{"containerPort":80}]}]}}}}      
  # ...

오브젝트 업데이트

  • 기존에 존재하는 오브젝트를 업데이트 하는데에도 kubectl apply 명령을 사용할 수 있다.
  • 활성 오브젝트에 명령형 방식으로 직접 수정한 변경 사항은 kubectl.kubernetes.io/last-applied-configuration 어노테이션에 반영되지 않는다.
  • 구성 파일을 수정하고 apply 한 것에 대해서만 어노테이션에 반영된다.
  • 다음은 kubectl scale 명령으로 활성 오브젝트인 nginx-deployment 디플로이먼트에 replicas 필드를 직접 업데이트하고 어노테이션을 확인한 결과를 보여준다.
$ kubectl scale deployemnt/nginx-deployment --replicas=2
$ kubectl get deployment nginx-deployment -o yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    # ...
    # note that the annotation does not contain replicas
    # because it was not updated through apply
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"apps/v1","kind":"Deployment",
      "metadata":{"annotations":{},"name":"nginx-deployment","namespace":"default"},
      "spec":{"minReadySeconds":5,"selector":{"matchLabels":{"app":nginx}},"template":{"metadata":{"labels":{"app":"nginx"}},
      "spec":{"containers":[{"image":"nginx:1.14.2","name":"nginx",
      "ports":[{"containerPort":80}]}]}}}}      
  # ...
spec:
  replicas: 2 # written by scale

spec에서 replicas 필드가 2로 설정되었지만 어노테이션에서는 replicas 필드가 포함되지 않았다.

apply가 차이를 계산하는 방법

kubectl apply가 하나의 오브젝트에 대한 활성 구성을 업데이트할 때, API 서버에 패치 요청을 보냄으로써 그것을 수행한다. 패치는 활성 오브젝트 구성의 특정 필드에 대한 범위의 업데이트로 한정된다.

kubectl apply 커맨드는 구성 파일, 활성 구성, 그리고 활성 구성에 저장된 last-applied-configuration 어노테이션을 사용하여 패치 요청을 계산한다. 새로운 활성 구성은 API 서버에 단일 패치 요청으로 병합되고 이는 etcd에 저장된다.

패치 절차


  1. last-applied-configuration 으로부터 값을 읽어 구성 파일의 값과 비교한다. 어노테이션에는 존재하지만 로컬 구성 파일에는 존재하지 않는 필드는 삭제 조치된다.
  2. 어노테이션의 값과 구성 파일의 값이 다른 필드는 구성 파일의 값으로 덮어쓰여지고 변경 조치된다.
  3. 구성 파일의 값과 일치시키기 위해 last-applied-configuration 어노테이션을 설정한다.
  4. 1,2,3으로부터의 결과를 API 서버에 단일 패치 요청으로 병합한다.

오브젝트 관리 방법 변경하기

쿠버네티스 오브젝트는 한 번에 오직 하나의 방법을 사용하여 관리되어야 한다.(선언형 관리와 함께 명령형 삭제를 사용하는 것은 괜찮다.) 다른 방법으로 전환하는 것은 가능하나, 수동 프로세스이다.

Imperative Commands => Imperative Object Configuration

  1. 활성 오브젝트를 구성 파일로 내보낸다.
    $ kubectl get <종류>/<이름> -o yaml > <종류>_<이름>.yaml
    
  2. 구성 파일에서 수동으로 status 파일을 삭제한다.
  3. 오브젝트의 kubetctl.kubernetes.io/last-applied-configuration 어노테이션을 설정한다.
    $ kubectl replace --save-config -f <종류>_<이름>.yaml
    
  4. 오직 오브젝트를 관리하기 위해 kubectl apply를 사용하도록 프로세스를 변경한다.

Imperative Object Configuration => Declarative Object Configuration

  1. 오브젝트의 kubectl.kubernetes.io/last-applied-configuration 어노테이션을 설정한다.
    $ kubectl replace --save-config -f <종류>_<이름>.yaml
    
  2. 오직 오브젝트를 관리하기 위해 kubectl apply를 사용하도록 프로세스를 변경한다.

📌출처

Kubernetes Docs


👍 개인 공부 기록용 블로그입니다. 오류나 조언이 있으시면 언제든지 댓글 혹은 메일로 남겨주시면 감사하겠습니다! 😄

맨 위로 이동하기

k8s 카테고리 내 다른 글 보러가기

댓글남기기