[Kuberenetes] kubectl apply


서론

kubectl apply 명령어는 create, replace 등의 명령어와는 사뭇 다르게 동작한다.

apply, create 등 어떤 명령어를 통해 쿠버네티스의 객체를 생성하면, 우리가 작성한 yaml 파일에 객체 상태를 저장하기 위한 필드들이 자동으로 추가되어진다.

이렇게 추가되어진 파일을 live configuration이라 하며 Kubernetes 클러스터의 메모리에 존재하게 된다.

그러나 kubectl apply 명령을 사용할 경우, 추가로 한 가지 작업이 더 진행된다.

우리가 작성한 YAML 형식의 로컬 객체 구성은 JSON 형식으로 변환되어, last-applied-configuration으로 저장된다.

last-applied-configuration를 통해 apply명령어는 로컬 파일에서 어떤 필드가 삭제되었는지 식별하고 변경, 삭제, 추가된 부분이 있으면 create, replace 등 구체적인 명령어를 입력해줄 필요없이 그에 맞게 알아서 자동으로 동작하게 되는 것이다.

Last applied configuration

  • 예를 들어 Local file에서 nginx이미지 버전을 1.19로 변경한 후 kubectl apply를 실행하면,
  • 이 값은 live configuration에 있는 값과 비교를 시도하고 값이 다르다면 live object configuration은 새로운 값으로 업데이트 된다.
  • 변경이 이루어지면, last applied JSON도 최신 상태로 업데이트되어 항상 동기화된다.

kubectl apply는 세 가지 설정 정보를 비교하여 오브젝트를 갱신

  • Local configuration: 현재 작성한 YAML 파일
  • Last applied configuration: 이전에 apply로 반영한 YAML을 JSON으로 변환해 오브젝트의 annotation으로 저장한 것이다.
  • Live configuration: 클러스터에 존재하는 실제 오브젝트 상태이다.

이 세 가지를 비교해 변경, 추가, 삭제 여부를 판단한다.

  • Apply 명령어만 last-applied configuration을 저장하며, create/replace는 저장하지 않는다.
  • kubectl apply명령어는 Live object configuration에 kubectl.kubernetes.io/last-applied-configuration annotation을 생성한다.
  • 선언형 방식(apply)을 쓰기 시작하면, 이후에는 명령형(create, replace)과 혼용하지 말아야 한다.