Label
쿠버네티스 오브젝트를 식별하기 위한 key:value 쌍의 메타데이터이다
Selector
Label을 이용해 쿠버네티스 리소스를 필터링하고 원하는 리소스 집합을 구하기 위한 label query이다
그렇다면 언제 필요한가
한번 아래의 그림으로 설명해보겠다쿠버네티스 상에서 실행되고 있는 모든 Pod라고 할 때 사실 이 Pod들의 구분은 경계가 없다 그래서 예를 들어보면 내가 주문요청을 지정된 주문 Pod으로만 리다이렉트 하고 싶다 할 때 어떤 Pod이 주문 Pod인지 정의할 수 있어야 한다
일종의 주문 Pod의 집합이라고 생각하면 되겠다 또한 똑같이 주문요청이 있다면 배달 요청도 있을 텐데 똑같이 배달 Pod 들의 경계 즉 집합을 만들어주면 된다 이런 식으로 쿠버네티스에 많은 리소스들이 있는데 내가 원하는 곳으로 트래픽을 보내기 위해서 Pod를 집합으로 구성해야 한다 바로 이때 Label이라는 속성으로 우리가 원하는 Pod의 집합을 구할 수 있다
Label 사용해보기
먼저 실습을 하기 위해 미리 준비되어있는 컨테이너로 Pod를 5개 띄워보겠다.
일단 기본적으로 hello-app-1 Pod에는 labels을 group: greeting이라고 선언했고
rose-app-1, sky-app-1, tree-app-1, tree-app-2은 group: nature이라는 labels를 선언했다
apiVersion: v1
kind: Pod
metadata:
name: hello-app-1
labels:
group: greeting
spec:
containers:
- name: hello-app
image: yoonjeong/hello-app:1.0
ports:
- containerPort: 8080
env:
- name: NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
resources:
limits:
memory: "64Mi"
cpu: "50m"
---
apiVersion: v1
kind: Pod
metadata:
name: rose-app-1
labels:
group: nature
spec:
containers:
- name: rose-app
image: yoonjeong/red-app:1.0
ports:
- containerPort: 8080
env:
- name: NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
resources:
limits:
memory: "64Mi"
cpu: "50m"
apiVersion: v1
kind: Pod
metadata:
name: sky-app-1
labels:
group: nature
spec:
containers:
- name: sky-app
image: yoonjeong/blue-app:1.0
ports:
- containerPort: 8080
env:
- name: NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
resources:
limits:
memory: "64Mi"
cpu: "50m"
---
apiVersion: v1
kind: Pod
metadata:
name: tree-app-1
labels:
group: nature
spec:
containers:
- name: tree-app
image: yoonjeong/green-app:1.0
ports:
- containerPort: 8081
env:
- name: NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
resources:
limits:
memory: "64Mi"
cpu: "50m"
apiVersion: v1
kind: Pod
metadata:
name: tree-app-2
labels:
group: nature
spec:
containers:
- name: tree-app
image: yoonjeong/green-app:1.0
ports:
- containerPort: 8081
env:
- name: NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
resources:
limits:
memory: "64Mi"
cpu: "50m"
이제 파드를 배포했으면 우리가 설정한 레이블을 확인해보자 확인해보면 우리가 설정한 레이블이 잘 지정된 걸 확인할 수 있다
# 생성되어있는 Pod의 모든 label을 조회하는 명령어
$ kubectl get pod --show-labels
이번에는 hello-app-1에 version=1
rose-app-1 에는 concept=flower element=rose position=bottom version=v1
sky-app-1 에는 concept=earth element=sky position=top version=v1
tree-app-1 에는 concept=earth element=tree position=bottom version=v1
tree-app-2 에는 concept=earth element=tree position=bottom version=v1
이렇게 각각 레이블을 추가해보겠다 추가를 하기 위한 명령어는
$ kubectl label <오브젝트> <오브젝트name> 추가할label의키=값
#이런식으로 정의할 수 있으며 계속 label을 추가할 수있다
추가를 했다면 다시 한번 조회해보자
내가 추가한 label이 적용된 걸 확인할 수 있다.
이번에는 Slelctor을 활용해서 원하는 Pod를 조회해보자
$ kubectl get <오브젝트타입> --selector <labelquery1,...,labelqueryN>
$ kubectl get <오브젝트타입> -l <labelquery1,...,labelqueryN>
일단 나는 group=nature이면서 group/concept/position/version 레이블 함께 출력해보겠다
# group=nature인 Pod의 group,concept,element,position,version 의 레이블의 값을 출력한다
$ kubectl get pod --selector group=nature -L group,concept,element,position,version
# 사실상 모든 레이블 출력이니까 아래의 옵션을 줘도 상관없겠다
$ kubectl get pod --selector group=nature --show-labels
일치성 기준 요건
일치성 기준 또는 불일치 기준 의 요구사항으로 레이블의 키와 값의 필터링을 허용한다. 일치하는 오브젝트는 추가 레이블을 가질 수 있지만, 레이블의 명시된 제약 조건을 모두 만족해야 한다. =,==,!= 이 세 가지 연산자만 허용한다. 처음 두 개의 연산자의 일치성(그리고 동의어), 나머지는 불일치 를 의미한다. 예를 들면
- 같다(=),같지않다(!=)
- key=value:key의값이value일때
- key!=value:key의값이value가아닐때
한번 연산자를 이용해서 확인해보겠다
우리가 설정한 label중에 group=nature가 아닌건 hello-app-1 Pod이다
집합성 기준 요건
집합성 기준 레이블 요건에 따라 값 집합을 키로 필터링할 수 있다. in,notin과 exists(키 식별자만 해당)의 3개의 연산자를 지원한다. 예를 들면
- 값이어떤집합에속해있다/속해있지않다(OR연산가능)
- ‘key in (value1, value2, ...)’: key의 값이 value1이거나 value2일 때
- ‘key notin (value1, value2, ...)’: key값이 value1이 아니거나 value2가 아닐 때
- 키가존재한다/존재하지않는다
- ‘key’: label에 key가 있을 때
- ‘!key’: label에 key가 없을 때
활용해보겠다.
나는 concept가 flower이거나 earth인 Pod를 조회 해보겠다 정확하게 나온걸 확인할 수 있다.
이번에는 concept 레이블이 없는 모든 Pod를 조회해보겠다. (! 이용)
마지막으로 concept 레이블이 없는 모든 Pod를 조회하겠다. (notin 이용)
이번에는 레이블을 직접 수정해보자 tree-app-1, tree-app-2 Pod의 concept 레이블이 earth로 정의되어있는데
mountain으로 수정해보겠다 아래출력을 보면 레이블이 수정된걸 확인 할 수있다
# 레이블을 수정 하기위해선 기존의 레이블을 덮어 씌워야하기 때문에 오버라이트한다
$ kubectl label pod tree-app-1 concept=mountain --overwrite
$ kubectl label pod tree-app-2 concept=mountain --overwrite
마지막으로 labels을 생성하고 수정했다면 삭제도 가능하다.
hello-app-1 Pod의 version 레이블을 삭제해보겠다
아래 출력에 지정한 hello-app-1 의 version 레이블이 삭제된걸 확인할 수 있다.
# 삭제 하고자하는 레이블뒤에 -를 붙혀주면된다
$ kubectl label pod hello-app-1 version-
기술출처
레이블과 셀렉터
레이블 은 파드와 같은 오브젝트에 첨부된 키와 값의 쌍이다. 레이블은 오브젝트의 특성을 식별하는 데 사용되어 사용자에게 중요하지만, 코어 시스템에 직접적인 의미는 없다. 레이블로 오브
kubernetes.io
'DevOps > K8s' 카테고리의 다른 글
[K8s] 쿠버네티스 Deployment의 개념 (2) | 2022.12.22 |
---|---|
[K8s] 쿠버네티스 ReplicaSet의 개념 (0) | 2022.12.22 |
[K8s] 쿠버네티스 Pod간의 네트워크 (1) | 2022.12.21 |
[K8s] 쿠버네티스 Pod의 개념과 환경변수 (0) | 2022.12.21 |
[k8s] 쿠버네티스의 개념 - 1 (0) | 2022.12.08 |