Objects
쿠버네티스 시스템에서 가장 기본이 되는 단위인 '오브젝트'에 대해 학습한 내용을 정리합니다. 클러스터의 상태를 정의하고 관리하는 핵심 개념인 만큼 확실하게 이해하고 넘어가고자 합니다.
이 문서는 쿠버네티스 공식 문서를 읽고 이해한 내용을 토대로 글을 재구성했습니다.
공식 문서에 따르면, 쿠버네티스 오브젝트(Kubernetes Object)는 쿠버네티스 시스템에서 영속성을 가지는 오브젝트라고 합니다.
이 오브젝트를 사용하는 목적은 쿠버네티스는 클러스터의 상태를 표현하기 위함 입니다.
구체적으로 오브젝트는 다음 사항들을 기술합니다.
- 어떤 컨테이너화된 애플리케이션이 동작 중인지 (어느 노드에서 동작 중인지)
- 그 애플리케이션이 이용할 수 있는 리소스
- 재구동 정책, 업그레이드, 내고장성과 같은 애플리케이션의 동작 정책
의도한 상태 (Desired State)
쿠버네티스 오브젝트는 하나의 의도를 담은 레코드Record of Intent라고 합니다.
일반적인 상태 State가 기록된 객체 형태의 데이터--으로 러프하게 이해했습니다.
이 데이터(쿠버네티스 오브젝트)를 생성하여 클러스터의 워크로드가 어떤 형태여야 하는지를 쿠버네티스 시스템에 전달합니다.
이것이 바로 클러스터에 대한 의도한 상태Desired State가 된다--고 합니다.
오브젝트가 생성되면, 쿠버네티스 시스템은 그 생성을 보장하고 유지하기 위해 지속적으로 작동합니다.
Spec과 Status
거의 모든 쿠버네티스 오브젝트는 구성을 결정하는 두 개의 핵심 필드를 포함합니다.
| 필드 | 설명 |
|---|---|
spec | 사용자가 의도한 상태(Desired State). 오브젝트를 생성할 때 설정하는 내용입니다. |
status | 시스템에 의해 관리되는 현재 상태(Current State). 쿠버네티스 컴포넌트가 업데이트합니다. |
쿠버네티스 컨트롤 플레인은 status가 spec과 일치하도록 끊임없이 관리합니다.
이 과정을 조정 루프 Reconciliation Loop라고 합니다.
예를 들어, Deployment를 생성할 때 spec에 "3개의 레플리카"를 설정했다고 가정해 봅시다.
- 쿠버네티스 시스템은
spec을 읽고 3개의 인스턴스를 구동합니다. - 만약 하나가 중단되어 2개만 남게 되면(
status변화), - 시스템은 다시 3개를 맞추기 위해 새로운 인스턴스를 시작합니다(
spec과status의 불일치 해소).
오브젝트 기술하기 (.yaml)
쿠버네티스 API를 통해 오브젝트를 생성할 때, 일반적으로 .yaml 파일을 사용합니다.
필수적으로 포함되어야 하는 required 필드들은 다음과 같습니다:
apiVersion: 이 오브젝트를 생성하기 위한 API 버전kind: 생성하고자 하는 오브젝트의 종류 (예:Deployment,Pod,Service)metadata: 이름(name),UID, 네임스페이스(namespace) 등 오브젝트를 유일하게 식별할 데이터spec: 오브젝트에 대해 의도하는 상태
예시: Nginx Deployment
다음은 Nginx 애플리케이션을 배포하기 위한 Deployment 오브젝트의 예시입니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2 # 템플릿과 일치하는 파드 2개를 구동하도록 설정
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
위 파일을 작성 후 kubectl 명령어를 통해 오브젝트를 생성할 수 있습니다.
kubectl apply -f application/deployment.yaml
이 명령을 실행하면 쿠버네티스는 deployment.apps/nginx-deployment created와 같은 메시지를 출력하며, 우리가 정의한 spec에 따라 애플리케이션 배포를 시작합니다.
다음 글에선 쿠버네티스 공식 문서의 이어지는 내용과 Object의 필드 상세와 yaml 구조를 살펴보도록 하겠습니다.