Node에 할당된 label을 이용해 Node를 선택하고 그 Node에 Pod를 배치시키는 과정입니다.
node Label 설정
% kubectl label node <노드 이름> <레이블 키>:<레이블 값>
% kubectl get node -L <레이블 키>
nodeSelector
속성을 이용해 yaml 구성 방법nodeSelector:
<레이블 키>: <레이블 값>
각 노드들의 Label 정보와 함께 노드 정보 출력 방법은 아래와 같습니다.
% kubectl get node --show-labels
NAME STATUS ROLES AGE VERSION LABELS
k8s-master Ready control-plane,master 173d v1.22.4 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-master,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node-role.kubernetes.io/master=,node.kubernetes.io/exclude-from-external-load-balancers=
k8s-worker1 Ready <none> 173d v1.22.4 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,disktype=ssd,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-worker1,kubernetes.io/os=linux
k8s-worker2 Ready <none> 173d v1.22.4 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,disktype=std,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-worker2,kubernetes.io/os=linux
기존에 있는 노드에 Label을 추가하고 싶을 때는 아래와 같이 명령합니다.
% kubectl label node k8s-worker2 gpu=true
node/k8s-worker2 labeled
# gpu 열이 추가되고 값과 함께 깔끔하게 보여줍니다.
% kubectl get node -L gpu
NAME STATUS ROLES AGE VERSION GPU
k8s-master Ready control-plane,master 173d v1.22.4
k8s-worker1 Ready <none> 173d v1.22.4
k8s-worker2 Ready <none> 173d v1.22.4 true
기존 노드의 Label 값을 바꾸는 방법은 아래와 같습니다.
% kubectl label node k8s-worker1 gpu=true
node/k8s-worker1 labeled
% kubectl label node k8s-worker1 gpu=false --overwrite
node/k8s-worker1 labeled
% kubectl get node -L gpu
NAME STATUS ROLES AGE VERSION GPU
k8s-master Ready control-plane,master 173d v1.22.4
k8s-worker1 Ready <none> 173d v1.22.4 false
k8s-worker2 Ready <none> 173d v1.22.4 true
Label을 삭제하는 방법은 아래와 같습니다.
% kubectl label node k8s-worker1 gpu-
node/k8s-worker1 unlabeled
% kubectl get node -L gpu
NAME STATUS ROLES AGE VERSION GPU
k8s-master Ready control-plane,master 173d v1.22.4
k8s-worker1 Ready <none> 173d v1.22.4
k8s-worker2 Ready <none> 173d v1.22.4 true
특정 Label을 가진 Node에만 Pod를 실행시키고 싶을 때는 nodeSelector
라는 속성을 이용합니다.
% vim /data/cka/pod-tensorflow.yaml
# 아래와 같이 내용 수정
apiVersion: v1
kind: Pod
metadata:
name: tensorflow-gpu
spec:
containers:
- name: tensorflow
image: tensorflow/tensorflow:nightly-jupyter
ports:
- containerPort: 8888
protocol: TCP
nodeSelector:
gpu: "true"
# Pod를 생성합니다.
% kubectl apply -f /data/cka/pod-tensorflow.yaml
tensorflow-gpu
라는 이름의 Pod는 gpu=true
를 가진 k8s-worker2에 생성되는 것을 볼 수 있습니다.
% kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
eshop-cart-app 1/1 Running 4 (112d ago) 115d 10.244.1.19 k8s-worker1 <none> <none>
eshop-store 1/1 Running 0 8m24s 10.244.1.39 k8s-worker1 <none> <none>
front-end-8dc556958-6z2wx 1/1 Running 0 40m 10.244.1.32 k8s-worker1 <none> <none>
front-end-8dc556958-mkxmz 1/1 Running 0 40m 10.244.1.30 k8s-worker1 <none> <none>
nginx-79488c9578-dc9n8 1/1 Running 0 40m 10.244.1.36 k8s-worker1 <none> <none>
nginx-79488c9578-qwnfk 1/1 Running 2 (112d ago) 113d 10.244.1.18 k8s-worker1 <none> <none>
nginx-deployment-877f48f6d-6ff44 1/1 Running 0 43m 10.244.1.25 k8s-worker1 <none> <none>
nginx-deployment-877f48f6d-ds25j 1/1 Running 0 40m 10.244.1.27 k8s-worker1 <none> <none>
nginx-deployment-877f48f6d-fr64s 1/1 Running 0 43m 10.244.1.24 k8s-worker1 <none> <none>
nginx-deployment-877f48f6d-pd5xf 1/1 Running 0 40m 10.244.1.34 k8s-worker1 <none> <none>
tensorflow-gpu 0/1 ContainerCreating 0 13s <none> k8s-worker2 <none> <none>
다음의 조건으로 Pod를 생성하세요.
disktype=ssd
Label을 가진 Node를 조회합니다.% kubectl get node -L disktype
NAME STATUS ROLES AGE VERSION DISKTYPE
k8s-master Ready control-plane,master 173d v1.22.4
k8s-worker1 Ready <none> 173d v1.22.4 ssd
k8s-worker2 Ready <none> 173d v1.22.4 std
disktype=ssd
Label을 가진 Node에 Pod를 생성하는 yaml 파일을 만듭니다.% kubectl run eshop-store --image=nginx --dry-run=client -o yaml > eshop-store.yaml
% vim eshop-store.yaml
# 아래와 같이 편집합니다.
apiVersion: v1
kind: Pod
metadata:
labels:
run: eshop-store
name: eshop-store
spec:
containers:
- image: nginx
name: eshop-store
nodeSelector:
disktype: ssd
k8s-worker1
에 Pod가 생성되는지 확인합니다.% kubectl apply -f eshop-store.yaml
pod/eshop-store created
% kubectl get pod -o wide | grep -i eshop-store
eshop-store 1/1 Running 0 8s 10.244.1.39 k8s-worker1 <none> <none>