HomeAbout
[Kubernetes] Kubernetes에서 Label과 Selector 활용하기: 실전 예제와 팁
Docker & Kubernetes
[Kubernetes] Kubernetes에서 Label과 Selector 활용하기: 실전 예제와 팁
NASA1515
NASA1515
June 23, 2021
2 min

목차

01
✔ Label
02
✌ Label Selector
03
👏 Annotation
04
👍 NameSpace

✔ Label

  • Label 은 POD와 같은 Object에 첨부된 Key와 Value의 쌍입니다.
  • Label은 Object의 특성을 식별하는 데 사용되어 사용자에게 중요하지만, 코어 시스템에 직접적인 의미는 없습니다.
  • Label로 Object의 하위 집합을 선택하고, 구성하는데 사용할 수 있습니다.
  • Label은 Object를 생성할 때에 붙이거나 생성 이후에 붙이거나 언제든지 수정이 가능합니다.
  • Object마다 Key와 Value으로 Label을 정의할 수 있습니다. Object의 Key는 고유한 Value이어야 합니다.
"metadata": {
  "labels": {
    "key1" : "value1",
    "key2" : "value2"
  }
}
  • Label은 UI와 CLI에서 효율적인 쿼리를 사용하고 검색에 사용하기에 적합합니다. 식별되지 않는 정보는 Annotation으로 기록해야 합니다.

사용 동기

  • Label을 이용하면 사용자가 느슨하게 결합한 방식으로 조직 구조와 시스템 Object를 매핑할 수 있으며, 클라이언트에 매핑 정보를 저장할 필요가 없습니다.

Label 예시 :

- "release" : "stable", "release" : "canary"
- "environment" : "dev", "environment" : "qa", "environment" : "production"
- "tier" : "frontend", "tier" : "backend", "tier" : "cache"
- "partition" : "customerA", "partition" : "customerB"
- "track" : "daily", "track" : "weekly"
  • 일반적으로 사용하는 예시들의 종류입니다. 사용자가 원하는 규약에 따라 자유롭게 사용 할 수 있지만, Object에 붙여진 Label Key는 고유해야 합니다.


Label을 이용한 POD 정의


nasa-label.yml 작성

apiVersion: v1
kind: Pod
metadata:
name: nasa-pod-label
labels:
    env: dev
    tier: frontend
spec:
containers:
- image: nginx:latest
    name: nasa
    ports:
    - containerPort: 8080
    protocol: TCP

yml 파일 기반의 POD 생성 및 확인

[root@nasa-master nasa]# kubectl apply -f nasa-lebel.yml 
pod/nasa-pod-label created
[root@nasa-master nasa]# kubectl get po
NAME             READY   STATUS    RESTARTS   AGE
nasa-pod-label   1/1     Running   0          7s

Label 확인

[root@nasa-master nasa]# kubectl get pod --show-labels
NAME             READY   STATUS    RESTARTS   AGE   LABELS
nasa-pod-label   1/1     Running   0          68s   env=dev,tier=frontend
[root@nasa-master nasa]# kubectl describe pods nasa-pod-label 
Name:         nasa-pod-label
Namespace:    default
Priority:     0
Node:         nasa-node3/10.146.0.9
Start Time:   Wed, 16 Sep 2020 08:11:15 +0000
Labels:       env=dev
            tier=frontend
Annotations:  kubectl.kubernetes.io/last-applied-configuration:
                {"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"labels":{"env":"d
ev","tier":"frontend"},"name":"nasa-pod-label","namespace":...
...

-L 옵션을 사용해 특정 label을 지정하여 표시 할 수 있습니다.

[root@nasa-master nasa]# kubectl get pods -L env,tier
NAME             READY   STATUS    RESTARTS   AGE   ENV   TIER
nasa-pod-label   1/1     Running   0          15m   dev   frontend

POD Label 수정

  • 존재하는 POD에 Label을 추가 및 수정을 할 수 있습니다. 이미 Label을 가지고 있는 POD에 Label을 추가하면 아래와 같은 이슈가 발생합니다
[root@nasa-master nasa]# kubectl label pods nasa-pod-label env=test
error: 'env' already has a value (dev), and --overwrite is false

이 경우 -overwrite 옵션을 추가로 정의하면 됩니다

[root@nasa-master nasa]# kubectl label pods nasa-pod-label env=test --overwrite
pod/nasa-pod-label labeled
[root@nasa-master nasa]# kubectl get pods --show-labels
NAME             READY   STATUS    RESTARTS   AGE   LABELS
nasa-pod-label   1/1     Running   0          20m   env=test,tier=frontend
  • 다음과 같이 env=test Value이 변경 됨을 확인!

✌ Label Selector

  • 특별한 개념은 아니고, Object에 부여된 Label을 기반으로 검색할 수 있는 개념입니다. Label은 고유하지 않습니다 따라서 많은 Object에 다양한 Label을 부여할 수 있습니다. 사용자는 Label Selector를 이용하여 Object를 식별할 수 있으며 Label Selector는 Kubernetes 코어 그룹에 속합니다.
    모든 컨트롤러가 같은 특징을 가지는데, 예를 들어 Replication Controller가 따로 존재하고 컨트롤러는 replica=3을 만들어달라고 요청받고
    a=123이라는 label을 POD에 지정하면 마찬가지로 Controller는 a=123 LabelSelector를 갖게됩니다.
    그리고 Controller는 이 Label이 달린 POD를 자신이 관리합니다는 사실을 인지하게 됩니다.

Label Selector를 이용해서 검색하는 방법은 두 가지가 있습니다.

  • 특정 Key의 유무로 Label 검색
  • 특정 Key와 Value의 유무로 Label 검색

균등 기반 Label Selector(=, !, !=)

## tierKey가 포함된 Label

[root@nasa-master nasa]# kubectl get pods --show-labels -l tier
NAME             READY   STATUS    RESTARTS   AGE   LABELS
nasa-pod-label   1/1     Running   0          26m   env=test,tier=frontend

## tierKey를 제외한 Label
[root@nasa-master nasa]# kubectl get pods --show-labels -l '!tier'
NAME         READY   STATUS    RESTARTS   AGE    LABELS
nasa-pod   1/1     Running   0          101m   env=dev

## envKey에 testValue이 있는 Label
[root@nasa-master nasa]# kubectl get pods --show-labels -l env=test
NAME             READY   STATUS    RESTARTS   AGE   LABELS
nasa-pod-label   1/1     Running   0          28m   env=test,tier=frontend

## envKey는 있지만 devValue은 제외한 Label
[root@nasa-master nasa]# kubectl get pods --show-labels -l env!=dev
NAME             READY   STATUS    RESTARTS   AGE   LABELS
nasa-pod-label   1/1     Running   0          29m   env=test,tier=frontend

집합성 기반 Label Selector(in, notin)

## envKey에 debug나 devValue이 포함된 Label

[root@nasa-master nasa]# kubectl get pods --show-labels -l 'env in (test,dev)'
NAME             READY   STATUS    RESTARTS   AGE   LABELS
nasa-pod-label   1/1     Running   0          31m   env=test,tier=frontend

## tierKey에 frontendValue은 제외한 Label
[root@nasa-master nasa]# kubectl get pods --show-labels -l 'tier notin (frontend)'
NAME         READY   STATUS    RESTARTS   AGE    LABELS
nasa-pod   1/1     Running   0          103m   env=dev

👏 Annotation

  • Object에 메타데이터를 할당할 수 있는 주석과 같은 개념입니다. Label과 같이 key-value 구조를 띄지만 차이가 있습니다.
    Label은 Label Selector를 이용해서 검색과 식별이 가능하나, Annotation은 메타데이터의 입력만 가능할 뿐 주석과 같으므로 검색이 되지 않습니다.
    Kubernetes Cluster의 API 서버가 Annotation에 지정된 Metadata를 참조해서 동작한다는 점에서 우리가 기존에 알고 있는 주석처럼 완전 투명한 상태는 아닙니다.

Annotation은 다음과 같은 메타데이터를 기록할 수 있습니다.

  • 필드
  • 이미지 정보(타임 스탬프, 릴리즈 ID, 빌드 버전, git 브랜치, 이미지 해시, 레지스트리 주소 등)
  • 로깅, 모니터링 정보
  • 디버깅에 필요한 정보(이름,버전,빌드정보)
  • 책임자 연락처
  • 사용자 지시 사항


파일을 만들어 예시를 들어보겠습니다.

apiVersion: v1
kind: Pod
metadata:
name: annotations-nasa
annotations:
    imageregistry: "https://hub.docker.com/"
spec:
containers:
- name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80

해당 파일로 POD 생성!

[root@nasa-master nasa]# kubectl apply -f ano.yml 
pod/annotations-nasa created
[root@nasa-master nasa]# 
[root@nasa-master nasa]# kubectl get po
NAME               READY   STATUS    RESTARTS   AGE
annotations-nasa   1/1     Running   0          5s
nasa-pod-label     1/1     Running   0          38m

Annotation은 describe 옵션으로 확인이 가능합니다!

[root@nasa-master nasa]# kubectl describe pods annot
Name:         annotations-nasa
Namespace:    default
Priority:     0
Node:         nasa-node3/10.146.0.9
Start Time:   Wed, 16 Sep 2020 08:49:37 +0000
Labels:       <none>
Annotations:  imageregistry: https://hub.docker.com/         <<<######>>>
            kubectl.kubernetes.io/last-applied-configuration:
                {"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{"imageregistry":"htt
ps://hub.docker.com/"},"name":"annotations-nasa","namespace...
Status:       Running
IP:           10.32.0.3
...

이 외에 annotate 명령을 이용해 변경도 가능합니다!

[root@nasa-master nasa]# kubectl annotate pods annotations-nasa mynameis="John Smith"
pod/annotations-nasa annotated
[root@nasa-master nasa]# kubectl describe pods annot
Name:         annotations-nasa
Namespace:    default
Priority:     0
Node:         nasa-node3/10.146.0.9
Start Time:   Wed, 16 Sep 2020 08:49:37 +0000
Labels:       <none>
Annotations:  imageregistry: https://hub.docker.com/
            kubectl.kubernetes.io/last-applied-configuration:
                {"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{"imageregistry":"htt
ps://hub.docker.com/"},"name":"annotations-nasa","namespace...
            mynameis: John Smith         <<<<----#######

👍 NameSpace

  • Kubernetes는 동일한 물리 Cluster를 기반으로 하는 여러 개의 가상 Cluster를 지원합니다. 이러한 가상 Cluster 단위를 NameSpace라고 합니다.
    NameSpace는 여러 개의 팀이나 프로젝트에 걸쳐 다수의 사용자가 존재하는 경우에 사용하도록 고안된 개념입니다.
    공식 문서에서는 사용자가 수 십명 정도에 불과한 경우는 NameSpace를 고려할 필요가 '전혀'없습니다라고 하고 있습니다.
    NameSpace는 이름의 범위를 제공합니다. 이게 무슨 말이냐 하면, 리소스의 이름은 NameSpace 내에서 유일해야 하지만 서로 다른 NameSpace 안에서는 같은 이름을 가진 리소스가 존재할 수도 있습니다는 뜻입니다. 단, kube- 로 시작하는 NameSpace는 이미 Kubernetes 시스템 NameSpace로 예약되어있으므로 사용하지 않습니다.

NameSpace 확인

[root@nasa-master nasa]# kubectl get namespaces 
NAME              STATUS   AGE
default           Active   23d
kube-node-lease   Active   23d
kube-public       Active   23d
kube-system       Active   23d

  • default : Object 생성 시 따로 지정하지 않으면 default NameSpace를 사용하게 되어있습니다.
  • kube-system : Kubernetes 시스템에서 생성한 Object를 위한 NameSpace
  • kube-public : 전체 Cluster에서 공개되어 예약된 NameSpace. 모든 사용자가 읽기 권한으로 접근 가능합니다.
  • kube-node-lease : Cluster가 스케일링될 때 노드 health check 성능을 향상시Key는 lease Object에 대한 NameSpace

NameSpace 상의 Object 확인

[root@nasa-master nasa]# kubectl get pods -n kube-system
NAME                                    READY   STATUS    RESTARTS   AGE
coredns-5c98db65d4-8cg79                1/1     Running   2          23d
coredns-5c98db65d4-zbvbn                1/1     Running   1          23d
etcd-nasa-master                        1/1     Running   1          23d
kube-apiserver-nasa-master              1/1     Running   1          23d
kube-controller-manager-nasa-master     1/1     Running   1          23d
kube-proxy-6w9dk                        1/1     Running   1          23d
kube-proxy-jqks7                        1/1     Running   1          23d
kube-proxy-kr9sb                        1/1     Running   1          23d
kube-proxy-lxn6d                        1/1     Running   1          23d
kube-scheduler-nasa-master              1/1     Running   1          23d
kubernetes-dashboard-6b8c96cf8c-g985n   1/1     Running   1          23d
weave-net-dd6f2                         2/2     Running   3          23d
weave-net-k2jc9                         2/2     Running   3          23d
weave-net-k2tcb                         2/2     Running   3          23d
weave-net-v7bff                         2/2     Running   3          23d
  • NameSpace를 지정할 때는 -n 또는 —namespace 옵션을 사용하며 지정하지 않으면 default NameSpace 기준입니다.

NameSpace 생성 및 조회

  • yaml 파일로도 가능하지만 커맨드로도 간단히 생성할 수 있습니다.
[root@nasa-master nasa]# kubectl create namespace nasa
namespace/nasa created
[root@nasa-master nasa]# kubectl get namespace nasa
NAME   STATUS   AGE
nasa   Active   28s

yaml파일로 NameSpace 생성

apiVersion: v1
kind: Namespace
metadata:
name: nasa-namespace
[root@nasa-master nasa]# kubectl apply -f name.yml 
namespace/nasa-namespace created
[root@nasa-master nasa]# 
[root@nasa-master nasa]# kubectl get namespace nasa-namespace
NAME             STATUS   AGE
nasa-namespace   Active   19s

특정 NameSpace에 POD Object 생성

[root@nasa-master nasa]# kubectl apply -f nasa.yml -n nasa-namespace
pod/nasa-nginx-pod created
[root@nasa-master nasa]# kubectl get po -n nasa-namespace
NAME             READY   STATUS              RESTARTS   AGE
nasa-nginx-pod   0/2     ContainerCreating   0          17s

이 작업도 yaml 파일로 작성해보자!

apiVersion: v1
kind: Pod
metadata:
name: nasa-pod
namespace: nasa
spec:
containers:
- image: nginx:latest
    name: nasa-pod
    ports:
    - containerPort: 8080
        protocol: TCP
[root@nasa-master nasa]# kubectl apply -f nasaname.yml 
pod/nasa-pod created
[root@nasa-master nasa]# kubectl get po -n nasa
NAME       READY   STATUS    RESTARTS   AGE
nasa-pod   1/1     Running   0          12s


리소스 삭제 : 리소스는 세 가지 방법으로 가능합니다.


Object 이름으로 삭제

[root@nasa-master nasa]# kubectl delete pod nasa-pod -n nasa 
pod "nasa-pod" deleted
[root@nasa-master nasa]# kubectl get po -n nasa
No resources found.

Object 정의파일(yaml 및 json파일)로 삭제

[root@nasa-master nasa]# kubectl get pod -n nasa-namespace
NAME             READY   STATUS             RESTARTS   AGE
nasa-nginx-pod   1/2     CrashLoopBackOff   6          9m57s
[root@nasa-master nasa]# 
[root@nasa-master nasa]# kubectl delete -f name.yml 
namespace "nasa-namespace" deleted
[root@nasa-master nasa]# kubectl get pod -n nasa-namespace
No resources found.

Object Label로 삭제

[root@nasa-master nasa]# kubectl get pods -l env=test
NAME             READY   STATUS    RESTARTS   AGE
nasa-pod-label   1/1     Running   0          68m
[root@nasa-master nasa]# 
[root@nasa-master nasa]# kubectl delete pods -l env=test
pod "nasa-pod-label" deleted
[root@nasa-master nasa]# kubectl get pods -l env=test
No resources found.

Tags

#Kubernetes
NASA1515

NASA1515

Data Engineer

Hello I'M Wonseok aka NASA1515

Expertise

Public Cloud
k8s/Docker
Python

Social Media

instagramwebsitelinkedingithub

Related Posts

[Kubernetes] VSCode (VisualStudio Code)로 Kubernetes 클러스터 관리 : 초보자를 위한 완벽 가이드
[Kubernetes] VSCode (VisualStudio Code)로 Kubernetes 클러스터 관리 : 초보자를 위한 완벽 가이드
2021-08-19
2 min

Topics

CloudDevelop

Social Media