반응형
동탄야도란
미역의 DevOps 일지
동탄야도란
전체 방문자
오늘
어제
  • 분류 전체보기 (54)
    • javascript (0)
      • Nest.js (0)
    • JAVA (1)
      • Algorithm (1)
    • DevOps (50)
      • Docker (7)
      • K8s (11)
      • AWS (10)
      • GCP (1)
      • Linux (6)
      • CS (7)
      • Terraform (2)
      • ElasticSearch (2)
    • 회고 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

인기 글

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
동탄야도란

미역의 DevOps 일지

[K8s] 쿠버네티스 Label과 Selector
DevOps/K8s

[K8s] 쿠버네티스 Label과 Selector

2022. 12. 21. 22:30
728x90
반응형

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-

 

 

기술출처

https://kubernetes.io/ko/docs/concepts/overview/working-with-objects/labels/#%EB%A0%88%EC%9D%B4%EB%B8%94-%EC%85%80%EB%A0%89%ED%84%B0

 

레이블과 셀렉터

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

kubernetes.io

 

728x90
반응형

'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
    'DevOps/K8s' 카테고리의 다른 글
    • [K8s] 쿠버네티스 Deployment의 개념
    • [K8s] 쿠버네티스 ReplicaSet의 개념
    • [K8s] 쿠버네티스 Pod간의 네트워크
    • [K8s] 쿠버네티스 Pod의 개념과 환경변수
    동탄야도란
    동탄야도란
    저도 잘 몰라요

    티스토리툴바