권장 라벨
권장 라벨 (Recommended Labels)
Kubernetes 객체를 설명하는 공통 라벨 집합에 대해 소개할게요. 여러 도구가 상호 운용 가능하게 동작할 수 있도록 돕는 권장 라벨을 옆에서 차근차근 살펴보겠습니다.
왜 권장 라벨인가요?
kubectl과 대시보드보다 더 많은 도구로 Kubernetes 객체를 시각화하고 관리할 수 있어요. 공통 라벨 집합은 모든 도구가 이해할 수 있는 공통 방식으로 객체를 설명해서 도구들이 상호 운용 가능하게 동작할 수 있게 해줍니다.
도구 지원 외에도, 권장 라벨은 조회 가능한 방식으로 애플리케이션을 설명합니다.
메타데이터는 *애플리케이션(application)*이라는 개념을 중심으로 구성됩니다. Kubernetes는 PaaS가 아니며 애플리케이션에 대한 공식적인 개념을 갖거나 강제하지 않아요. 대신 애플리케이션은 비공식적이며 메타데이터로 설명됩니다. 애플리케이션이 무엇을 포함하는지에 대한 정의는 느슨합니다.
참고: 이것들은 권장 라벨이에요. 애플리케이션을 관리하기 쉽게 만들지만 어떤 핵심 도구에도 필수는 아닙니다.
공유 라벨과 어노테이션은 공통 접두사를 공유합니다: app.kubernetes.io. 접두사가 없는 라벨은 사용자에게 비공개입니다. 공유 접두사는 공유 라벨이 사용자 정의 라벨과 간섭하지 않도록 보장합니다.
라벨 (Labels)
이 라벨들의 장점을 최대한 활용하려면, 모든 리소스 객체에 적용해야 해요.
| Key | 설명 | 예시 | 타입 |
|---|---|---|---|
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 객체 예시예요.
# 발췌문입니다.
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
애플리케이션과 애플리케이션의 인스턴스 (Applications And Instances Of Applications)
애플리케이션은 Kubernetes 클러스터에 한 번 이상 설치될 수 있고, 경우에 따라 같은 네임스페이스에 설치될 수 있어요. 예를 들어 WordPress는 서로 다른 웹사이트가 서로 다른 WordPress 설치인 경우 여러 번 설치될 수 있습니다.
애플리케이션의 이름과 인스턴스 이름은 별도로 기록됩니다. 예를 들어 WordPress는 app.kubernetes.io/name이 wordpress이고, 인스턴스 이름은 app.kubernetes.io/instance로 표현되며 wordpress-abcxyz 값을 가집니다. 이렇게 하면 애플리케이션과 애플리케이션의 인스턴스를 식별할 수 있어요. 각 애플리케이션 인스턴스는 고유한 이름을 가져야 합니다.
예시 (Examples)
이 라벨을 사용하는 다양한 방법을 보여주는 예시로, 복잡성은 다양합니다.
간단한 무상태 서비스 (A Simple Stateless Service)
Deployment와 Service 객체를 사용해 배포된 간단한 무상태 서비스를 생각해봅시다.
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)을 생각해봅시다. WordPress용 Deployment는 이런 모습이에요.
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
# ...
MySQL은 StatefulSet으로 노출되며, MySQL 자체와 그것이 속한 더 큰 애플리케이션 모두에 대한 메타데이터를 가집니다.
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
# ...
MySQL Service는 WordPress의 일부로서 MySQL을 노출하는 데 사용됩니다. 이렇게 하면 더 넓은 애플리케이션에 대한 정보가 MySQL 객체에 포함됩니다.