본문 바로가기

Container/Kubernetes

[K8S] 쿠버네티스 레이블

 

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

 

레이블과 셀렉터

레이블 은 파드와 같은 오브젝트에 첨부된 키와 값의 쌍이다. 레이블은 오브젝트의 특성을 식별하는 데 사용되어 사용자에게 중요하지만, 코어 시스템에 직접적인 의미는 없다. 레이블로 오브

kubernetes.io

Label

  • Node를 포함하여 Pod, deployment 등 모든 리소스에 할당
  • 리소스의 특성을 분류하고, Selector를 이용해서 선택
  • 오브젝트에 첨부된 key-value 한 쌍으로 적용
    • 오브젝트의 특성을 식별하는 데 사용
    • 레이블로 오브젝트의 하위 집합을 선택하고, 구성하는데 사용
    • 레이블은 오브젝트를 생성할 때에 붙이거나 생성 이후에 붙이거나 언제든지 수정이 가능
    • 오브젝트의 키는 고유한 값이어야 한다
    • 사용 예시
      더보기
      • "release" : "stable", "release" : "canary"
      • "environment" : "dev", "environment" : "qa", "environment" : "production"
      • "tier" : "frontend", "tier" : "backend", "tier" : "cache"
      • "partition" : "customerA", "partition" : "customerB"
      • "track" : "daily", "track" : "weekly"
metadata:
  labels:
    rel: stable
    name: mainui

 

Selector

selector:
  matchLabels:
    key: value
  matchExpressions:
    - {key: name, operator: In, values: [mainui]}
    - {key: rel, operator: NotIn, values: ["beta","canary"]}

 

 

# 실습

# run command로 파드 생성
root@master:~# kubectl run cmdpod --image=nginx:1.14 --port=80
pod/cmdpod created

# 레이블 없는 파드 생성
root@master:~# cat pod1.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-demo
spec:
  containers:
  - name: nginx
    image: nginx:1.14
    ports:
    - containerPort: 80

# 레이블 있는 파드 생성
root@master:~# cat pod2.yaml
apiVersion: v1
kind: Pod
metadata:
  name: label-pod-demo
  labels:
    name: mainui
    rel: stable
spec:
  containers:
  - name: nginx
    image: nginx:1.14
    ports:
    - containerPort: 80

root@master:~# kubectl create -f pod1.yaml -f pod2.yaml
pod/pod-demo created
pod/label-pod-demo created

root@master:~# kubectl get pods
NAME             READY   STATUS    RESTARTS   AGE
cmdpod           1/1     Running   0          4m47s
label-pod-demo   1/1     Running   0          43s
pod-demo         1/1     Running   0          43s

root@master:~# kubectl get pods --show-labels
NAME             READY   STATUS    RESTARTS   AGE     LABELS
cmdpod           1/1     Running   0          5m22s   run=cmdpod           # 자동 할당
label-pod-demo   1/1     Running   0          78s     name=mainui,rel=stable
pod-demo         1/1     Running   0          78s     <none>

 

kubectl get pods -l name=[label명]
label명이 같은 pod 출력 (selector)

 

root@master:~# kubectl get pods -l name=mainui
NAME             READY   STATUS    RESTARTS   AGE
label-pod-demo   1/1     Running   0          2m16s

# 동일 결과 출력
root@master:~# kubectl get pods --selector name=mainui
NAME             READY   STATUS    RESTARTS   AGE
label-pod-demo   1/1     Running   0          3m50s

 

# 커멘드로 레이블 할당

root@master:~# kubectl label pod pod-demo name=test
pod/pod-demo labeled

root@master:~# kubectl get pods --show-labels
NAME             READY   STATUS    RESTARTS   AGE     LABELS
cmdpod           1/1     Running   0          10m     run=cmdpod
label-pod-demo   1/1     Running   0          6m24s   name=mainui,rel=stable
pod-demo         1/1     Running   0          6m24s   name=test

# 레이블 수정
root@master:~# kubectl label pod pod-demo name=login
error: 'name' already has a value (test), and --overwrite is false
# 이미 name label이 있어서 오류 발생
## --overwrite 속성
## 이미 존재하는 label 위에 덮어쓰기
root@master:~# kubectl label pod pod-demo name=login --overwrite
pod/pod-demo labeled

root@master:~# kubectl get pods --show-labels
NAME             READY   STATUS    RESTARTS   AGE     LABELS
cmdpod           1/1     Running   0          12m     run=cmdpod
label-pod-demo   1/1     Running   0          8m27s   name=mainui,rel=stable
pod-demo         1/1     Running   0          8m27s   name=login

# 복수 레이블 할당
root@master:~# kubectl label pod cmdpod name=order rel=beta
pod/cmdpod labeled
root@master:~# kubectl get pods --show-labels
NAME             READY   STATUS    RESTARTS   AGE     LABELS
cmdpod           1/1     Running   0          13m     name=order,rel=beta,run=cmdpod
label-pod-demo   1/1     Running   0          9m37s   name=mainui,rel=stable
pod-demo         1/1     Running   0          9m37s   name=login

# label 명 뒤에 -(대시문자)
# label 삭제
root@master:~# kubectl label pod cmdpod run-
pod/cmdpod unlabeled
root@master:~# kubectl get pods --show-labels
NAME             READY   STATUS    RESTARTS   AGE   LABELS
cmdpod           1/1     Running   0          14m   name=order,rel=beta
label-pod-demo   1/1     Running   0          10m   name=mainui,rel=stable
pod-demo         1/1     Running   0          10m   name=login



root@master:~# kubectl label pod pod-demo rel=stable
pod/pod-demo labeled
root@master:~# kubectl get pods --show-labels
NAME             READY   STATUS    RESTARTS   AGE   LABELS
cmdpod           1/1     Running   0          15m   name=order,rel=beta
label-pod-demo   1/1     Running   0          11m   name=mainui,rel=stable
pod-demo         1/1     Running   0          11m   name=login,rel=stable
root@master:~# kubectl get pods --selector rel=stable
NAME             READY   STATUS    RESTARTS   AGE
label-pod-demo   1/1     Running   0          12m
pod-demo         1/1     Running   0          12m

# 레이블 삭제
root@master:~# kubectl delete pods --selector rel=beta
pod "cmdpod" deleted

 

반응형

'Container > Kubernetes' 카테고리의 다른 글

[K8S] Annotation  (0) 2024.03.17
[K8S] Node Label & Selector  (0) 2024.03.17
[K8S] Ingress Controller  (0) 2024.03.07
[K8S] Service  (0) 2024.03.05
[K8S] Cronjob Controller  (0) 2024.02.28