본문 바로가기
IT 잡지식/DevOps

[CKA] KodeKloud -Node Affinity

by 쯀리♥️ 2024. 6. 8.

안녕하세요, 쯀리입니다.

오늘은 Node Affinity에 관해 알아볼거에요.
Node Affinity는 Kubernetes에서 Pod가 특정 노드에 스케줄링되도록 하는 제약 조건을 설정하는 기능입니다. 이는 특정 Label을 가진 노드에만 Pod를 배치하거나 특정 노드에 배치하지 않도록 하는 등의 세밀한 스케줄링 정책을 구현할 수 있게 합니다.

https://kubernetes.io/docs/tasks/configure-pod-container/assign-pods-nodes-using-node-affinity/

 

Assign Pods to Nodes using Node Affinity

This page shows how to assign a Kubernetes Pod to a particular node using Node Affinity in a Kubernetes cluster. Before you begin You need to have a Kubernetes cluster, and the kubectl command-line tool must be configured to communicate with your cluster.

kubernetes.io

 

 


 

Node Affinity란?

Node Affinity란 Pod가 특정 노드에만 스케줄링 되도록 합니다. 

Node Affinity 유형

1. requiredDuringSchedulingIgnoredDuringExecution:
Pod가 스케줄링될 때 반드시 조건을 만족해야 하는 강제적 제약 조건입니다. 이 조건을 만족하지 않는 노드에는 Pod가 배치되지 않습니다.
스케줄링 후에는 이 제약 조건이 더 이상 적용되지 않습니다 (즉, 실행 중인 Pod는 영향을 받지 않습니다).

2. preferredDuringSchedulingIgnoredDuringExecution:
Pod가 스케줄링될 때 우선적으로 고려해야 하는 권장 조건입니다. 이 조건을 만족하는 노드가 있다면 해당 노드에 우선적으로 배치되지만, 반드시 이 조건을 만족할 필요는 없습니다.

 

Node Affinity와 Taints & Tolerations 비교

Node Affinity: Pod가 특정 라벨을 가진 노드에 배치되도록 제약 조건을 설정합니다. 이는 주로 “어떤 노드에 배치할 것인가”에 대한 정책을 설정합니다.

Taints & Tolerations: 특정 노드에 Pod가 배치되지 않도록 하거나 특정 조건을 만족하는 Pod만 배치될 수 있도록 합니다. 이는 주로 “어떤 노드에 배치되지 않도록 할 것인가”에 대한 정책을 설정합니다.


문제

1. How many Labels exist on node node01?
Label이 5개가 정해져 있는 것을 볼수 있습니다. 

 

2. What is the value set to the label key beta.kubernetes.io/arch on node01?
위에서 확인해보면 beta.kubernetes.io/arch에대한 키값은 amd64입니다.

3. Apply a label color=blue to node node01

kubectl label nodes node01 color=blue


4. Create a new deployment named blue with the nginx image and 3 replicas.

kubectl create deployment blue --image=nginx --replicas=3 --dry-run=client -o yaml >> deploy_blue.yaml
kubectl apply -f deploy_blue.yaml


5. Which nodes can the pods for the blue deployment be placed on?
node들을 살펴보면 node01에 color=blue라는 라벨이 지정되어있네요 .

kubectl describe node node01 | grep -i taints
kubectl describe node controlplane | grep -i taints

 

controleplane& node01 모두 가능

Taints가 <None>인경우 

Taints가 없으면: Pod는 특별한 제약 없이 해당 노드에 배포될 수 있습니다.
Node Affinity가 없으면: Pod는 노드의 Label과 상관없이 해당 노드에 배포될 수 있습니다.

 

6. Set Node Affinity to the deployment to place the pods on node01 only.

Name: blue
Replicas: 3
Image: nginx
NodeAffinity: requiredDuringSchedulingIgnoredDuringExecution
Key: color
value: blue


아까 생성했던 yaml파일 밑에 affinity:부분을 추가해줍니다

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: blue
  name: blue
spec:
  replicas: 3
  selector:
    matchLabels:
      app: blue
  template:
    metadata:
      labels:
        app: blue
    spec:
      containers:
      - image: nginx
        name: nginx
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: color
                operator: In
                values:
                - blue


7. Where are the pods now? 
지금 node부분은 node01로 지정되었습니다. 

 

8. Create a new deployment named red with the nginx image and 2 replicas, and ensure it gets placed on the controlplane node only.

Use the label key - node-role.kubernetes.io/control-plane - which is already set on the controlplane node.

Name: red
Replicas: 2
Image: nginx
NodeAffinity: requiredDuringSchedulingIgnoredDuringExecution
Key: node-role.kubernetes.io/control-plane
Use the right operator
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: red
  name: red
spec:
  replicas: 2
  selector:
    matchLabels:
      app: red
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: red
    spec:
      containers:
      - image: nginx
        name: nginx
        resources: {}
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: node-role.kubernetes.io/control-plane
                operator: Exists
status: {}

 


오늘은 Node Affinity에 관해 알아보았는데요. 
다음시간에는 K8s 리소스에 관해 알아보도록 할게요~

 


참조

 Udemy Labs - Certified Kubernetes Administrator with Practice Tests

'IT 잡지식 > DevOps' 카테고리의 다른 글

[CKA] KodeKloud - DaemonSets  (0) 2024.06.09
[CKA] KodeKloud -Resource Limits  (0) 2024.06.09
[CKA] KodeKloud -Taints and Tolerations  (0) 2024.06.08
[CKA] KodeKloud - Labels and Selectors  (0) 2024.06.03
[CKA] KodeKloud - Manual Scheduling  (0) 2024.06.03