YAML 파일을 이용하여 `kubectl apply`나 `kubectl delete`를 수행할 수 있는 이유

권경희·2025년 1월 2일

Kubernetes에서 YAML 파일을 이용하여 kubectl applykubectl delete를 수행할 수 있는 이유는 YAML 파일이 Kubernetes 리소스(API 객체)의 상태를 정의하는 데 사용되기 때문입니다. Kubernetes는 YAML 파일을 읽고 해당 내용을 클러스터에 적용하거나 제거하는 작업을 수행합니다.


1. YAML 파일의 역할

YAML 파일은 Kubernetes의 리소스 사양(Resource Specification)을 기술합니다. YAML 파일은 Kubernetes가 관리하는 각 리소스의 Desired State(원하는 상태)를 정의하며, Kubernetes는 이를 클러스터의 실제 상태와 동기화하려고 노력합니다.

YAML 파일의 주요 구성 요소

  1. apiVersion:

    • 리소스를 정의하는 Kubernetes API 버전.
    • 예: v1, apps/v1.
  2. kind:

    • 생성할 리소스의 유형.
    • 예: Pod, Service, Deployment.
  3. metadata:

    • 리소스 이름, 네임스페이스, 레이블 등 메타데이터.
    • 예:
      metadata:
        name: my-pod
        namespace: default
  4. spec:

    • 리소스의 세부 사양(스펙).
    • 리소스의 동작 방식이나 구성을 정의.
    • 예:
      spec:
        containers:
        - name: nginx
          image: nginx:1.19.6

예제 YAML 파일 (Pod 정의):

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
  namespace: default
spec:
  containers:
  - name: nginx
    image: nginx:1.19.6

2. kubectl applykubectl delete 동작 원리

2.1 kubectl apply

  • YAML 파일의 내용을 기반으로 리소스를 생성하거나 업데이트합니다.
  • Kubernetes는 YAML 파일의 정의를 읽어 etcd에 저장된 상태(현재 상태)와 비교하여 필요한 작업을 수행합니다.
  • 적용 결과:
    1. 리소스가 없으면 새로 생성.
    2. 이미 리소스가 존재하면 기존 리소스 업데이트.

명령어 예시:

kubectl apply -f my-pod.yaml
  • 결과:
    • my-pod라는 이름의 Pod가 클러스터에 생성.

2.2 kubectl delete

  • YAML 파일에 정의된 리소스를 기반으로 삭제 작업을 수행합니다.
  • kubectl delete는 YAML 파일에 명시된 리소스 이름, 네임스페이스, 유형 등을 확인하고, 해당 리소스를 삭제 요청합니다.

명령어 예시:

kubectl delete -f my-pod.yaml
  • 결과:
    • my-pod라는 이름의 Pod가 삭제.

3. 왜 YAML 파일로 작업할 수 있을까?

  1. Kubernetes의 리소스 관리 방식:

    • Kubernetes는 YAML 파일에서 리소스의 Desired State를 읽고 이를 클러스터의 Actual State(현재 상태)로 동기화하려고 합니다.
    • 이를 통해 YAML 파일만으로 리소스를 생성, 수정, 삭제할 수 있습니다.
  2. Kubernetes API 기반 작업:

    • kubectl 명령어는 API Server와 통신하여 YAML 파일에 정의된 리소스를 Kubernetes에 전달.
    • API Server는 YAML 파일의 내용을 Kubernetes 리소스의 스펙으로 해석하고, 이를 etcd에 저장.
  3. YAML의 직렬화/구조화 데이터:

    • YAML은 Kubernetes API 객체의 필드를 직렬화된 형식으로 표현.
    • 각 필드는 Kubernetes API가 이해할 수 있는 구조화된 데이터로 변환됨.
  4. Declarative 방식:

    • YAML 파일을 사용하면 선언적 관리(Declarative Management)가 가능.
    • 사용자는 "원하는 상태"만 기술하며, Kubernetes가 실제 상태를 이와 동일하게 맞춤.

4. 실제 동작 흐름

  1. 사용자가 YAML 파일로 명령 실행:

    kubectl apply -f my-pod.yaml
  2. kubectl은 API Server에 요청:

    • YAML 파일을 읽고 리소스 스펙을 API Server에 전달.
  3. API Server는 상태를 저장:

    • etcd에 YAML 파일의 내용을 기반으로 리소스 상태 저장.
  4. 컨트롤러가 Desired State로 조정:

    • Controller Manager가 현재 상태(Actual State)를 YAML 파일의 정의된 상태(Desired State)와 동기화.

5. applycreate의 차이

  • kubectl apply:

    • 선언적 관리 방식.
    • 리소스가 존재하면 업데이트, 없으면 생성.
  • kubectl create:

    • 명령적 관리 방식.
    • 리소스가 존재하면 오류 발생.
    • 기존 리소스를 업데이트하지 않음.

예시:

kubectl create -f my-pod.yaml
kubectl apply -f my-pod.yaml

6. 장점

  • 가독성: YAML은 사람이 읽고 쓰기 쉬운 형식.
  • 추적 가능성: Git 등 버전 관리 시스템에서 YAML 파일로 Kubernetes 리소스 추적.
  • 유연성: YAML 파일을 사용하여 Kubernetes의 모든 리소스를 정의하고 관리 가능.
  • 자동화: CI/CD 파이프라인에서 YAML 파일로 Kubernetes 작업을 자동화.

7. 결론

Kubernetes에서 kubectl applykubectl delete를 YAML 파일로 수행할 수 있는 이유는 YAML 파일이 Kubernetes의 리소스 상태를 선언적으로 정의하기 때문입니다. YAML 파일을 통해 사용자는 리소스의 원하는 상태를 기술하고, Kubernetes가 이를 클러스터 상태와 동기화합니다.

이를 통해 효율적이고 반복 가능한 애플리케이션 배포와 관리가 가능합니다. YAML 파일은 Kubernetes의 핵심 도구로, 모든 Kubernetes 작업에 사용될 수 있습니다.

0개의 댓글