Fairy ' s

[K8s] kubectl apply command 본문

Study/K8s

[K8s] kubectl apply command

berafairy 2023. 8. 9. 22:22

 apply 명령은 변경사항을 적용하기 전에 로컬의 definition file과 kubernetes의 live configuration file 그리고 last applied configuration을 고려한다. apply 명령을 실행할 때, 오브젝트가 아직 존재하지 않는 경우에는 오브젝트가 생성 되고, 오브젝트가 생성되면, 오브젝트 구성은(우리가 로컬에서 만든 것과 유사한 형식) 쿠버네티스 내에서 생성된다. 쿠버네티스에서 live configuration이 오브젝트의 상태를 저장하는 추가 필드이다. 

 live configuration을 통해 내부적으로 정보를 저장하고, 오브젝트를 생성하기 위해 kubectl apply 커맨드를 사용한다. 우리가 작성한 로컬 오브젝트 configuration 파일의 YAML 버전은 json 형식으로 변환되고, last applied configuration 파일로 저장된다. 오브젝트가 업데이트가 될 때는 세 가지 live object의 변경사항을 비교해 업데이트 하게 된다. 

  • Local definition file : 로컬 시스템을 저장하고 있음
  • Live object configuration : Kubernetes 메모리에 존재함
  • Last applied configuration : 마지막 적용 사항 (json 형식), 클러스터 자체의 live object configuration 저장됨
# Local definition file

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
    type: front-end-service
spec:
  containers:
  - name: nginx-container
    image: nginx:1.19
# Live object configuration

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
    type: front-end-service
spec:
  containers:
  - name: nginx-container
    image: nginx:1.
status:
  conditions:
  - lastProbeTime: null
    status: "True"
    type: Initialized
# Last applied Configuration

{
  "apiVersion": "v1",
  "kind": "Pod",
  "metadata": {
    "annotations": {},
    "labes": {
      "run": "myapp-pod",
      "type": "front-end-service"
    },
    "name": "myapp-pod",
  },
  "spec": {
    "containers": [
      {
        "image": "nginx:1.19",
        "name": "nginx-container"
      }
    ]
  }
}

 

 예를 들어, nginx 이미지가 1.19로 업데이트 되었을 때, kubectl apply 명령은 local file과 live configuration의 값을 비교해서 차이점이 있다면 live configuration이 새 값으로 업데이트 된다. 또한, json 형식은 항상 마지막으로 변경된 최신의 상태로 업데이트 된다.

 last applied configuration이 필요한 이유는 무엇일까? 만약 type label 같은 필드가 삭제 되었을 경우 kubectl apply를 실행하면 로컬에는 label이 존재하지 않고, last applied configuration에는 존재하게 된다. 이것은 label 필드를 live configuration에서 제거되어야 함을 의미한다. 따라서 live configuration에 필드가 있고, 로컬이나 last applied configuration에는 존재하지 않는다면, 필드는 그대로 남게 된다.

 그러나 로컬 파일에서 필드가 없고 last applied configuration에 존재한다면, kubectl apply 명령을 실행할 때 이전 단계에 해당 필드가 있었고 현재 제거된 상태라는 것을 나타낸다. 따라서 last applied configuration은 로컬 파일에서 어떤 필드가 제거 되었는지 파악하는 데에 도움이 된다. 해당 필드는 실제 live configuration에서 제거된 것이다.

 apply 명령을 사용해야만 last applied configuration에 저장이 되고, kubectl create, replace 명령으로는 저장되지 않는다. 그러므로 impretive 방식과 declarative 방식을 혼합하지 않아야 한다. apply 명령을 사용할 때마다 live configuration 내에서 변경사항을 결정하기 위해 local의 definition file, live object configuration, last applied configuration 세 가지 섹션을 모두 비교해야 한다.

 

'Study > K8s' 카테고리의 다른 글

[K8s] Labels & Selectors  (0) 2023.08.14
[K8s] Scheduling  (0) 2023.08.10
[K8s] Imperative vs Declarative  (0) 2023.08.08
[K8s] Namespaces  (0) 2023.08.08
[K8s] Services  (0) 2023.08.07
Comments