파드를 분배하는 방법인 노드 어피니티에 대해서 미리 공부한다면 더 쉽다.
파드는 언제라도 죽고, 또 생성될 수 있는 단위이지만 파드의 레이블은 여전히 동일하게 붙은 채로 생성할 수 있다.
이를 통해 우리는 affinity 즉, 친밀도와 레이블을 사용해서 파드를 노드에 적절히(?) 분배 할 수 있다.
바로 실습을 살펴보자.
그림과 같이 워커노드 1번과 워커노드 3번에 nodeSelector를 통해 고정 배포된 파드에 affinity: leader
라는 레이블을 준다.
자 이렇게 해서 👑기준 파드가 완성되었다.
기준 파드라는 건 사실 별거는 아니고, 레이블을 가진 미리 배포해둔 파드일 뿐이다.
🔥👍 본 실습은 이 파드들을 상대로 친화적이게(해당 파드를 따라가게) 또는 비 친화적이게(해당 파드가 있는 곳으로는 배포되지 않게) 하는 실습을 할 것이다.
이후 디플로이먼트로 배포되는 4개의 파드에 대해서 podAffinity
를 통해서 key: affinity
이고 values:- leader
인 파드에 대해서 배포되도록 설정하자.
이를 통해서 디플로이먼트로 배포되는 총 4개의 파드들은 각 기준 파드가 위치한 워커노드 1번 및 워커노드 3번에 각각 2개씩 배포되는 것을 확인할 수 있다.
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
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
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
위에서 operator: In
부분을 operator: NotIn
으로 변경하면 anti-Affinity로 워커노드 1번과 워커노드 3번을 제외한 2번에만 배포되는 것을 확인할 수 있다.
이러한 파드에 대한 친화성/비 친화성을 통해서 디플로이먼트를 데몬셋 처럼 배포할 수 있다.
어떻게 하면될까?
단순하게 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 시험에도 출제되는 문제이다.