Kubernetes

[ Kubernetes ] 특정 노드에 리소스 배포 - 레이블(labels)

블루빔 2023. 11. 28. 14:00

쿠버네티스에서 리소스를 배포하게 되면 쿠버네티스가 알아서 적절한 노드에 리소스를 배포해 줍니다. 하지만 필요에 따라 특정 노드에 특정 리소스를 배포해야 하는 경우도 있으므로 아래 해당 방법에 대해 기재하겠습니다.  

작업 환경 : node 3개가 있는 환경에서 특정 노드에 특정 pod를 배포해 보겠습니다. 

kubectl get nodes 
-------------------------------------------------------------------------------------
NAME                             STATUS   ROLES    AGE   VERSION
gke-blue-test-default-pool-1   Ready    <none>   25h   v1.27.3-gke.100
gke-blue-test-default-pool-2   Ready    <none>   25h   v1.27.3-gke.100
gke-blue-test-default-pool-3   Ready    <none>   25h   v1.27.3-gke.100

목차
▶ 노드 label 추가
▶ nodeSelector 선언 
▶ 최종 확인

▶ 노드 label 추가

node(gke-blue-test-default-pool-1)에 group=test 레이블을 추가하고
node(gke-blue-test-default-pool-2)에 group=prod 레이블을 추가합니다.

kubectl label node <노드네임> Key=Value

$ kubectl label node gke-blue-test-default-pool-1 group=test
------------------------------------------------------------------------
node/gke-blue-test-default-pool-1 labeled

 

위에서 설정한 Key 값으로 노드를 조회 해보면 아래와 같이 설정된 것을 확인할 수 있습니다. 

$ kubectl get nodes -L group
-------------------------------------------------------------------------------------------
NAME                          STATUS   ROLES    AGE   VERSION           GROUP
gke-blue-test-default-pool-1   Ready    <none>   25h   v1.27.3-gke.100   test
gke-blue-test-default-pool-2   Ready    <none>   26h   v1.27.3-gke.100   prod 
gke-blue-test-default-pool-3   Ready    <none>   25h   v1.27.3-gke.100

 

▶ nodeSelector 선언 

Yaml 파일 형식으로 생성 

(예시) pod 배포 시 node 지정 

apiVersion: v1
kind: Pod
metadata:
  name: test-app
  labels:
    group: test
spec:
  nodeSelector:                  # <== nodeSelector로 배포하고 싶은 노드를 특정 시킴
    group: test
  containers:
    - name: test-app-cn
      image: nginx:1.14.2
      ports:
        - containerPort: 8080
      resources:
        limits:
          cpu: "100m"
          memory: "120Mi"

 

command로 생성
[  --overrides='{"spec": {"nodeSelector": {"Key": "Value"}}}'  ]

(예시) pod 배포 시 node 지정 

kubectl run <pod네임> --image=<이미지> --overrides='{"spec": {"nodeSelector": {"Key": "Value"}}}'

$ kubectl run test-app2 --image=nginx:1.14.2 --overrides='{"spec": {"nodeSelector": {"group": "test"}}}'

 

 

▶ 최종 확인 

test-app들은 group=test 노드(gke-blue-test-default-pool-1)
prod-app들은 group=prod 노드(gke-blue-test-default-pool-2)에 배포된 것을 확인할 수 있습니다. 

$ kubectl get pods -o wide
NAME        READY   STATUS    RESTARTS   AGE   IP            NODE                          NOMINATED NODE   READINESS GATES
prod-app    1/1     Running   0          28m   10.240.2.7    gke-blue-test-default-pool-2   <none>           <none>
test-app    1/1     Running   0          28m   10.240.0.14   gke-blue-test-default-pool-1   <none>           <none>
test-app2   1/1     Running   0          20s   10.240.2.8    gke-blue-test-default-pool-1   <none>           <none>