Kubernetes 객체 이해하기

Kubernetes 객체 이해하기 (Understanding Kubernetes Objects)

이 페이지에서는 Kubernetes 객체가 Kubernetes API에서 어떻게 표현되는지, 그리고 .yaml 형식으로 어떻게 표현할 수 있는지 설명해요.

출처: Kubernetes 공식 문서 — Understanding Kubernetes Objects

Kubernetes 객체 이해하기

Kubernetes 객체는 Kubernetes에서 지속되는 엔티티예요. Kubernetes는 이 엔티티들을 사용해 클러스터의 상태를 나타내요. 구체적으로 다음을 설명할 수 있어요.

  • 어떤 애플리케이션이 실행 중인지(그리고 어떤 노드에서 실행 중인지)
  • 그 애플리케이션에 사용할 수 있는 리소스
  • 재시작 정책과 장애 허용(tolerances) 같은 애플리케이션이 어떻게 동작하는지에 대한 정책

Kubernetes 객체는 "의도 기록(record of intent)"이에요. 객체가 만들어지면 Kubernetes 시스템은 그 객체가 존재하도록 끊임없이 작업해요. 객체를 만들 때 실질적으로 Kubernetes 시스템에 클러스터 로드가 어떻게 되길 원하는지 말하는 거예요. 이것이 클러스터의 원하는 상태(desired state) 이에요.

Kubernetes 객체로 작업하려면 — 만들든, 수정하든, 삭제하든 — Kubernetes API를 사용해야 해요. 예를 들어 kubectl 커맨드라인 인터페이스를 사용할 때, CLI가 당신을 위해 Kubernetes API에 필요한 호출을 해요. 클라이언트 라이브러리 중 하나를 사용해 직접 프로그램에서 Kubernetes API를 사용할 수도 있어요.

객체의 스펙과 상태

거의 모든 Kubernetes 객체는 객체의 구성을 관리하는 두 개의 중첩된 객체 필드를 포함해요: 객체의 spec 과 객체의 status 입니다. 스펙이 있는 객체의 경우, 객체를 만들 때 스펙을 정의해야 해요. 원하는 상태에 리소스가 갖길 원하는 특성에 대한 설명을 제공하는 거예요.

status는 객체의 현재 상태 를 설명하며, Kubernetes와 그 컴포넌트가 제공하고 업데이트해요. Kubernetes의 관리 계층(control plane)은 제공한 원하는 상태와 일치하도록 실제 상태를 지속적이고 능동적으로 관리해요.

예를 들어 Kubernetes에서 Deployment는 클러스터에서 실행 중인 애플리케이션을 나타낼 수 있는 객체예요. Deployment를 만들 때 spec을 변경해 애플리케이션의 세 개의 복제본이 동시에 실행되길 원한다고 정의할 수 있어요. Kubernetes는 Deployment의 스펙을 읽고 원하는 애플리케이션의 세 인스턴스를 시작하며, 스펙과 일치하도록 status를 업데이트해요. 그 인스턴스 중 하나가 실패하면(status가 바뀌면) Kubernetes는 spec과 status의 차이에 응답해 수정을 수행해요 — 이 경우에는 대체 인스턴스를 시작해요.

객체 사양, status, 메타데이터에 대한 더 많은 정보는 Kubernetes API 규칙을 참고하세요.

Kubernetes 객체 설명하기

Kubernetes 객체를 만들 때, 원하는 상태를 설명하는 객체 사양과 객체에 대한 몇 가지 기본 정보(예: 이름)를 제공해야 해요.

Kubernetes API를 사용해 객체를 만들 때(직접 또는 kubectl을 통해), 이 API 요청은 요청 본문에 그 정보를 JSON으로 포함해야 해요. 대부분의 경우 kubectl 명령에 .yaml 파일로 정보를 제공해요. kubectl 명령은 API에 요청할 때 정보를 JSON으로 변환해요.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2 # deployment에 템플릿과 일치하는 2개의 pod를 실행하라고 지시
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

필수 필드 (Required fields)

만들려는 Kubernetes 객체의 .yaml 파일에서 다음 필드에 대한 값을 정의해야 해요.

  • apiVersion - 이 객체를 만들기 위해 Kubernetes에서 사용할 API 버전
  • kind - 만들려는 객체의 유형
  • metadata - 객체를 고유하게 식별하는 데 도움이 되는 데이터. name 문자열, UID, namespace를 포함해요.
  • spec - 객체에 원하는 상태

객체 spec의 정확한 형식은 각 Kubernetes 객체마다 다르며, 그 객체에 특화된 중첩 필드를 포함해요. Kubernetes API 참조 문서는 Kubernetes로 만들 수 있는 모든 객체의 사양 형식을 찾는 데 도움이 돼요.

예를 들어 Pod API 참조의 spec 필드를 보세요. 각 Pod에 대해 .spec 필드는 pod와 그 원하는 상태(그 pod 안의 각 컨테이너의 컨테이너 이미지 이름 같은 것)를 지정해요.

다른 객체 사양의 예시는 StatefulSet의 spec 필드예요. StatefulSet의 .spec은 StatefulSet과 그 원하는 상태를 지정해요. StatefulSet의 .spec 안에는 Pod 객체용 템플릿이 있어요. 그 템플릿은 StatefulSet 컨트롤러가 StatefulSet 사양을 충족하기 위해 만들 Pod들을 설명해요.

다른 유형의 객체는 다른 .status를 가질 수도 있어요. 다시 한번, API 참조 페이지가 각 객체 유형에 대한 .status 필드의 구조와 내용을 자세히 다뤄요.

다음 단계 (Next steps)

Pod 같은 가장 중요한 기본 Kubernetes 객체에 대해 배워보세요.

Kubernetes 컨트롤러에 대해 배워보세요. Kubernetes API 사용하기는 API의 몇 가지 개념을 더 설명해요.