본문 바로가기

CKA &. CKAD/Scheduling

Practice Test - Node Selectors/Affinity

 

kubectl label nodes <node-name> <label-key>=<label-value>

kubectl label nodes node-1 size=large

 

 

Node Affinity Type

 

- requiredDuringSchedulingIgnoredDuringExecution 
- preferredDuringSchedulingIgnoredDuringExecution 

로 부르는 두 가지 종류의 노드 어피니티가 있다.

 

전자는 파드가 노드에 스케줄되도록 반드시 규칙을 만족해야 하는 것(nodeSelector 와 같으나 보다 표현적인 구문을 사용해서)을 지정하고, 후자는 스케줄러가 시도하려고는 하지만, 보증하지 않는 선호(preferences) 를 지정한다는 점에서 이를 각각 "엄격함(hard)" 과 "유연함(soft)" 으로 생각할 수 있다.

 

이름의 "IgnoredDuringExecution" 부분은 nodeSelector 작동 방식과 유사하게 노드의 레이블이 런타임 중에 변경되어 파드의 어피니티 규칙이 더 이상 충족되지 않으면 파드가 여전히 그 노드에서 동작한다는 의미이다.

 

향후에는 파드의 노드 어피니티 요구 사항을 충족하지 않는 노드에서 파드를 제거한다는 점을 제외하고는 preferredDuringSchedulingIgnoredDuringExecution 와 같은 requiredDuringSchedulingIgnoredDuringExecution 를 제공할 계획이다.

 

따라서 requiredDuringSchedulingIgnoredDuringExecution 의 예로는 "인텔 CPU가 있는 노드에서만 파드 실행"이 될 수 있고, preferredDuringSchedulingIgnoredDuringExecution 의 예로는 "장애 조치 영역 XYZ에 파드 집합을 실행하려고 하지만, 불가능하다면 다른 곳에서 일부를 실행하도록 허용"이 있을 것이다.

 

노드 어피니티는 PodSpec의 affinity 필드의 nodeAffinity 필드에서 지정된다.

 노드 어피니티 구문은 다음의 연산자들을 지원한다. 

In, NotIn, Exists, DoesNotExist, Gt, Lt. NotIn 

 DoesNotExist 를 사용해서 안티-어피니티를 수행하거나,

특정 노드에서 파드를 쫓아내는 노드 테인트(taint)를 설정할 수 있다.

 

[Practice Test]

 

ㅁ How many Labels exist on the node01?

kubectl get nodes

kubectl describe node node01

or

kubectl get nodes node01 --show-labels

ㅁ node01 beta.kubernetes.io/arch label에는 어떤 값이 있는가?

kubectl get node --show-labels | grep beta.kubernetes.io/arch

 

ㅁ Apply a label color=blue to node node01

kubectl label node node01 color=blue

ㅁ Create a new deployment named blue with the nginx image and 6 replicas

kubectl create deployment blue --image=nginx --replicas=6
or
kbuectl create deployment blue --image=nginx
kubectl scale deployment blue --replicas=6

ㅁ Which nodes can the pods for the blue deployment placed on?

kubectl get pods -o wide

ㅁ Set Node Affinity to the deployment to place the pods on nodes01 only

- Name: blue

- Replicas: 6

- Image: nginx

- NodeAffinity: requiredDuringSchedulingIgnoredDUringExecution

- Key: color

- values: blue

apiVersion: apps/v1
kind: Deployment
metadata:
  name: blue
spec:
  replicas: 6
  selector:
    matchLabels:
      run: nginx
  template:
    metadata:
      labels:
        run: nginx
    spec:
      containenrs:
      - image: nginx
        imagePullPolicy: Always
        name: nginx
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: color
                operator: In
                values:
                - blue

ㅁ Create a new deployment named red with the nginx image and 3 replicas, and ensure it gets placed on the master/controlplane node only.

 

Use the label - node-role.kubernetes.io/master - set on the master/controlplane node.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: red
spec:
  replicas: 3
  selector:
    matchLabels:
      run: nginx
  template:
    metadata:
      labels:
        run: nginx
    spec:
      containers:
      - image: nginx
        imagePullPolicy: Always
        name: nginx
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: node-role.kubernetes.io/master
                operator: Exists

'CKA &. CKAD > Scheduling' 카테고리의 다른 글

PODs 와 Deployments를 편집하기위한 Quick note  (0) 2021.03.26
Resource Limits  (0) 2021.03.26
Practice Test - Taints and Tolerations  (0) 2021.03.26
Practice Test - Labels and Selectors  (0) 2021.03.25
Labels and Selectors  (0) 2021.03.25