![[Kubernetes] Label, LabelSelector (레이블, 레이블셀렉터)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FdbimJP%2FbtrCunrhglH%2FAAAAAAAAAAAAAAAAAAAAAOC2bVl-mhP9gwcbikrg3WVDhF5p4rJcBw9TjcdZeCqn%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1764514799%26allow_ip%3D%26allow_referer%3D%26signature%3D3he5I3zY4MpaQkDcqGkpTahSiUI%253D)
✔️ 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: valueYAML 형식을 사용할 수 있으며 같은 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-labelskubectl get pods X -o yamlkubectl describe pods Xvagrant@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=apachekubectl label pods myweb ENV=developmentskubectl label pods myweb ENV=stagingkubectl label pods myweb ENV=staging --overwirtekubectl 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=apachevagrant@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=developmentsvagrant@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=developmentsdevelopments → 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: 80kubernetes.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          9m22svagrant@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          11mvagrant@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          11mvalue가 여러개 들어갈 수 있다는 장점이 있다.
vagrant@k8s-node1:~/label$ kubectl get pods -l 'APP notin (apache)'
NAME    READY   STATUS    RESTARTS   AGE
myweb   1/1     Running   0          24mvagrant@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          13mvagrant@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 | 
영차영차 성장 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!
![[Kubernetes] Pod의 LifeCycle (파드의 생명주기)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FbWUScE%2FbtrCBZwufbU%2FAAAAAAAAAAAAAAAAAAAAAB8I_FN5Xl413pZej5KQOtclJTqdhEMLy-Qc_MUd8uMH%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1764514799%26allow_ip%3D%26allow_referer%3D%26signature%3DNX70PtlTDVOb1FOkLGrGJtB%252BHEE%253D) 
                  ![[Kubernetes] Namespace ( + 오브젝트의 이름와 UID)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2Fbi1tFc%2FbtrCvZiMVq8%2FAAAAAAAAAAAAAAAAAAAAAAirw4uNWbuz8PYPzDBQkK55Zi_kwTKO_HwxJyO16QCL%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1764514799%26allow_ip%3D%26allow_referer%3D%26signature%3DcHvET205%252FlDSK8gexs0uxnhtgY4%253D)