for Developer/Kubernetes

k8s::쿠버네티스 오브젝트 (Labels and Selectors)

Dev:P 2020. 5. 23. 11:47
반응형

레이블은 파드와 같은 오브젝트에 첨부된 키와 값의 쌍이다. 레이블은 오브젝트의 특성을 식별하는데 사용되어 사용자에게 중요하지만, 코어 시스템에 직접적인 의미는 없다. 레이블로 오브젝트의 하위 집합을 선택하고 구성하는데 사용할 수 있으며 레이블을 붙이는 시점은 오브젝트를 생성할 때나 생성 이후 언제든 가능하다. 

"metadata": {
  "labels": {
    "key1": "value1",
    "key2": "value2",
  }
}

Motivation

레이블을 이용하면 사용자가 느슨하게 결합한 방식(상호 의존성을 줄이는 방식)으로 조직 구조와 시스템 오브젝트를 매핑할 수 있으며, 클라이언트에 매핑 정보를 저장할 필요가 없다.

서비스 배포와 Batch Processing은 보통 다차원의 엔티티들이다. (예를들어 다중 파티션, 다중 배포, 다중 릴리즈 트랙 등) 

레이블 예시:

  • "release": "stable", "release": "canary"
  • "environment": "dev", "environment": "stage", "environment": "production"
  • "tier": "frontend", "tier": "backend"

Label selectors

이름, UID와는 다르게 레이블은 고유하지 않다. 일반적으로 우리는 많은 오브젝트가 같은 레이블을 가질 것으로 예상한다.

레이블과 셀렉터를 통해 클라이언트와 사용자는 오브젝트를 식별 할 수 있는데, 이러한 레이블 셀렉터는 쿠버네티스 코어그룹의 기본이다.

API는 현재 equality-based와 set-based라는 두 종류의 셀렉터를 지원한다. 

 

[equality-based requirement]

Equality or inequality based의 요구사항으로 레이블의 키와 값의 필터링을 허용한다. 일치하는 오브젝트는 추가 레이블을 가질 수 잇지, 레이블의 명시된 제약 조건을 모두 만족해야한다. 일치성 또는 불일치성 기준이기 때문에 =, ==, != 이 3가지 연산만을 허용한다.

environment = production
tier != frontend

전자는 environment를 키로 갖고 production을 값으로 가지는 모든 리소스를 선택한다 (equality-based), 후자는 tier를 키로 갖고 frontend를 값으로 갖는 리소스를 제외한 모든 리소스를 선택하고(inequality based), 추가적으로 tier를 키로 가지며 값을 공백으로 가지는 모든 리소스를 선택한다. 또한 동시에 두가지 조건을 함께 주고 싶다면 쉼표를 통해 한 문장으로 필터링 할 수 있다. environment=production, tier!=frontend 

 

[set-based requirement]

set-based의 경우 in, notin, exists의 3개 연산자를 지원한다.

environment in (production, qa)
tier notin (frontend, backend)

이러한 equality-based와 set-based는 서로 조합하여 사용하는 것 또한 가능하다.

partition in (customerA, customerB), environment != qa

 

API 사용 예시

kubectl get pods -l environment=production,tier=frontend
kubectl get pods -l 'environment in (production), tier in (frontend)'
kubectl get pods -l 'environment, environment in (dev)'

API 오브젝트에서 참조 예시

"selector": {
  "component": "redis",
}
selector:
  matchLabels:
    component: redis
  matchExpressions:
    - {key: tier, operator: In, values: [cache]}
    - {key: environment, operator: NotIn, values: [dev]}

 

 

 

출처: https://kubernetes.io/docs/concepts/

반응형