ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Kubernetes] 권장 레이블
    공부/데이터 2023. 4. 16. 22:22

    kubectl, 대시보드 등의 도구로 쿠버네티스 오브젝트를 시각화하고 관리할 수 있습니다. 공통 레이블 셋은 오브젝트를 식별하고 도구들이 상호 운용할 수 있도록 지원합니다.

    권장 레이블은 쿼리하여 애플리케이션을 식별하는 데에 도움이 됩니다.

    메타데이터는 애플리케이션 개념을 중심으로 정리됩니다. 쿠버네티스는 PaaS가 아니며 공식적인 애플리케이션 개념을 강요하지 않습니다. 대신, 애플리케이션은 비공식적으로 메타데이터로 설명됩니다. 애플리케이션의 정의는 유연합니다.

    💡 메타데이터는 애플리케이션 관리를 쉽게하기 위해 권장되는 레이블이지만, 코어 도구에는 필요하지 않습니다.

    app.kubernetes.io는 공유 레이블과 주석에서 사용되는 공통 접두사입니다. 사용자 정의 레이블에는 이 접두사가 없으며, 공유 접두사는 사용자 정의 레이블에 영향을 미치지 않도록 합니다.

    공유 레이블

    레이블을 최대한 활용하려면 모든 리소스 오브젝트에 적용해야 합니다.

    설명 예시 타입
    app.kubernetes.io/name 애플리케이션 이름 mysql 문자열
    app.kubernetes.io/instance 애플리케이션의 인스턴스를 식별하는 고유한 이름 mysql-abcxzy 문자열
    app.kubernetes.io/version 애플리케이션의 현재 버전 (예: a semantic version, revision hash 등.) 5.7.21 문자열
    app.kubernetes.io/component 아키텍처 내 구성요소(component) database 문자열
    app.kubernetes.io/part-of 애플리케이션의 전체 이름 (애플리케이션이 속한 그룹을 정의) wordpress 문자열
    app.kubernetes.io/managed-by 애플리케이션의 작동을 관리하는 데 사용되는 도구 helm 문자열

    권장 레이블을 사용하는 것은 애플리케이션을 관리하는 데 매우 유용합니다. 레이블을 활용하면 특정 애플리케이션의 인스턴스를 쉽게 관리하거나, 레이블을 기반으로 한 셀렉터(Selector)를 사용하여 특정 오브젝트를 선택하는 등의 작업을 수행할 수 있습니다.

    위 레이블 예시는 스테이트풀셋 오브젝트을 고려합니다.

    # 아래는 전체 명세의 일부분
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      labels:
        app.kubernetes.io/name: mysql
        app.kubernetes.io/instance: mysql-abcxzy
        app.kubernetes.io/version: "5.7.21"
        app.kubernetes.io/component: database
        app.kubernetes.io/part-of: wordpress
        app.kubernetes.io/managed-by: helm

    애플리케이션과 애플리케이션 인스턴스

    애플리케이션은 같은 쿠버네티스 클러스터, 같은 네임스페이스에서 여러 번 설치될 수 있습니다. 예를 들어 WordPress의 경우, 쿠버네티스 클러스터에 여러 버전이 설치되어 각각 다른 웹사이트를 제공할 수 있습니다.

    애플리케이션 및 애플리케이션 인스턴스 이름은 별도로 기록됩니다. 예를 들어 WordPress의 경우, 애플리케이션 이름은 app.kubernetes.io/name 레이블에 wordpress 값을 가지며, 애플리케이션 인스턴스 이름은 app.kubernetes.io/instance 레이블에 wordpress-abcxzy 값을 가집니다. 이를 통해 애플리케이션과 애플리케이션 인스턴스를 식별할 수 있습니다. 모든 애플리케이션 인스턴스는 고유한 이름을 가져야 합니다.

    예시

    위 레이블을 사용하는 다른 방식에 대한 예시는 다양한 복잡성이 있습니다.

    단순한 스테이트리스 서비스

    DeploymentService 객체를 통해 배포된 단순한 스테이트리스 서비스의 경우를 살펴보겠습니다. 다음 두 식별자는 레이블을 가장 간단한 형태로 사용하는 방법을 나타냅니다.

    Deployment은 애플리케이션을 실행하는 파드를 감시하는 데 사용합니다.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app.kubernetes.io/name: myservice
        app.kubernetes.io/instance: myservice-abcxzy
    ...

    Service는 애플리케이션을 노출하기 위해 사용합니다.

    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app.kubernetes.io/name: myservice
        app.kubernetes.io/instance: myservice-abcxzy
    ...

    데이터베이스가 있는 웹 애플리케이션

    Helm을 이용해 웹 애플리케이션(WordPress)을 설치하는 것처럼, 더 복잡한 애플리케이션도 고려할 수 있습니다. 다음 식별자는 이 애플리케이션을 배포하는 데 사용하는 오브젝트의 시작을 보여줍니다.

    WordPress를 배포할 때 Deployment를 사용합니다.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app.kubernetes.io/name: wordpress
        app.kubernetes.io/instance: wordpress-abcxzy
        app.kubernetes.io/version: "4.9.4"
        app.kubernetes.io/managed-by: helm
        app.kubernetes.io/component: server
        app.kubernetes.io/part-of: wordpress
    ...

    Service 는 애플리케이션을 노출하기 위해 사용합니다.

    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app.kubernetes.io/name: wordpress
        app.kubernetes.io/instance: wordpress-abcxzy
        app.kubernetes.io/version: "4.9.4"
        app.kubernetes.io/managed-by: helm
        app.kubernetes.io/component: server
        app.kubernetes.io/part-of: wordpress
    ...

    MySQL의 StatefulSet에는 MySQL 소속 및 상위 애플리케이션에 대한 메타 데이터가 노출됩니다.

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      labels:
        app.kubernetes.io/name: mysql
        app.kubernetes.io/instance: mysql-abcxzy
        app.kubernetes.io/version: "5.7.21"
        app.kubernetes.io/managed-by: helm
        app.kubernetes.io/component: database
        app.kubernetes.io/part-of: wordpress
    ...

    Service 는 WordPress의 일부로 MySQL을 노출하는 데 이용합니다.

    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app.kubernetes.io/name: mysql
        app.kubernetes.io/instance: mysql-abcxzy
        app.kubernetes.io/version: "5.7.21"
        app.kubernetes.io/managed-by: helm
        app.kubernetes.io/component: database
        app.kubernetes.io/part-of: wordpress
    ...

    MySQL StatefulSetService 로 MySQL과 WordPress가 더 큰 범위의 애플리케이션에 포함되어 있는 것을 알 수 있습니다.

    레퍼런스

    https://kubernetes.io/ko/docs/concepts/overview/working-with-objects/common-labels/

    댓글