쿠버네티스 오브젝트란?
쿠버네티스 오브젝트는 쿠버네티스 시스템에서 영속성을 가지는 오브젝트로, 클러스터의 상태(state)를 나타내기 위해 사용한다. 클러스터의 상태는 아래와 같이 나열할 수 있다.
- 어느 노드에서 어떤 컨테이너화된 애플리케이션이 동작 중인지
- 그 애플리케이션이 이용할 수 있는 리소스의 정보
- 그 애플리케이션이 어떻게 재구동, 업그레이드, 내고장성(fault-tolerance)과 같은 것에 동작해야 하는지에 대한 정책
쿠버네티스 오브젝트는 하나의 "의도(intent)를 담은 레코드"이다. 오브젝트를 생성하게 되면, 쿠버네티스 시스템은 그 오브젝트 생성을 보장하기 위해 지속적으로 작동하고, 사용자가 클러스터의 워크로드를 어떤 형태로 보이고자 하는지에 대해 효과적으로 쿠버네티스 시스템에 전달하는 이것이 바로 여러분의 클러스터에 대해 의도한 상태(desired state)가 된다.
생성이든, 수정이든, 삭제든 쿠버네티스 오브젝트를 동작시키려면, 쿠버네티스 API 를 이용해야 한다. 예를 들어, kubectl cli 를 이용할 때, cli 는 여러분 대신 필요한 쿠버네티스 API 를 호출해 준다. 또한, 클라이언트 라이브러리 중 하나를 이용하여 프로그램에서 쿠버네티스 API 를 직접 이용할 수도 있다.
오브젝트 명세(spec)와 상태(status)
대부분의 쿠버네티스 오브젝트는 오브젝트의 구성을 결정해주는 두 개의 중첩된 오브젝트 필드 object spec 과 object status 을 포함한다.
spec 은 오브젝트를 생성할 때 리소스에 원하는 특징(desired state)에 대한 설명을 작성하여 설정한다.
status 는 쿠버네티스 시스템과 컴포넌트에 의해 제공되고 업데이트된 오브젝트의 현재 상태(current state)를 제공한다. 쿠버네티스 컨트롤 플레인은 모든 오브젝트의 실제 상태를 사용자가 의도한 상태와 일치시키기 위해 끊임없이 능동적으로 관리한다.
예를 들어, 쿠버네티스 디플로이먼트는 클러스터에서 동작하는 애플리케이션을 표현해줄 수 있는 오브젝트이다. 디플로이먼트를 생성할 때, 디플로이먼트 spec 에 3개의 애플리케이션 레플리카가 동작되도록 설정할 수 있다. 쿠버네티스 시스템은 그 디플로이먼트 spec 을 읽어 spec 에 일치되도록 상태를 업데이트하여 3개의 의도한 애플리케이션 인스턴스를 구동시킨다. 만약, 그 인스턴스들 중 어느 하나가 어떤 문제로 인해 멈춘다면(상태 변화 발생), 쿠버네티스 시스템은 보정(이 경우에는 대체 인스턴스를 시작하여)을 통해 spec 과 status 간의 차이에 매꾸려고 노력한다.
쿠버네티스 오브젝트 작성하기
쿠버네티스에서 오브젝트를 생성할 때, 이름과 같은 오브젝트에 대한 기본적인 정보와 더불어 의도한 상태를 기술한 오브젝트 spec 을 작성해야만 한다. 오브젝트를 생성하기 위해(직접이든 또는 kubectl cli 를 통해서든) 쿠버네티스 API 를 이용할 때, API 요청은 요청 내용 안에 JSON 형식으로 정보를 포함시켜 줘야만 한다. 대부분의 경우 정보를 .yaml 파일로 kubectl 에 제공한다. kubectl cli 는 API 요청이 이루어질 때, .yaml 파일을 JSON 형식으로 정보를 변환시켜 준다.
여기 쿠버네티스 디플로이먼트를 위한 필수 필드와 오브젝트 spec 을 보여주는 .yaml 파일 예시는 아래와 같다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2 # tells deployment to run 2 pods matching the template
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
위 예시와 같이 .yaml 파일을 이용하여 디플로이먼트를 생성하기 위한 하나의 방식으로는 kubectl cli 에 인자값으로 .yaml 파일을 건네 kubectl apply 커맨드를 이용한다.
kubectl apply -f https://k8s.io/examples/application/deployment.yaml
수행 결과는 아래와 같다.
deployment.apps/nginx-deployment created
필수 속성
생성하고자 하는 쿠버네티스 오브젝트에 대한 .yaml 파일 내에는 다음 필드를 위한 값들을 설정해 줘야한다.
- apiVersion: 이 오브젝트를 생성하기 위해 사용하고 있는 쿠버네티스 API 버전이 어떤 것인지
- kind: 어떤 종류의 오브젝트를 생성하고자 하는지
- metadata: 이름 문자열, UID, 그리고 선택적인 네임스페이스를 포함하여 오브젝트를 유일하게 구분지어 줄 데이터
- spec: 오브젝트에 대해 어떤 상태를 의도하는지
오브젝트 spec 에 대한 정확한 포맷은 모든 쿠버네티스 오브젝트마다 다르고, 그 오브젝트 특유의 중첩된 필드를 포함한다. 쿠버네티스 API 레퍼런스에 쿠버네티스를 이용하여 생성할 수 있는 오브젝트에 대한 모든 spec 포맷을 제공한다.
예를 들어, 파드(pod) API 레퍼런스를 보려면 spec 필드를 참조한다. 각 파드에 대해 .spec 필드는 파드 및 파드의 원하는 상태(desired state)를 기술한다(예: 파드의 각 컨테이너에 대한 컨테이너 이미지). 오브젝트 상세에 대한 또 다른 예시는 스테이트풀셋 API의 spec 필드이다. 스테이트풀셋의 경우, .spec 필드는 스테이트풀셋 및 스테이트풀셋의 원하는 상태(desired state)를 기술한다. 스테이트풀셋의 .spec에는 파드 오브젝트에 대한 템플릿이 존재한다. 이 템플릿은 스테이트풀셋 명세를 만족시키기 위해 스테이트풀셋 컨트롤러가 생성할 파드에 대한 상세 사항을 설명한다. 서로 다른 종류의 오브젝트는 서로 다른 .status를 가질 수 있다.