https://kubernetes.io/docs/concepts/overview/working-with-objects/#kubernetes-objects
쿠버네티스의 객체
쿠버네티스 객체는 쿠버네티스 시스템에 존재하는 영속적인 엔티티입니다. 쿠버네티스는 이러한 엔티티를 사용하여 클러스터의 상태를 표현합니다. 쿠버네티스 객체 모델과, 이러한 객체들을 다루는 방법에 대해 알아봅시다. 이 페이지는 쿠버네티스 객체가 쿠버네티스 API에서 어떻게 표현되는지와 이러한 객체를 .yaml 형식으로 어떻게 표현할 수 있는지 설명합니다.
쿠버네티스 객체 이해하기
쿠버네티스 객체는 쿠버네티스 시스템에 존재하는 영속적인 엔티티입니다. 쿠버네티스는 이러한 엔티티를 사용하여 클러스터의 상태를 표현합니다. 구체적으로, 이들은 다음을 설명할 수 있습니다:
- 어떤 컨테이너화된 애플리케이션이 실행 중인지(그리고 어떤 노드에서 실행 중인지)
- 해당 애플리케이션에 사용 가능한 리소스
- 재시작 정책, 업그레이드, 장애 허용성과 같은 애플리케이션의 동작 방식에 관한 정책
쿠버네티스 객체는 "의도에 대한 기록"입니다 - 객체를 생성하면, 쿠버네티스 시스템은 그 객체가 존재하도록 지속적으로 작동할 것입니다. 객체를 생성함으로써, 효과적으로 쿠버네티스 시스템에게 클러스터의 워크로드가 어떻게 보여야 하는지 알려주는 것입니다; 이것이 클러스터의 원하는 상태입니다.
쿠버네티스 객체를 생성, 수정 또는 삭제하는 등의 작업을 수행하려면 쿠버네티스 API를 사용해야 합니다. 예를 들어, kubectl 명령줄 인터페이스를 사용할 때, CLI는 필요한 쿠버네티스 API 호출을 대신 수행합니다. 클라이언트 라이브러리 중 하나를 사용하여 자신의 프로그램에서 직접 쿠버네티스 API를 사용할 수도 있습니다.
객체 명세와 상태
거의 모든 쿠버네티스 객체는 객체의 구성을 관리하는 두 개의 중첩된 객체 필드를 포함합니다: 객체 명세(spec)와 객체 상태(status)입니다. spec를 가진 객체의 경우, 객체를 생성할 때 이것을 설정해야 하며, 리소스가 가져야 할 특성에 대한 설명을 제공합니다: 즉, 원하는 상태입니다.
상태는 객체의 현재 상태를 설명하며, 쿠버네티스 시스템과 그 컴포넌트에 의해 제공되고 업데이트됩니다. 쿠버네티스 컨트롤 플레인은 지속적으로 모든 객체의 실제 상태를 관리하여 사용자가 제공한 원하는 상태와 일치하도록 합니다.
예를 들어: 쿠버네티스에서 Deployment는 클러스터에서 실행 중인 애플리케이션을 나타낼 수 있는 객체입니다. Deployment를 생성할 때, 애플리케이션의 인스턴스 3개가 실행되기를 원한다고 명시하는 Deployment spec를 설정할 수 있습니다. 쿠버네티스 시스템은 Deployment spec를 읽고 원하는 애플리케이션의 인스턴스 3개를 시작합니다 - 상태를 spec과 일치하도록 업데이트합니다. 만약 이러한 인스턴스 중 하나라도 실패하면(상태 변경), 쿠버네티스 시스템은 spec과 상태 간의 차이에 대응하여 교정을 합니다 - 이 경우, 대체 인스턴스를 시작합니다.
객체 spec, 상태 및 메타데이터에 대한 자세한 정보는 쿠버네티스 API 규칙을 참조하세요.
쿠버네티스 객체 설명하기
쿠버네티스에서 객체를 생성할 때, 원하는 상태를 설명하는 객체 spec과 함께 객체에 대한 기본 정보(예: 이름)를 제공해야 합니다. 쿠버네티스 API를 사용하여 객체를 생성할 때(직접 또는 kubectl을 통해), 해당 API 요청은 요청 본문에 해당 정보를 JSON으로 포함해야 합니다. 대부분의 경우, 매니페스트라고 알려진 파일에서 kubectl에 정보를 제공합니다. 관례적으로, 매니페스트는 YAML입니다(JSON 형식도 사용할 수 있습니다). kubectl과 같은 도구는 HTTP를 통해 API 요청을 할 때 매니페스트의 정보를 JSON 또는 다른 지원되는 직렬화 형식으로 변환합니다.
다음은 쿠버네티스 Deployment에 대한 필수 필드와 객체 spec을 보여주는 예제 매니페스트입니다:
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: selector: matchLabels: app: nginx replicas: 2 # deployment에게 템플릿과 일치하는 pod 2개를 실행하라고 지시합니다 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80
위와 같은 매니페스트 파일을 사용하여 Deployment를 생성하는 한 가지 방법은 kubectl 명령줄 인터페이스에서 kubectl apply 명령을 사용하여 .yaml 파일을 인수로 전달하는 것입니다. 예를 들면 다음과 같습니다:
kubectl apply -f https://k8s.io/examples/application/deployment.yaml
출력은 다음과 유사합니다:
deployment.apps/nginx-deployment created
필수 필드
생성하려는 쿠버네티스 객체의 매니페스트(YAML 또는 JSON 파일)에서 다음 필드에 대한 값을 설정해야 합니다:
- apiVersion - 객체를 생성하기 위해 사용 중인 쿠버네티스 API 버전
- kind - 생성하려는 객체의 종류
- metadata - 객체를 고유하게 식별하는 데 도움이 되는 데이터(이름 문자열, UID 및 선택적 네임스페이스 포함)
- spec - 객체에 대해 원하는 상태
객체 spec의 정확한 형식은 각 쿠버네티스 객체마다 다르며, 해당 객체에 특화된 중첩 필드를 포함합니다. 쿠버네티스 API 참조는 쿠버네티스를 사용하여 생성할 수 있는 모든 객체의 spec 형식을 찾는 데 도움이 될 수 있습니다.
예를 들어, Pod API 참조의 spec 필드를 참조하십시오. 각 Pod에 대해 .spec 필드는 pod와 그 원하는 상태(예: pod 내의 각 컨테이너에 대한 컨테이너 이미지 이름)를 지정합니다. 객체 명세의 또 다른 예는 StatefulSet API의 spec 필드입니다. StatefulSet의 경우, .spec 필드는 StatefulSet과 그 원하는 상태를 지정합니다. StatefulSet의 .spec 내에는 Pod 객체에 대한 템플릿이 있습니다. 해당 템플릿은 StatefulSet 컨트롤러가 StatefulSet 명세를 충족하기 위해 생성할 Pod를 설명합니다. 서로 다른 종류의 객체는 또한 서로 다른 .status를 가질 수 있습니다; 다시 말해, API 참조 페이지는 각기 다른 유형의 객체에 대한 .status 필드의 구조와 내용을 자세히 설명합니다.
참고: YAML 구성 파일 작성에 대한 추가 정보는 구성 모범 사례를 참조하십시오.
서버 측 필드 검증
쿠버네티스 v1.25부터, API 서버는 객체의 인식할 수 없거나 중복된 필드를 감지하는 서버 측 필드 검증을 제공합니다. 이는 서버 측에서 kubectl --validate의 모든 기능을 제공합니다.
kubectl 도구는 --validate 플래그를 사용하여 필드 검증 수준을 설정합니다. 이는 ignore, warn 및 strict 값을 받아들이며, true(strict와 동일) 및 false(ignore와 동일) 값도 받아들입니다. kubectl의 기본 검증 설정은 --validate=true입니다.
Strict
엄격한 필드 검증, 검증 실패 시 오류 발생
Warn
필드 검증이 수행되지만, 요청을 실패시키지 않고 오류가 경고로 노출됨
Ignore
서버 측 필드 검증이 수행되지 않음
kubectl이 필드 검증을 지원하는 API 서버에 연결할 수 없는 경우, 클라이언트 측 검증을 사용하는 것으로 대체됩니다. 쿠버네티스 1.27 이상 버전은 항상 필드 검증을 제공합니다; 이전 쿠버네티스 릴리스는 제공하지 않을 수 있습니다. 클러스터가 v1.27보다 이전 버전인 경우, 해당 쿠버네티스 버전의 문서를 확인하십시오.
다음 단계
쿠버네티스를 처음 접하는 경우, 다음에 대해 더 많이 읽어보세요:
- 가장 중요한 기본 쿠버네티스 객체인 Pod.
- Deployment 객체.
- 쿠버네티스의 컨트롤러.
- kubectl 및 kubectl 명령어.
- kubectl이 없는 경우 설치해야 할 수 있는 쿠버네티스 객체 관리는 kubectl을 사용하여 객체를 관리하는 방법을 설명합니다.
일반적으로 쿠버네티스 API에 대해 알아보려면 다음을 방문하세요:
- 쿠버네티스 API 개요
쿠버네티스의 객체에 대해 더 깊이 알아보려면 이 섹션의 다른 페이지를 읽어보세요:
- 쿠버네티스 객체 관리
- 객체 이름 및 ID
- 레이블 및 셀렉터
- 네임스페이스
- 어노테이션
- 필드 셀렉터
- 파이널라이저
- 소유자 및 종속성
- 권장 레이블