[kubernetes] 파드 어피니티(affinity) 그리고 안티 어피니티

vinca·2023년 12월 16일
0

☸️ kubernetes

목록 보기
28/35
post-thumbnail

Introduction

파드를 분배하는 방법인 노드 어피니티에 대해서 미리 공부한다면 더 쉽다.

파드는 언제라도 죽고, 또 생성될 수 있는 단위이지만 파드의 레이블은 여전히 동일하게 붙은 채로 생성할 수 있다.
이를 통해 우리는 affinity 즉, 친밀도와 레이블을 사용해서 파드를 노드에 적절히(?) 분배 할 수 있다.


실습

바로 실습을 살펴보자.

그림과 같이 워커노드 1번과 워커노드 3번에 nodeSelector를 통해 고정 배포된 파드에 affinity: leader 라는 레이블을 준다.

자 이렇게 해서 👑기준 파드가 완성되었다.

기준 파드라는 건 사실 별거는 아니고, 레이블을 가진 미리 배포해둔 파드일 뿐이다.

🔥👍 본 실습은 이 파드들을 상대로 친화적이게(해당 파드를 따라가게) 또는 비 친화적이게(해당 파드가 있는 곳으로는 배포되지 않게) 하는 실습을 할 것이다.

이후 디플로이먼트로 배포되는 4개의 파드에 대해서 podAffinity를 통해서 key: affinity이고 values:- leader 인 파드에 대해서 배포되도록 설정하자.

이를 통해서 디플로이먼트로 배포되는 총 4개의 파드들은 각 기준 파드가 위치한 워커노드 1번 및 워커노드 3번에 각각 2개씩 배포되는 것을 확인할 수 있다.

전체 소스코드

w1 고정 기준파드

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: sleepy
    affinity: leader
  name: w1-affinity-leader
spec:
  containers:
  - image: sysnet4admin/sleepy
    name: sleepy
  nodeSelector:
    kubernetes.io/hostname: w1-k8s

w3 고정 기준파드

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: sleepy
    affinity: leader
  name: w3-affinity-leader
spec:
  containers:
  - image: sysnet4admin/sleepy
    name: sleepy
  nodeSelector:
    kubernetes.io/hostname: w3-k8s

podAffinity 디플로이먼트

kind: Deployment
metadata:
  labels:
    app: deploy-podaffinity
  name: deploy-podaffinity
spec:
  replicas: 4
  selector:
    matchLabels:
      app: deploy-podaffinity
  template:
    metadata:
      labels:
        app: deploy-podaffinity
    spec:
      containers:
      - image: nginx
        name: nginx
      affinity:
        podAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: affinity
                operator: In
                values:
                - leader
            # If you want to change topologyKey,
            # modify the admission controller, or disable.
            topologyKey: kubernetes.io/hostname

anti-podAffinity 디플로이먼트

위에서 operator: In 부분을 operator: NotIn 으로 변경하면 anti-Affinity로 워커노드 1번과 워커노드 3번을 제외한 2번에만 배포되는 것을 확인할 수 있다.

etc

이러한 파드에 대한 친화성/비 친화성을 통해서 디플로이먼트를 데몬셋 처럼 배포할 수 있다.

어떻게 하면될까?

단순하게 podAntiAffinity를 required로 주고 디플로이먼트를 배포하면 된다.

이때 토폴로지 도메인(대상)을 노드로 즉, topologyKey: "kubernetes.io/hostname"으로 설정하면 된다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - my-app
            topologyKey: kubernetes.io/hostname
      containers:
      - name: my-container
        image: my-image

이는 CKA 시험에도 출제되는 문제이다.

Reference

그림으로 배우는 쿠버네티스

profile
붉은 배 오색 딱다구리 개발자 🦃Cloud & DevOps

0개의 댓글