클라우드/DevOps

[K8s deepdive] Label 개념, label selector와 차이, auto-labeling with kyverno

dayeonsheep 2024. 10. 9. 19:06

~ Kubernetes Label ~

왜 나왔나? 왜 필요한가?

: MSA에서 파드 개수 늘어남 -> 구분 어려워짐 -> label을 이용해 집합을 만들어 구분하자

 

간단한 정의

: 파드 및 k8s 리소스를 조직화 할 수 있는 기능

 

레이블 셀렉터로 목록도 정렬하고, 파드 집합에 특정 작업을 수행할 수 있음

 

Q. 레이블이랑 레이블 셀렉터는 무슨 차이가 있나?

https://stackoverflow.com/questions/60027090/what-is-the-difference-between-label-and-selector-in-kubernetes

 

What is the difference between Label and Selector in kubernetes?

After reading the official documentation on kubernetes.io, I am still wondering what exactly is the difference between label and selector in Kubernetes? Editing: For example consider the following

stackoverflow.com

: 레이블은 일단 붙여서 구분하는 거고, 레이블셀렉터가 걔네 집합과 선택을 도와주는 듯

 

LabelLabel Selector의 차이를 정리하면 다음과 같습니다:

 

1. Label

  • 정의: Label은 쿠버네티스 리소스(예: Pod, Service 등)에 부여되는 키-값 쌍으로, 특정 리소스를 식별하거나 그룹화하는 데 사용됩니다.
  • 역할: 리소스에 특정 속성을 부여하고, 이를 통해 리소스를 구분할 수 있도록 합니다.
  • 예시: 이 Pod에는 app=web, environment=production이라는 두 가지 레이블이 부여되었습니다.
labels:
  app: web
  environment: production
  • 목적: 레이블 자체는 리소스에 붙여서 식별하는 데 사용됩니다. 단순히 레이블을 리소스에 추가하는 것 자체는 별다른 동작을 의미하지 않지만, 다른 리소스나 연산과의 상호작용을 위해 중요한 데이터를 제공합니다.

2. Label Selector

  • 정의: Label Selector는 레이블을 기준으로 특정 조건을 만족하는 리소스의 하위 집합을 선택하는 기준입니다. 이를 통해 특정 레이블이 부여된 리소스를 필터링하여 원하는 작업을 수행할 수 있습니다.
  • 역할: 리소스의 레이블을 기준으로 조건을 설정해 필터링하며, 쿠버네티스에서 선택된 리소스에 대해 연산을 수행할 수 있습니다.
  • 예시:이 selectorapp=web 레이블을 가진 Pod만 선택합니다.
selector:
  matchLabels:
    app: web
  • 목적: Label Selector는 레이블을 기준으로 특정 리소스를 선택할 수 있게 해주며, 주로 Service, Deployment, ReplicaSet과 같은 리소스가 관련된 Pod 또는 다른 리소스를 선택할 때 사용됩니다.

 

Label과 Label Selector의 차이점

Label Label Selector
리소스에 부여되는 키-값 쌍으로, 특정 속성이나 상태를 나타냄. 레이블을 기반으로 리소스를 필터링하고 선택하는 기준.
리소스에 태그를 붙여 그룹화하거나 식별하는 데 사용됨. 조건에 따라 특정 레이블을 가진 리소스의 하위 집합을 선택함.
레이블 자체로는 동작을 수행하지 않음. 선택된 리소스에 대해 작업을 수행할 수 있음 (예: Service가 특정 Pod를 선택).
리소스에 직접 부여되며 고정된 정보. 조건을 만족하는 리소스를 동적으로 선택.

 

Label Selector의 작동 방식

 

Label Selector는 레이블을 기준으로 다음과 같은 방식으로 리소스를 선택할 수 있습니다:

  1. 특정 레이블 키를 가진 리소스 선택 (존재 여부)
    • app이라는 레이블 키를 가진 모든 리소스를 선택.
    • 예: selector: app
  2. 특정 레이블 키와 값이 일치하는 리소스 선택 (동등 기반)
    • app=web인 리소스를 선택.
    • 예: selector: app=web
  3. 특정 레이블 키를 가지고 있지만, 지정된 값과는 다른 값을 가진 리소스 선택 (부정 기반)
    • app 레이블은 있지만 app!=api인 리소스를 선택.
    • 예: selector: app!=api

결론적으로, Label은 리소스를 식별하기 위한 태그이고, Label Selector는 그 태그를 기반으로 리소스를 선택하고 관리하는 기준입니다.

 


 

▼ 깔끔한 정리와 사용 예시

https://www.linkedin.com/pulse/mastering-kubernetes-labels-selectors-christopher-adamson-ft6ac/

 

Mastering Kubernetes Labels and Selectors

Labels and selectors are key concepts in Kubernetes that enable flexible and powerful ways to organize, select, and connect resources. This tutorial will cover: What are labels and selectors Why labels and selectors are useful How to apply labels to Kubern

www.linkedin.com

 

 

찾다보니?

node label을 k8s pod에 주입하는 법을 보게 됐는데,

https://stackoverflow.com/questions/36690446/inject-node-labels-into-kubernetes-pod

 

Inject node labels into Kubernetes pod

I am looking to deploy services to a Kubernetes cluster running over multiple zones and would like to be able to inject the region/zone labels into my pods using environment variables. I have looked

stackoverflow.com

 

Q. node label이랑 그냥 label이랑... 그냥 label은 pod에, node label은 node에 붙인다는 게 다른건가?

=> ㅇㅇ 

더보기

일반 Label
- 일반 Label은 쿠버네티스 리소스(주로 Pod, Service, Deployment 등)에 붙이는 **키-값 쌍**입니다. 이러한 레이블은 리소스를 식별하고 그룹화하는 데 사용됩니다.
- 주로 Pod, Service, Deployment 같은 리소스에 적용됩니다.
- 리소스의 속성, 역할, 환경 등을 태그로 식별하고 관리하기 위해 사용됩니다. 이를 통해 레이블을 기준으로 Pod를 선택하거나 그룹화할 수 있습니다.

Node Label
- Node Label은 쿠버네티스 클러스터에서 각 노드(Node)에 부여되는 키-값 쌍입니다. 이는 클러스터의 물리적 또는 논리적 노드를 식별하거나 구분하는 데 사용됩니다.
- Node에만 적용되며, 일반적으로 노드의 하드웨어 속성, 위치, 목적 등을 태그로 표현합니다.
- Node 레이블은 주로 스케줄링에 사용됩니다. Pod가 특정 레이블을 가진 노드에서만 실행되도록 제한하거나, 특정 하드웨어 요구사항에 맞는 노드에 Pod를 할당하는 데 사용됩니다.
- 예시 : $ kubectl label nodes node1 disktype=ssd
  위 명령어는 `node1` 노드에 `disktype=ssd`라는 레이블을 추가합니다. 이후 Pod 스케줄링 시 이 레이블을 참고하여 특정 노드에 Pod를 배포할 수 있습니다.

차이점 요약
- 일반 Label: Pod, Service, Deployment 등 리소스에 붙이는 태그
- Node Label: Node(클러스터 내 물리적/가상 서버)에 붙이는 태그


- 일반 Label: 리소스 식별과 그룹화를 위해 사용
- Node Label: Pod 스케줄링을 위해 노드를 식별하고 구분하는 데 사용


- 일반 Label: 리소스 간 상호작용이나 관리 목적으로 사용
- Node Label: Pod를 특정 노드에 할당하기 위한 스케줄링에 사용


- 일반 Label 예시: `app=web`, `environment=production`
- Node Label 예시: `disktype=ssd`, `zone=us-west-1`

 

Node Label을 이용한 스케줄링
 ; Node 레이블은 NodeSelector나 Node Affinity와 함께 사용되어 Pod가 특정 조건을 만족하는 노드에서만 실행되도록 할 수 있습니다.

NodeSelector 예시:
```yaml
apiVersion: v1
kind: Pod
metadata:
  name: web-pod
spec:
  containers:
    - name: web
      image: nginx
  nodeSelector:
    disktype: ssd
```
이 예시는 `disktype=ssd`라는 레이블을 가진 노드에서만 해당 Pod가 실행되도록 지정합니다.

결론
- 일반 Label은 Pod, Service, Deployment 같은 리소스에 부여되어 주로 리소스 식별 및 관리에 사용됩니다.
- Node Label은 노드에 부여되며, 주로 특정 노드에서만 Pod가 실행되도록 스케줄링할 때 사용됩니다.

 

 

https://stackoverflow.com/questions/66186014/what-is-the-difference-between-kubernetes-labels-node-role-kubernetes-io-master

 

What is the difference between kubernetes labels node-role.kubernetes.io/master and node-role.kubernetes.io/control-plane?

I am newbie to kubernetes, I see one of my node's role is control-plane,master. What is the difference? is a master node is a node running kube-apiserver? Then what defined control-plane node? I am...

stackoverflow.com

이건 좀 다른 얘긴데 master node role에 붙는 label과 control plane role에 붙는 Label 차이를 물어본 것 같다.

 

 

https://medium.com/avmconsulting-blog/node-labels-and-selectors-in-kubernetes-76fbd8a8940c

 

How to Provision Node Labels and Selectors in Kubernetes? (K8s)

Labels selectors are core grouping primitive in Kubernetes. They are used by the users to select a set of objects. Kubernetes API…

medium.com

selector에도 종류가 또 나눠진다.

: label, node, field selector. 3가지

 

근데 그러면 labeling을 일일이 붙여주는 건 넘 복잡할텐데(수가 많으니까)

어떻게 자동으로 붙여주나?

selector를 설정하기 전에 label을 붙여줘야 selector로 labeling을 구분지을 수 있는 것 아냐?

(label selector를 사용한다고 하면)

 

https://www.cncf.io/blog/2020/12/30/auto-labeling-kubernetes-resources-with-kyverno/

 

Kyverno, Auto-labeling Kubernetes Resources with Kyverno

Kyverno by Nirmata is an open-source policy engine designed for Kubernetes, providing users with familiar constructs to write custom rules and easily implement to validate, mutate, and generate new resources as needed.

nirmata.com

역시나. auto-labeling이 있다.

kyverno는 k8s 정책구성 ops를 도와주는 오픈소스

여기서 나온 예시는 ns에 auto-labeling을 적용시키는 것임

 

흠. pod에 auto-labeling도 가능할텐데

 

https://medium.com/google-cloud/kyverno-kubernetes-native-policy-management-7ca01fa372a3

 

My first experience with Kyverno: 🤯🤩

Update on Mar 7th, 2023 — this blog post is now featured in the official CNCF blog! 🎉

medium.com

내가 찾던 "Create a policy to enforce that any Pod should have a required label" 예시 외에도 흥미로운 예시들이 많았다

그런데? 결국 간단히 생각해 보면

label값을 '수정'시켜서 알맞게 추가해주는 것인데...

 

Q. 라벨링을 보통 실제 서비스 리소스 띄울 땐 어느 순서에 진행하는거지?

 

https://www.reddit.com/r/kubernetes/comments/196hde6/automatically_addupdate_a_pod_version_label_when/

 

From the kubernetes community on Reddit

Explore this post and more from the kubernetes community

www.reddit.com

이건 약간 다른 얘기지만 이미지 버전 업데이트할 때 팟 버전 레이블을 수정해주기 위한 건데,

그냥 helm 업데이트를 해주거나, image pull policy를 사용하거나 굳이 fluxCD같은 cd도구를 사용할 필요가 없다는 얘기...

 

Q. label을 팟을 띄울 때부터 설정할텐데... 나중에 설정하기 쉽게 레이블로 나누어 묶어야 할 때 이미 띄워져 있는 애들에 label을 맞춰주나?

== 이전 라벨링 순서에 대한 의문과 동일한 질문...

 

현업자분들께 물어보고 와야겟다.