[kubernetes-실습] Scheduling - label 사용한 pod 할당

# Assign Pods Using Labels

- label에 따라 pod 할당 테스트를 위해 세팅

# ------------------------------------------
# label에 따라 pod 할당 테스트를 위해 세팅
# 1. labeling
# master : status=vip, worker : status=other
# ------------------------------------------

# node list 확인. 
# 실습을 위해서 labels 나 taint 추가된게 없이 ready 상태여야 한다.
ps0107@k8smaster1:~$ kubectl get nodes
NAME         STATUS   ROLES    AGE    VERSION
k8smaster1   Ready    master   7d5h   v1.15.1
k8sworker1   Ready    <none>   7d5h   v1.15.1

# 현재 노드에 label, taint 정보를 확인.
ps0107@k8smaster1:~$ kubectl describe nodes | grep -i label
Labels:             beta.kubernetes.io/arch=amd64
Labels:             beta.kubernetes.io/arch=amd64

ps0107@k8smaster1:~$ kubectl describe nodes | grep -i taint
Taints:             <none>
Taints:             <none>

# 실습을 위해서 kube-system 외에 현재 running 중인 deployment가 없어야 한다. 
# 만약 존재하면 삭제한 후에 각 노드별로 container 갯수를 확인해 본다.
ps0107@k8smaster1:~$ kubectl get deployment --all-namespaces
NAMESPACE     NAME           READY   UP-TO-DATE   AVAILABLE   AGE
kube-system   calico-typha   0/0     0            0           7d5h
kube-system   coredns        2/2     2            2           7d5h

# container 갯수 확인
ps0107@k8smaster1:~$ sudo docker ps | wc -l
22

ps0107@k8sworker1:~$ sudo docker ps | wc -l
10

# 실습을 위해서 master 노드에 status=vip 로, 다른 노드는 status=other 로 label 추가
ps0107@k8smaster1:~$ kubectl label nodes k8smaster1 status=vip
node/k8smaster1 labeled

ps0107@k8smaster1:~$ kubectl label nodes k8sworker1 status=other
node/k8sworker1 labeled

# label 확인
ps0107@k8smaster1:~$ kubectl get nodes --show-labels
NAME         STATUS   ROLES    AGE    VERSION   LABELS
k8smaster1   Ready    master   7d5h   v1.15.1   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8smaster1,kubernetes.io/os=linux,node-role.kubernetes.io/master=,status=vip
k8sworker1   Ready    <none>   7d5h   v1.15.1   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8sworker1,kubernetes.io/os=linux,status=other

 

- master node쪽으로 nodeSelector 를 설정하여 테스트 해보자.

# ------------------------------------
# master node쪽으로 nodeSelector 를 설정하여 테스트 해보자.
# ------------------------------------

# sleep time을 설정한 4개의 busybox 컨테이너를 만들기 위한 yaml 파일을 작성한다. 
# nodeSelect entry 도 포함한다.
ps0107@k8smaster1:~$ vi vip.yaml
apiVersion: v1
kind: Pod
metadata:
  name: vip
spec:
  containers:
  - name: vip1
    image: busybox
    args:
    - sleep
    - "1000000"
  - name: vip2
    image: busybox
    args:
    - sleep
    - "1000000"
  - name: vip3
    image: busybox
    args:
    - sleep
    - "1000000"
  - name: vip4
    image: busybox
    args:
    - sleep
    - "1000000"
  nodeSelector:
    status: vip  # <- vip 로 label 되어 있는 node로 할당

# pod 생성 후 각 노드 container 갯수 확인
ps0107@k8smaster1:~$ kubectl create -f vip.yaml
pod/vip created

# nodeSelector 로 vip label이 있는 master에 container 갯수 증가
ps0107@k8smaster1:~$ sudo docker ps | wc -l
27

ps0107@k8sworker1:~$ sudo docker ps | wc -l
10

# 생성한 vip 라벨링 pod들을 삭제한다.
ps0107@k8smaster1:~$ kubectl delete pod vip
pod "vip" deleted

 

- nodeSelector 설정 없애고 테스트 해보자

# ------------------------------------
# nodeSelector 설정 없애고 테스트
# ------------------------------------
ps0107@k8smaster1:~$ vi vip.yaml
apiVersion: v1
kind: Pod
metadata:
  name: vip
spec:
  containers:
  - name: vip1
    image: busybox
    args:
    - sleep
    - "1000000"
  - name: vip2
    image: busybox
    args:
    - sleep
    - "1000000"
  - name: vip3
    image: busybox
    args:
    - sleep
    - "1000000"
  - name: vip4
    image: busybox
    args:
    - sleep
    - "1000000"
#  nodeSelector:
#    status: vip

# pod 생성 후 container갯수 확인
# 이번에는 두개의 노드에 분산되어 컨테이너가 생성된다.
ps0107@k8smaster1:~$ kubectl create -f vip.yaml
pod/vip created

ps0107@k8smaster1:~$ sudo docker ps | wc -l
22

ps0107@k8sworker1:~$ sudo docker ps | wc -l
15

 

- worker node쪽으로 nodeSelector 를 설정하여 테스트 해보자.

# ------------------------------------
# worker node쪽으로 nodeSelector 를 설정하여 테스트 해보자.
# ------------------------------------
ps0107@k8smaster1:~$ cp vip.yaml other.yaml
ps0107@k8smaster1:~$ sed -i s/vip/other/g other.yaml
ps0107@k8smaster1:~$ vi other.yaml
ps0107@k8smaster1:~$ cat other.yaml
apiVersion: v1
kind: Pod
metadata:
  name: other
spec:
  containers:
  - name: other1
    image: busybox
    args:
    - sleep
    - "1000000"
  - name: other2
    image: busybox
    args:
    - sleep
    - "1000000"
  - name: other3
    image: busybox
    args:
    - sleep
    - "1000000"
  - name: other4
    image: busybox
    args:
    - sleep
    - "1000000"
  nodeSelector:
    status: other  # <- worker node 쪽으로 

# pod 생성 후 container갯수 확인
# 이번에는 worker 노드에 컨테이너가 생성된다.
ps0107@k8smaster1:~$ kubectl create -f other.yaml
pod/other created

ps0107@k8smaster1:~$ sudo docker ps | wc -l
22

ps0107@k8sworker1:~$ sudo docker ps | wc -l
19

# 리소스 정리
ps0107@k8smaster1:~$ kubectl delete pods vip other
pod "vip" deleted
pod "other" deleted