ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Kubernetes] 쿠버네티스 오브젝트 이해하기
    공부/데이터 2023. 3. 4. 15:55

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

    쿠버네티스는 컨테이너 오케스트레이션 시스템으로, 애플리케이션을 배포, 확장 및 관리하는 데 사용됩니다. 이를 위해 쿠버네티스는 다양한 오브젝트를 사용합니다. 쿠버네티스 오브젝트는 쿠버네티스 시스템의 영속성을 가지는 오브젝트입니다. 이 오브젝트를 이용하여 쿠버네티스는 클러스터의 상태를 표시합니다. 구체적으로는 다음과 같습니다.

    • 어떤 컨테이너화된 애플리케이션이 동작 중인지 (그리고 어느 노드에서 동작 중인지)
    • 애플리케이션이 이용할 수 있는 리소스
    • 애플리케이션이 재구동, 업그레이드, 내고장성 등에 대해 어떻게 동작해야 하는지에 대한 정책

    쿠버네티스 오브젝트는 하나의 의도를 담은 레코드입니다. 오브젝트를 생성하면, 쿠버네티스 시스템은 그 오브젝트 생성을 보장하기 위해 지속적으로 작동합니다. 오브젝트를 생성함으로써 클러스터의 워크로드를 어떤 형태로 보이고자 하는지 효과적으로 쿠버네티스 시스템에 전달할 수 있습니다. 이것이 바로 여러분의 클러스터에 대한 의도한 상태가 됩니다.

    쿠버네티스 오브젝트를 생성, 수정, 또는 삭제하려면 쿠버네티스 API를 이용해야 합니다. 예를 들어, kubectl 커맨드-라인 인터페이스를 이용할 때, CLI는 필요한 쿠버네티스 API를 호출합니다. 또한, 클라이언트 라이브러리 중 하나를 이용하여 프로그램에서 쿠버네티스 API를 직접 이용할 수 있습니다.

    오브젝트란?

    쿠버네티스에서 오브젝트는 시스템에서 배포하고 관리하는 기본 단위입니다. 모든 오브젝트는 쿠버네티스 API를 통해 생성, 수정 및 삭제할 수 있습니다. 오브젝트는 YAML 또는 JSON 형식으로 정의됩니다.

    종류

    쿠버네티스에는 다양한 오브젝트가 있습니다. 그 중 일부는 다음과 같습니다.

    • Pod: 하나 이상의 컨테이너를 포함하며, 쿠버네티스에서 가장 작은 배포 단위입니다.
    • Service: Pod에 대한 네트워크 엔드포인트를 노출합니다.
    • Volume: 데이터를 저장하기 위한 디렉토리 또는 디렉토리 트리입니다.
    • Namespace: 쿠버네티스 클러스터 내에서 가상 클러스터를 생성합니다.
    • Deployment: Pod와 ReplicaSet을 생성하고 관리합니다.
    • StatefulSet: 디스크 상태가 있는 애플리케이션을 배포하고 관리합니다.
    • DaemonSet: 모든 노드에서 실행되는 Pod를 배포하고 관리합니다.
    • Job: 일시적인 작업을 실행하고 완료될 때까지 대기합니다.

    오브젝트 명세(spec)와 상태(status)

    거의 모든 쿠버네티스 오브젝트는 오브젝트의 구성을 결정해주는 두 개의 중첩된 오브젝트 필드를 포함하는데 오브젝트 spec 과 오브젝트 status 이다. spec을 가진 오브젝트는 오브젝트를 생성할 때 리소스에 원하는 특징(의도한 상태)에 대한 설명을 제공해서 설정한다.

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

    예를 들어, 쿠버네티스 디플로이먼트는 클러스터에서 동작하는 애플리케이션을 표현해줄 수 있는 오브젝트이다. 디플로이먼트를 생성할 때, 디플로이먼트 spec에 3개의 애플리케이션 레플리카가 동작되도록 설정할 수 있다. 쿠버네티스 시스템은 그 디플로이먼트 spec을 읽어 spec에 일치되도록 상태를 업데이트하여 3개의 의도한 애플리케이션 인스턴스를 구동시킨다. 만약, 그 인스턴스들 중 어느 하나가 어떤 문제로 인해 멈춘다면(상태 변화 발생), 쿠버네티스 시스템은 보정(이 경우에는 대체 인스턴스를 시작하여)을 통해 spec과 status간의 차이에 대응한다.

    오브젝트 명세, 상태, 그리고 메타데이터에 대한 추가 정보는, Kubernetes API Conventions 를 참조한다.

    쿠버네티스 오브젝트 대부분은 두 개의 중첩된 필드를 포함하며, 이는 오브젝트의 구성을 결정합니다. 이 필드는 specstatus 입니다.

    spec을 가진 오브젝트는 해당 리소스를 생성할 때 설정하려는 기능(의도한 상태)에 대한 설명을 제공합니다.

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

    예를 들어, 쿠버네티스 디플로이먼트는 클러스터 내에서 실행되는 애플리케이션을 표현하는 오브젝트입니다. 디플로이먼트를 생성할 때, 디플로이먼트 spec은 3개의 애플리케이션 레플리카를 설정할 수 있습니다. 쿠버네티스 시스템은 디플로이먼트 spec을 읽어 해당 상태를 업데이트하여 3개의 의도한 애플리케이션 인스턴스를 구동합니다. 만약, 그 인스턴스 중 하나가 멈춘다면(상태 변화 발생), 시스템은 대체 인스턴스를 시작하여 spec과 status간의 차이를 보정합니다.

    추가적인 오브젝트 명세, 상태, 메타데이터에 대한 정보는 Kubernetes API Conventions에서 자세히 확인할 수 있습니다.

    쿠버네티스 오브젝트 생성하기

    쿠버네티스에서 오브젝트를 생성할 때, 해당 오브젝트의 기본 정보뿐만 아니라 의도한 상태를 나타내는 오브젝트 spec을 함께 제공해야 합니다. 쿠버네티스 API를 통해 오브젝트를 생성하는 경우, API 요청은 JSON 형식으로 정보를 담아 전송합니다. 보통은 정보를 .yaml 파일로 kubectl에 제공하며, 이 때 kubectl은 자동으로 JSON 형식으로 변환해 줍니다.

    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 포맷을 살펴볼 수 있도록 해줍니다.

    예를 들어 파드 API 레퍼런스를 보면, spec 필드를 참조합니다. 각 파드에 대해, spec 필드는 파드 및 파드의 원하는 상태를 기술합니다. (예: 파드의 각 컨테이너에 대한 컨테이너 이미지) 스테이트풀셋 API의 spec 필드는 스테이트풀셋 및 스테이트풀셋의 원하는 상태를 기술합니다. 스테이트풀셋의 spec에는 파드 오브젝트에 대한 템플릿이 존재합니다. 이 템플릿은 스테이트풀셋 명세를 만족시키기 위해 생성할 파드에 대한 상세 사항을 설명합니다. 서로 다른 종류의 오브젝트는 서로 다른 .status를 가질 수 있습니다.

    레퍼런스

    https://kubernetes.io/ko/docs/concepts/overview/working-with-objects/object-management/

    댓글