권장 라벨

kubectl과 대시보드보다 더 많은 도구로 쿠버네티스 객체를 시각화하고 관리할 수 있어요. 공통 라벨 집합을 사용하면 모든 도구가 이해할 수 있는 공통된 방식으로 객체를 설명해 도구가 상호 운용 가능하게 동작해요.

도구 지원에 더해 권장 라벨은 쿼리할 수 있는 방식으로 애플리케이션을 설명해요.

이 메타데이터는 애플리케이션이라는 개념을 중심으로 구성돼요. 쿠버네티스는 플랫폼 서비스(PaaS)가 아니며 애플리케이션에 대한 공식적인 개념을 가지거나 강제하지 않아요. 대신 애플리케이션은 비공식적이며 메타데이터로 설명돼요. 애플리케이션이 무엇을 포함하는지에 대한 정의는 느슨해요.

참고:

공유 라벨과 애노테이션은 공통 접두사 app.kubernetes.io 를 공유해요. 접두사가 없는 라벨은 사용자에게 사적인 것이에요. 공유 접두사는 공유 라벨이 사용자 정의 라벨과 간섭하지 않도록 보장해요.

출처: 문서

본문

라벨 (Labels)

이 라벨들을 완전히 활용하려면 모든 리소스 객체에 적용해야 해요.

설명 예시 유형
app.kubernetes.io/name 애플리케이션의 이름 mysql string
app.kubernetes.io/instance 애플리케이션의 인스턴스를 식별하는 고유한 이름 mysql-abcxyz string
app.kubernetes.io/version 애플리케이션의 현재 버전(예: SemVer 1.0, 리비전 해시 등) 5.7.21 string
app.kubernetes.io/component 아키텍처 안의 컴포넌트 database string
app.kubernetes.io/part-of 이것이 일부인 상위 수준 애플리케이션의 이름 wordpress string
app.kubernetes.io/managed-by 애플리케이션 운영을 관리하는 데 사용되는 도구 Helm string

이 라벨들이 실제로 어떻게 사용되는지 보여주기 위해 다음 StatefulSet 객체를 고려해 봐요:

# This is an excerpt
apiVersion: apps/v1
kind: StatefulSet
metadata:
  labels:
    app.kubernetes.io/name: mysql
    app.kubernetes.io/instance: mysql-abcxyz
    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의 다른 설치인 경우 한 번 이상 설치될 수 있어요.

애플리케이션의 이름과 인스턴스 이름은 별도로 기록돼요. 예를 들어 WordPress는 app.kubernetes.io/namewordpress 면서 인스턴스 이름은 app.kubernetes.io/instancewordpress-abcxyz 로 표현돼요. 이를 통해 애플리케이션과 애플리케이션의 인스턴스를 식별할 수 있어요. 애플리케이션의 모든 인스턴스는 고유한 이름을 가져야 해요.

예시 (Examples)

이 라벨들을 사용하는 다양한 방법을 보여주기 위해 다음 예시는 복잡도가 다양해요.

간단한 무상태 서비스 (A Simple Stateless Service)

DeploymentService 객체로 배포된 간단한 무상태 서비스의 경우를 고려해 봐요. 다음 두 스니펫은 라벨을 가장 단순한 형태로 사용하는 방법을 나타내요.

Deployment는 애플리케이션 자체를 실행하는 파드를 감독하는 데 사용돼요.

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

Service는 애플리케이션을 노출하는 데 사용돼요.

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

데이터베이스가 있는 웹 애플리케이션 (Web Application With A Database)

약간 더 복잡한 애플리케이션을 고려해 봐요: Helm으로 설치된, 데이터베이스(MySQL)를 사용하는 웹 애플리케이션(WordPress). 다음 스니펫은 이 애플리케이션을 배포하는 데 사용되는 객체의 시작 부분을 보여줘요.

다음 Deployment 의 시작 부분은 WordPress용이에요:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app.kubernetes.io/name: wordpress
    app.kubernetes.io/instance: wordpress-abcxyz
    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는 WordPress를 노출하는 데 사용돼요:

apiVersion: v1
kind: Service
metadata:
  labels:
    app.kubernetes.io/name: wordpress
    app.kubernetes.io/instance: wordpress-abcxyz
    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 으로 노출돼요:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  labels:
    app.kubernetes.io/name: mysql
    app.kubernetes.io/instance: mysql-abcxyz
    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는 MySQL을 WordPress의 일부로 노출하는 데 사용돼요:

apiVersion: v1
kind: Service
metadata:
  labels:
    app.kubernetes.io/name: mysql
    app.kubernetes.io/instance: mysql-abcxyz
    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 양쪽에 대한 정보가 포함된 것을 볼 수 있어요.

더 알아보기 (Learn more)