쿠버네티스 객체 이해하기 - Kubernetes Object

본 포스팅은 Kubernetes Official Documents를 기반으로 한다.

 

 

쿠버네티스 오브젝트 이해하기

이 페이지에서는 쿠버네티스 오브젝트가 쿠버네티스 API에서 어떻게 표현되고, 그 오브젝트를 어떻게 .yaml 형식으로 표현할 수 있는지에 대해 설명한다. 쿠버네티스 오브젝트 이해하기 쿠버네티

kubernetes.io


https://medium.com/devops-mojo/kubernetes-objects-resources-overview-introduction-understanding-kubernetes-objects-24d7b47bb018

본 포스팅에서는 쿠버네티스 오브젝트가 쿠버네티스 API에서 어떻게 표현되고, 그 오브젝트를 어떻게 .yaml 형식으로 표현할 수 있는지에 대해 설명한다.

# Kubernetes Object 이해하기

쿠버네티스 오브젝트는 쿠버네티스 시스템에서 영속성을 가지는 오브젝트이다. 쿠버네티스는 클러스터의 상태를 나타내기 위해 이 오브젝트를 사용한다. 구체적으로 말하면, 다음과 같이 기술이 가능하다.

 

  • 어떤 컨테이너화된 애플리케이션이 동작 중인지 (그리고 어느 노드에서 동작 중인지)
  • 그 애플리케이션이 사용할 수 있는 리소스
  • 그 애플리케이션이 어떤 Restart Policy, Upgrade, 그리고 내 고장성과 같은 상황에 동작해야하는 지에 대한 정책

쿠버네티스 오브젝트는 "하나의 의도를 담은 레코드"이다. 오브젝트를 생성하게 되면, 쿠버네티스 시스템은 그 오브젝트 생성을 보장하기 위해 지속적으로 작동할 것이다. 오브젝트를 생성함으로써, 클러스터의 워크로드를 어떤 형태로 보이고자 하는지에 대해 효과적으로 쿠버네티스 시스템에 전달이 된다. 이를 통해 사용자의 클러스터에 대해 요청한(의도한) 상태가 된다.


Object Specification(spec) & Status(status)

대부분의 쿠버네티스 오브젝트는 오브젝트의 구성을 결정해주는 두 개의 중첩된 오브젝트 필드를 포함하는데, 오브젝트 `spec`과 오브젝트 `status`이다. 


`spec`을 가진 오브젝트는 오브젝트를 생성할 때 리소스에 원하는 특징(의도한 상태)에 대한 설명을 제공해서 이를 해당 오브젝트가 상태를 갖도록 유지한다.

 

status는 쿠버네티스 시스템과 컴포넌트에 의해 제공되고 업데이트된 오브젝트의 현재 상태를 설명한다. 쿠버네티스 컨트롤 플레인은 모든 오브젝트의 실제 상태를 사용자가 의도한 상태와 일치시키기 위해 끊임없이 그리고 능동적으로 관리한다.

 

예를 들어, Kubernetes Deployment는 클러스터에서 동작하는 애플리케이션을 표현해줄 수 잇는 오브젝트이다. 디플로이먼트를 생성할 때, 디플로이먼트 spec에 3개의 replicas가 동작되도록 설정할 수 있다.

 

쿠버네티스 시스템은 해당 디플로이먼트의 spec을 읽어 spec에 일치되도록 상태를 업데이트하여 3개의 의도한 애플리케이션의 인스턴스를 구동시킨다. 만약, 그 인스턴스들 중 어느 하나가 어떤 문제로 인해 멈춘다면(status의 변화 발생), 쿠버네티스 시스템은 보정을 통해 spec과 status 간의 차이에 대응한다.

 

Object spec, status, 그리고 metadata에 대한 추가 정보는 아래 글을 참조한다.

https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md


Kubernetes Object 기술하기

쿠버네티스 오브젝트를 생성할 때, (이름과 같은) 오브젝트에 대한 기본적인 정보와 더불어, 의도한 상태를 기술한 오브젝트 spec을 제시해 줘야만 한다.

 

오브젝트를 생성하기 위해 (API에 직접 요청하든, kubectl를 통해서든) 쿠버네티스 API를 이용할 때, API 요청은 요청 내용 안에 JSON 형식으로 정보를 포함시켜 줘야만 한다.


대부분의 경우 정보를 .yaml 파일로 kubectl에 제공한다. `kubectl`은 API 요청이 이루어질 때, 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

필수 필드 값 - Required Field 

생성하고자 하는 쿠버네티스 오브젝트에 대한 .yaml 파일 내, 다음 필드를 위한 값들을 설정해 줘야한다.

 

  • apiVersion: 이 오브젝트를 생성하기 위해 사용하고 있는 쿠버네티스 API 버전이 어떤 것인지 명시
  • kind: 어떤 종류의 오브젝트를 생성하고자 하는지 명시
  • metadata: `이름 문자열`, `UID`, `네임스페이스`를 포함하여 오브젝트를 유일하게 구분지어 줄 데이터
  • spec: 오브젝트에 대해 사용자가 의도한 상태

오브젝트 `spec`에 대한 정확한 포맷(양식)은 모든 쿠버네티스 오브젝트마다 다르고, 해당 오브젝트 특유의 중첩된 필드를 포함한다.

 

쿠버네티스 API 레퍼런스는 쿠버네티스를 이용항 생성할 수 있는 오브젝트에 대한 모든 spec 포맷을 살펴볼 수 있도록 해준다.

 

Kubernetes API Reference Docs

API Overview Welcome to the Kubernetes API. You can use the Kubernetes API to read and write Kubernetes resource objects via a Kubernetes API endpoint. Resource Categories This is a high-level overview of the basic types of resources provide by the Kuberne

kubernetes.io

 

예를 들어, Pod API Reference를 보려면, spec 필드를 참조한다. 각 파드에 대해, .spec 필드는 파드 및 파드의 원하는 상태(desired state)를 기술한다(예: 파드의 각 컨테이너에 대한 컨테이너 이미지). 

 

오브젝트 상세에 대한 또 다른 예시는 StatefulSet API의 spec 필드이다. 스테이트풀셋의 경우, .spec 필드는 스테이트풀셋 및 스테이트풀셋의 desired state를 기술한다. 스테이트풀셋의 .spec에는 파드 오브젝트에 대한 템플릿(template)이 존재한다.

 

이 템플릿은 스테이트풀셋 명세를 만족시키기 위해 스테이트풀셋 컨트롤러가 생성할 파드에 대한 상세 사항을 설명한다.

 

서로 다른 종류의 오브젝트는 서로 다른 .status를 가질 수 있다.

 

 

 

728x90
반응형