✔️ Label & LabelSelector
✔️ Label
Label은 AWS의 태그와 유사한 개념이다.
리소스의 이름은 Namespace에서 유일해야 했다. 반면 Label은 리소스에 1개 이상 설정할 수 있다.
여러개의 리소스에 동일한 Label을 중복해서 붙일 수 있다.
Label을 붙여서 오브젝트의 특성을 식별하는 데 사용한다.
"metadata": {
"labels": {
"key1" : "value1",
"key2" : "value2"
}
}
해당 형식은 JSON 형식을 따른 것이다.
metadata:
name: label-demo
labels:
key: value
key: value
key: value
YAML 형식을 사용할 수 있으며 같은 key : value를 여러 오브젝트에 부여할 수 있다.
✔️ 레이블의 기능
- 검색
Pod들의 개수가 증가할수록 이름만으로 구별하기는 불가능해진다. 레이블을 붙여서 성질을 나타내고 식별해서 검색에 사용한다. - 리소스 간의 연결
여러가지 타입의 오브젝트들이 있는데 오브젝트 간의 관계를 설정할 때 레이블을 사용한다.
vagrant@k8s-node1:~/namespace$ kubectl describe pods -n dev myweb
Name: myweb
Namespace: dev
Priority: 0
Node: node3/192.168.100.102
Start Time: Tue, 17 May 2022 12:39:50 +0000
Labels: <none>
필요하다면 Labels을 붙일 수 있다.
✔️ 권장 레이블
https://kubernetes.io/ko/docs/concepts/overview/working-with-objects/common-labels/
✔️ 레이블 확인
레이블 확인 명령어
kubectl get pods --show-labels
kubectl get pods X -o yaml
kubectl describe pods X
vagrant@k8s-node1:~/namespace$ kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
myweb 1/1 Running 0 62s <none>
붙어있는 레이블을 간단하게 볼 수 있다.
✔️ 레이블 관리
레이블 관리 명령어
kubectl label pods myweb APP=apache
kubectl label pods myweb ENV=developments
kubectl label pods myweb ENV=staging
kubectl label pods myweb ENV=staging --overwirte
kubectl label pods myweb ENV-
✔️ 레이블 생성
기존의 리소스에 레이블을 부여해본다.
vagrant@k8s-node1:~/namespace$ kubectl label pods myweb APP=apache
pod/myweb labeled
vagrant@k8s-node1:~/namespace$ kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
myweb 1/1 Running 0 4m14s APP=apache
vagrant@k8s-node1:~/namespace$ kubectl label pods myweb ENV=developments
pod/myweb labeled
vagrant@k8s-node1:~/namespace$ kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
myweb 1/1 Running 0 5m53s APP=apache,ENV=developments
vagrant@k8s-node1:~/namespace$ kubectl label pods myweb ENV=staging
error: 'ENV' already has a value (developments), and --overwrite is false
vagrant@k8s-node1:~/namespace$ kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
myweb 1/1 Running 0 6m10s APP=apache,ENV=developments
developments → staging 바뀌지 않는다.
✔️ 레이블 변경
기존에 있던 label을 덮어쓰려면 --overwrite
옵션을 사용한다.
vagrant@k8s-node1:~/namespace$ kubectl label pods myweb ENV=staging --overwrite
pod/myweb labeled
vagrant@k8s-node1:~/namespace$ kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
myweb 1/1 Running 0 7m10s APP=apache,ENV=staging
✔️ 레이블 삭제
vagrant@k8s-node1:~/namespace$ kubectl label pods myweb ENV-
pod/myweb labeled
vagrant@k8s-node1:~/namespace$ kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
myweb 1/1 Running 0 7m50s APP=apache
삭제시 key 이름 뒤에 -
을 붙인다.
✔️ YAML 파일로 label 부여하기
vagrant@k8s-node1:~$ mkdir label
vagrant@k8s-node1:~$ cd label
vagrant@k8s-node1:~/label$ cp ../namespace/myweb.yaml .
vagrant@k8s-node1:~/label$ vi myweb.yaml
vagrant@k8s-node1:~/label$ cat myweb.yaml
apiVersion: v1
kind: Pod # kubectl api-resources
metadata:
name: myweb-label
labels:
APP: apache
ENV: staging
spec:
containers:
- name: myweb
image: httpd
ports:
- containerPort: 80
protocol: TCP
vagrant@k8s-node1:~/label$ kubectl create -f myweb.yaml
pod/myweb-label created
vagrant@k8s-node1:~/label$ kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
myweb 1/1 Running 0 12m APP=apache
myweb-label 1/1 Running 0 11s APP=apache,ENV=staging
✔️ 레이블 사용 동기
레이블을 이용하면 사용자가 느슨하게 결합한 방식으로 조직 구조와 시스템 오브젝트를 매핑할 수 있으며, 클라이언트에 매핑 정보를 저장할 필요가 없다.
레이블 예시:
"release" : "stable"
,"release" : "canary"
"environment" : "dev"
,"environment" : "qa"
,"environment" : "production"
"tier" : "frontend"
,"tier" : "backend"
,"tier" : "cache"
"partition" : "customerA"
,"partition" : "customerB"
"track" : "daily"
,"track" : "weekly"
이 예시는 일반적으로 사용하는 레이블이며, 사용자는 자신만의 규칙(convention)에 따라 자유롭게 개발할 수 있다. 오브젝트에 붙여진 레이블 키는 고유해야 한다는 것을 기억해야 한다.
✔️ 구문과 캐릭터 셋
레이블 은 키와 값의 쌍이다.
유효한 레이블 키에는 슬래시(/
)로 구분되는 선택한 접두사와 이름이라는 2개의 세그먼트가 있다.
이름 세그먼트는 63자 미만으로 시작과 끝은 알파벳과 숫자([a-z0-9A-Z]
)이며, 대시(-
), 밑줄(_
), 점(.
)과 함께 사용할 수 있다. 접두사는 선택이다. 만약 접두사를 지정한 경우 접두사는 DNS의 하위 도메인으로 해야 하며, 점(.
)과 전체 253자 이하, 슬래시(/
)로 구분되는 DNS 레이블이다.
접두사를 생략하면 키 레이블은 개인용으로 간주한다. 최종 사용자의 오브젝트에 자동화된 시스템 컴포넌트(예: kube-scheduler
, kube-controller-manager
, kube-apiserver
, kubectl
또는 다른 타사의 자동화 구성 요소)의 접두사를 지정해야 한다.
kubernetes.io/
와 k8s.io/
접두사는 쿠버네티스의 핵심 컴포넌트로 예약되어 있다.
유효한 레이블 값은 다음과 같다.
- 63 자 이하여야 하고 (공백일 수도 있음),
- (공백이 아니라면) 시작과 끝은 알파벳과 숫자(
[a-z0-9A-Z]
)이며, - 알파벳과 숫자, 대시(
-
), 밑줄(_
), 점(.
)을 중간에 포함할 수 있다.
다음의 예시는 파드에 environment: production
과 app: nginx
2개의 레이블이 있는 구성 파일이다.
apiVersion: v1
kind: Pod
metadata:
name: label-demo
labels:
environment: production
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
kubernetes.io/
와 k8s.io/
접두사는 쿠버네티스의 핵심 컴포넌트로 예약되어 있어 사용할 수 없다.
vagrant@k8s-node1:~/label$ kubectl get nodes --show-labels
NAME STATUS ROLES AGE VERSION LABELS
node1 Ready control-plane,master 29h v1.22.8 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node1,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node-role.kubernetes.io/master=,node.kubernetes.io/exclude-from-external-load-balancers=
node2 Ready <none> 29h v1.22.8 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node2,kubernetes.io/os=linux
node3 Ready <none> 29h v1.22.8 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node3,kubernetes.io/os=linux
✔️ LabelSelector
- 검색
- 리소스 간 연결
vagrant@k8s-node1:~/label$ kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
myweb 1/1 Running 0 17m APP=nginx
myweb-label 1/1 Running 0 5m25s APP=apache,ENV=staging
vagrant@k8s-node1:~/label$ kubectl get pods -l APP=apache
NAME READY STATUS RESTARTS AGE
myweb-label 1/1 Running 0 6m15s
vagrant@k8s-node1:~/label$ kubectl get pods -l ENV=staging
NAME READY STATUS RESTARTS AGE
myweb-label 1/1 Running 0 6m22s
검색 방법
- 일치성
- 집합성
✔️ 일치성(equality base)
=
==
!=
vagrant@k8s-node1:~/label$ kubectl get pods -l ENV=staging
NAME READY STATUS RESTARTS AGE
myweb-label 1/1 Running 0 6m22s
vagrant@k8s-node1:~/label$ kubectl get pods -l ENV==staging
NAME READY STATUS RESTARTS AGE
myweb-label 1/1 Running 0 9m22s
vagrant@k8s-node1:~/label$ kubectl get pods -l ENV!=staging
NAME READY STATUS RESTARTS AGE
myweb 1/1 Running 0 21m
✔️ 집합성(set base)
in
notin
exists
: 키만 매칭시킨다.kubectl get pods -l 'APP'
doesnotexists
: 키 제외 매칭kubectl get pods -l '!APP'
vagrant@k8s-node1:~/label$ kubectl get pods -l 'ENV in (staging)'
NAME READY STATUS RESTARTS AGE
myweb-label 1/1 Running 0 11m
vagrant@k8s-node1:~/label$ kubectl get pods -l 'APP in (nginx, apache)'
NAME READY STATUS RESTARTS AGE
myweb 1/1 Running 0 23m
myweb-label 1/1 Running 0 11m
value가 여러개 들어갈 수 있다는 장점이 있다.
vagrant@k8s-node1:~/label$ kubectl get pods -l 'APP notin (apache)'
NAME READY STATUS RESTARTS AGE
myweb 1/1 Running 0 24m
vagrant@k8s-node1:~/label$ kubectl get pods -l 'ENV'
NAME READY STATUS RESTARTS AGE
myweb-label 1/1 Running 0 13m
vagrant@k8s-node1:~/label$ kubectl get pods -l 'APP'
NAME READY STATUS RESTARTS AGE
myweb 1/1 Running 0 25m
myweb-label 1/1 Running 0 13m
vagrant@k8s-node1:~/label$ kubectl get pods -l '!APP'
No resources found in default namespace.
'DevOps > Kubernetes' 카테고리의 다른 글
[Kubernetes] Pod의 LifeCycle (파드의 생명주기) (0) | 2022.05.19 |
---|---|
[Kubernetes] Annotation (어노테이션) (0) | 2022.05.18 |
[Kubernetes] Namespace ( + 오브젝트의 이름와 UID) (0) | 2022.05.18 |
[Kubernetes] Pod Design (0) | 2022.05.17 |
[Kubernetes] Workload - Pod (파드) (0) | 2022.05.17 |
영차영차 성장 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!