🔹 NodeLabel
Node에 적용되는 Key-Value 쌍
명령어
# 모든 Node들의 라벨 조회
kubectl get nodes --show-labels
# 특정 Node의 라벨 조회
kubectl get node <node name> --show-labels
# 특정 라벨=값을 가진 Node 리스트 조회
kubectl get node -l <label>
# 특정 라벨을 가진 Node 리스트 조회
kubectl get node -l <label>=<value>
# 특정 라벨 컬럼과 함께 모든 Node 리스트 출력
kubectl get node -L <label>
# 특정 Node에 라벨 추가
kubectl label nodes <node name> <label>=<value>
# 특정 Node에 라벨 제거
kubectl label nodes <node name> <label>-
# 특정 Node에 라벨 변경
kubectl label nodes <node name> <label>=<value> --overwrite
예시
kubectl get node worker01 --show-labels
kubectl get node -l nodeGroup
kubectl get node -l nodeGroup=infraNode
kubectl get node -L nodeGroup
kubectl label nodes worker01 nodeGroup=infraNode
kubectl label nodes worker01 nodeGroup-
kubectl label nodes worker01 nodeGroup=serviceNode --overwrite
번외 Pod Label
kubectl get pods --show-labels
kubectl get pods -l name=mainui
kubectl get pods -L name
🔹 NodeSelector
특정 Node에서 실행되도록 강제하는 방법
Node를 선택할 때, Node의 Label을 기준으로 결정
yaml 예시
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
nodeSelector:
nodeGroup: infraNode
my-pod는 nodeGroup=infraNode 라벨을 가진 Node에 Pod를 생성하려고한다.
nodeGroup=infraNode 라벨을 가진 Node가 없을 경우 Pod는 생성되지 않고 Pending 상태를 유지한다.
이 경우 kubectl describe pod my-pod 명령어를 실행하면 Pod를 생성할 곳이 없다(node(s) didn't match Pod's node afficity/selector)는 Failed 메세지를 볼 수 있다.
참고: https://it.ohdi.co.kr/entry/k8s-nodeSelector-%EC%97%90%EB%9F%ACnodes-didnt-match-Pods-node-afficityselector
nodeSelector를 사용할 수 있는 오브젝트
Pod
Deployment
ReplicaSet
StatefulSet
DaemonSet
Job
CronJob
ReplicationController
🔹 PodNodeSelector
Namespace에 node-selector annotaion을 설정한다.
해당 Namespace에 생성된 Pod는 Namespace에 설정한 node-selector annotation과 동일한 nodeSelector를 가진다.
따라서 Namespace 단위로 Pod의 nodeSelector를 관리할 수 있다.
공식 문서: https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/#podnodeselector
deprecation 관련: https://github.com/kubernetes/kubernetes/issues/113474
활성화 방법
기본적으로 비활성화되어 있으며, 아래와 같이 변경하면 변경 즉시 api server pod가 재생성되면서 적용된다.
vi /etc/kubernetes/manifests/kube-apiserver.yaml
---
(변경전)--enable-admission-plugins=NodeRestriction
(변경후)--enable-admission-plugins=NodeRestriction,PodNodeSelector
사용 방법
# Namespace 생성
kubectl create namespace <NameSpace-Name>
# Namespace에 annotation 추가
kubectl annotate namespace <NameSpace-Name> scheduler.alpha.kubernetes.io/node-selector=<label>=<value>
# Pod 생성하면 자동으로 nodeSelector가 추가되어 있음
고려 사항(테스트 해봄)
만약 위와 같이 PodNodeSelector를 활성화한 후 Namespace에 annotation도 설정했을 때
pod.yaml에 사용자가 nodeSelector를 추가해주면 어떻게 되나요?
즉, PodNodeSelector와 NodeSelector와 우선순위가 어떻게 되나요?
Pod에는 모두 nodeSelector로 추가되기 때문에 PodNodeSelector와 NodeSelector에서 요구한 Label을 모두 가진 Node에만 Pod가 생성된다.
nodeSelector는 AND 조건을 가지기 때문에 하나라도 없으면 해당 Node에 Pod가 생성되지 않는다.
Namespace에 annotation을 설정하기 전에 Pod를 생성해버렸어요.
annotation을 설정하면 자동으로 Pod가 재생성되면서 지정한 Label Node로 Pod가 옮겨가나요?
아니요. 수동으로 재생성해주셔야합니다.
annotation을 수정해도 Pod는 그대로 떠있습니다.
Pod가 새로 떠야 적용됩니다.
'Kubernetes' 카테고리의 다른 글
[prometheus&grafana] Memory limit이 설정보다 2배로 보여요 (0) | 2025.02.27 |
---|---|
Kubernetes 관리 툴 K9S 설치 방법 및 사용 방법 (0) | 2025.02.17 |
Onpremise에 Kubeflow 구축하기 (0) | 2024.12.03 |
kubeadm으로 Kubernetes 구축하기 on AWS EC2 (Containerd, Calico, RHEL8/RHEL9) (1) | 2024.11.23 |
Kubernetes 버전에 따른 kube-system 이미지 버전 찾는 법 (0) | 2024.11.23 |