Node Affinity

zuckerfrei·2023년 6월 29일
0

Kubernetes

목록 보기
22/63

사용 목적

특정 노드에 파드를 스케줄링하기 위함

node selector와 유사하지만 다양한 operator사용 가능하다는 점에서 더 고급기술?이라고 할 수 있음 → 더 유연하게 스케줄링 가능
노드에 붙어있는 라벨을 기반으로 이 파드를 배치할지 말지를 판단함

"조건에 맞는 라벨을 가진 노드가 있다면 파드를 그곳에 배치한다"

종류

중간에 배를 갈라서 앞뒤로 2가지가 합쳐졌다고 보면 된다.

노드 어피니티 = 스케줄링 규칙 + 실행중 규칙

예를 들어,
requiredDuringSchedulingIgnoredDuringExecution = requiredDuringScheduling + IgnoredDuringExecution


  • 스케줄링 규칙
    • requiredDuringScheduling : 조건을 만족해야 스케줄링
    • preferredDuringScheduling : 조건을 만족하는 노드를 선호하지만, 마땅치 않으면 임의의 노드에 파드를 배치
  • 실행중 규칙
    • IgnoredDuringExecution : 조건을 만족하는 노드가 없어지더라도(노드의 라벨 변경 등의 사유) 파드를 건드리지 않음
    • RequiredDuringExecution : 조건을 만족하는 노드가 없어진다면(노드의 라벨 변경 등), 해당 파드를 제거

  • 조합으로 만들어진 노드 어피니티 종류
    • requiredDuringSchedulingIgnoredDuringExecution
      • 조건을 만족해야 스케줄링하며, 실행 중 조건에 맞는 노드가 없어져도 파드는 유지
    • preferredDuringSchedulingIgnoredDuringExecution
      • 조건을 만족하는 노드를 선호하지만 필수는 아니며, 실행 중 조건에 맞는 노드가 없어져도 파드는 유지
    • requiredDuringSchedulingRequiredDuringExecution
      • 조건을 만족해야 스케줄링하며, 실행 중 조건에 맞는 노드가 없어진다면 해당 파드를 제거

사용법

spec.affinity.nodeAffinity 에 원하는 종류의 어피니티와 규칙을 적는다.

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: disktype
            operator: In
            values:
            - ssd      
...

이 파드는 노드의 disktype 이라는 라벨의 키가 존재하며, 그 값이 ssd일 때 스케줄링 된다.

실행 중 조건에 맞는 노드가 없어도 여전히 그 노드에 유지된다.


pod definition 부분에 사용하며, deploy 같은 경우 pod 선언부분이 어디인지 잘 보고 작성해야한다.
# 예시
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

operator

참조

  • In
    • values list [’a’, ‘b’, ‘c’] 중에 하나라도 존재하는 경우 true
  • NotIn
    • ↔ In 반대임. values list 값과 모두 일치하지 않는 경우 true
  • Exists
    • 라벨의 value가 무엇이든 상관없다. 이 key가 존재하기만 하면 true
  • DoseNotExist
    • ↔ Exist 반대임. 이 key가 존재하지 않으면 true
  • Gt, Lt
    • int 값 비교
profile
무설탕 음료를 좋아합니다

0개의 댓글