[K8S] Pod 스케줄링 방법

HYEOB KIM·2022년 7월 17일
1

kubernetes

목록 보기
12/14

Pod Scheduling

  • Node에 할당된 label을 이용해 Node를 선택하고 그 Node에 Pod를 배치시키는 과정입니다.

  • node Label 설정

% kubectl label node <노드 이름> <레이블 키>:<레이블 값>
  • 특정 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>

CKA 문제 유형

  • 작업 클러스터: k8s

다음의 조건으로 Pod를 생성하세요.

  • Name: eshop-store
  • Image: nginx
  • Node selector: disktype=ssd

1. 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

2. 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

3. 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>
profile
Devops Engineer

0개의 댓글