버전 비교

  • 이 줄이 추가되었습니다.
  • 이 줄이 삭제되었습니다.
  • 서식이 변경되었습니다.

...

(1) 노드에 레이블 설정

코드 블럭
kubectl label nodes NODE_NAMEw1-k8s service=web

(2) 노드 레이블 확인

코드 블럭
kubectl get nodes --show-labels

...

  • 파드가 특정 조건을 만족하는 노드에 스케줄링되도록 하는 기능이며, 크게 두 가지 유형으로 나눌 수 있습니다.

    • requiredDuringSchedulingIgnoredDuringExecution

      • 파드가 반드시 조건을 만족하는 노드에만 스케줄링됩니다.

      • 조건을 만족하는 노드가 없으면 파드는 스케줄링되지 않습니다.

    • preferredDuringSchedulingIgnoredDuringExecution

      • 조건을 만족하는 노드가 있다면 우선적으로 해당 노드에 스케줄링됩니다.

      • 조건을 만족하는 노드가 없으면 다른 노드에 스케줄링 될 수 있습니다.

정보

kubernetes explain pod.spec.affinity 로 확인하는 습관이 필요함

7/01-node-affinity.yaml

코드 블럭
apiVersion: v1
kind: Pod
metadata:
  name: example-pod
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: disktype
            operator: In
            values:
            - ssd
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        preference:
          matchExpressions:
          - key: region
            operator: In
            values:
            - east
  containers:
  - name: mycontainer
    image: nginx
  • requiredDuringSchedulingIgnoredDuringExecutiondisktypessd인 노드에만 파드를 스케줄링합니다.

  • preferredDuringSchedulingIgnoredDuringExecutionregioneast인 노드를 선호하지만, 해당 노드가 없으면 다른 노드에 스케줄링될 수 있습니다.

정보

Events 발생
Type Reason Age From Message

Warning FailedScheduling 2m38s default-scheduler 0/4 nodes are available: 1 node(s) had untolerated taint {node-role.kubernetes.io/control-plane: }, 3 node(s) didn't match Pod's node affinity/selector. preemption: 0/4 nodes are available: 4 Preemption is not helpful for scheduling.

코드 블럭
# kubectl label nodes w2-k8s disktype=ssd
# kubectl get nodes --show-labels -L disktype 

2.2 Node Anti-Affinity(Pod Anti-Affinity 내용)

  • 다른 파드와 겹치지 않게 할 때 사용합니다.

  • 파드가 특정 노드에 스케줄링되지 않도록 설정하는 방법으로 크게 두 가지 유형이 있습니다.

    • requiredDuringSchedulingIgnoredDuringExecution

      • 파드가 반드시 조건을 만족하지 않는 노드에만 스케줄링됩니다.

    • preferredDuringSchedulingIgnoredDuringExecution

      • 조건을 만족하지 않는 노드에 우선적으로 스케줄링되지만, 필요하다면 다른 노드에 스케줄링될 수 있습니다.

...

코드 블럭
apiVersion: v1
kind: Pod
metadata:
  name: example-podpod2
spec:
  affinity:
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: app
            operator: In
            values:
            - myapp
        topologyKey: "kubernetes.io/hostname"
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        podAffinityTerm:
          labelSelector:
            matchExpressions:
            - key: app
              operator: In
              values:
              - otherapp
          topologyKey: "kubernetes.io/hostname"
  containers:
    - name: mycontainer
      image: nginx
  • requiredDuringSchedulingIgnoredDuringExecutionapp=myapp 라벨을 가진 파드와 같은 노드에 스케줄링되지 않도록 합니다.

  • preferredDuringSchedulingIgnoredDuringExecutionapp=otherapp 라벨을 가진 파드와 같은 노드에 스케줄링되지 않도록 선호하지만, 조건을 만족하지 않더라도 스케줄링될 수 있습니다.

...

코드 블럭
apiVersion: v1
kind: Pod
metadata:
  name: example-podpod3
spec:
  affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchLabels:
            app: frontend
        topologyKey: kubernetes.io/hostname
    podAntiAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        podAffinityTerm:
          labelSelector:
            matchLabels:
              app: backend
          topologyKey: kubernetes.io/hostname
containers:
- name: mycontainer
  image: nginx
  • podAffinity는 app=frontend 라벨을 가진 파드가 있는 노드에 example-pod3을 배치합니다.

  • podAntiAffinityapp=backend 라벨을 가진 파드가 없는 노드에 example-podpod3을 우선 배치합니다.

...

4. Taint 및 Tolerations

  • 파드가 특정 노드에 스케줄링되지 않도록 제한하거나, 특정 조건을 충족하는 노드에만 스케줄링되도록 제어하는 방법입니다.

  • 노드에 Taint를 설정하면 파드가 스케줄링 되지 않으며, Toleration이 있는 파드만 스케줄링될 수 있습니다.

4.1 노드에 Taint 설정

코드 블럭
# kubectl taint nodes <nodew2-name>k8s keydisktype=valuessd:effectNoSchedule
# ex)kubectl taintdescribe nodes worker02 disktype=ssd:NoSchedule | grep -i taint

Taint 효과

  • NoSchedule: 이 Taint를 가진 노드에는 Toleration이 있는 파드만 스케줄링될 수 있습니다.

  • PreferNoSchedule: 가능하면 이 Taint를 가진 노드에는 Toleration이 있는 파드만 스케줄링하려고 합니다.

  • NoExecute: Toleration이 없는 기존 파드는 이 노드에서 축출됩니다.

...

코드 블럭
apiVersion: v1
kind: Pod
metadata:
  name: example-podpod4
spec:
  tolerations:
  - key: "disktype"
    operator: "Equal"
    value: "ssd"
    effect: "NoSchedule"
  containers:
  - name: mycontainer
    image: nginx
  • disktype=ssdNoSchedule 효과를 가진 Taint를 허용하여, 해당 Taint를 가진 노드에 파드를 스케줄링할 수 있도록 합니다.

4.3 노드에 Taint 해제

코드 블럭
# kubectl taint nodes w2-k8s disktype=ssd:NoSchedule-
node/w2-k8s untainted

5. Cordon 및 Uncordon

5.1 Cordon

...

  • 새로운 파드가 스케줄링되지 않도록 설정

코드 블럭
kubectl cordon worker01 w3-k8s
코드 블럭
# k get nodes -o wide
NAME     STATUS                     ROLES           AGE     VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
cp-k8s   Ready                      control-plane   6h45m   v1.29.2   192.168.1.10    <none>        Ubuntu 22.04.2 LTS   5.19.0-28-generic   containerd://1.6.28
w1-k8s   Ready                      <none>          6h35m   v1.29.2   192.168.1.101   <none>        Ubuntu 22.04.2 LTS   5.19.0-28-generic   containerd://1.6.28
w2-k8s   Ready                      <none>          6h31m   v1.29.2   192.168.1.102   <none>        Ubuntu 22.04.2 LTS   5.19.0-28-generic   containerd://1.6.28
w3-k8s   Ready,SchedulingDisabled   <none>          6h26m   v1.29.2   192.168.1.103   <none>        Ubuntu 22.04.2 LTS   5.19.0-28-generic   containerd://1.6.28

(2) 노드를 drain 상태로 설정

  • 노드에 위치한 파드를 추출하여 다른 노드로 이동

코드 블럭
# kubectl drain worker01w3-k8s  --ignore-daemonsets --delete-emptydir-data
node/w3-k8s cordoned
Warning: ignoring DaemonSet-managed Pods: kube-system/calico-node-5l222, kube-system/kube-proxy-kt66d, metallb-system/speaker-tv5fl
node/w3-k8s drained