Intro
kubernetes 는 여러개의 노드가 클러스터링 되어있고, 그 안에 pod가 어느 노드로 스케줄링 해야할지를 상황에 따라 컨트롤 할 수 있어야 합니다. 오늘은 pod 스케줄링 기능중에 pod anti affinity 를 사용하여 각각 다른 노드와 다른 AWS AZ에 생성되도록 구성하는 방법에 대해 알아보고 관련된 내용을 살펴보겠습니다.
pod의 기본(default) 스케줄링
pod의 기본 스케줄링은 first-come, first-served (FCFS) 방식입니다. 즉, pod가 생성되면, pod의 자원 요구 사항을 충족시키는 첫 번째 유효한 노드에 배치하게 됩니다. k8s의 Scheduler는 사용할 수 있는 리소스가 가장 많은 노드부터 시작해서 사용 가능한 노드 목록을 검토하고, pod의 자원 요구 사항을 충족시킬 수 있는 노드를 찾습니다. 한마디로 별도의 스케줄링 정책을 넣지 않아도 알아서 사용할 수 있는 노드에 배치해준다는 것이죠.
pod의 스케줄링 정책들
위에서 설명드린 pod의 기본 스케줄링 정책외에 다른 스케줄링 정책을 사용하여 pod의 스케줄링을 컨트롤 할 수 있습니다. 그 종류가 resource-based scheduling, affinity/anti-affinity rules, custom scheduling algorithms 이 있습니다. custom scheduling algorithms은 직접 알고리즘을 구현하는 방법으로 일반적으로 사용하지 않기 때문에 나머지 resource-based scheduling, affinity/anti-affinity rules 를 예시를 보면서 살펴보겠습니다.
resource-based scheduling의 예시
- resources 의 request , limits 필드를 사용하여 원하는 리소스 용량을 지정하여, 이에 만족되는 노드에 스케줄링 되도록 할 수 있습니다. 여기서 request는 컨테이너 실행에 필요한 최소 리소스양이고, limit은 최대 리소스양입니다
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mycontainer
image: myimage:v1
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
nodeSelector:
disktype: ssd
affinity/anti-affinity 란
우선 affinity란 nodeselector와 비슷한 기능으로 더 다양한 옵션을 제공합니다. 조금 상세한 스케줄링을 원한다면 affinity를 사용하는 것이 좋겠죠 affinity 정책으로는 반드시 조건을 만족해야 스케줄링해주는 hard affinity 가 있고, 조건을 만족하지 않을 경우에도 스케줄링 해주는 soft affinity 가 있습니다.
pod affinity/anti affitnity 에서는 hard 가 requiredDuringSchedulingIgnoredDuringExecution
이고 soft가 preferredDuringSchedulingIgnoredDuringExecution
입니다.
affinity 예시
아래 예시는 node lable에 key=value 로 app=myapp가 설정이 되었는 경우에만 스케줄링 하는 정책입니다.
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- myapp
topologyKey: "kubernetes.io/hostname"
containers:
- name: mycontainer
image: myimage
anti-affinity 예시
이번에는 anti-affinity를 사용하여 각각 다른 노드와 다른 AWS AZ에 생성되도록 구성해보겠습니다.
- hard affinity 사용
apiVersion: apps/v1
kind: Deployment
metadata:
name: example-deployment
spec:
replicas: 3
selector:
matchLabels:
app: example
template:
metadata:
labels:
app: example
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: security
operator: In
values:
- high
topologyKey: failure-domain.beta.kubernetes.io/zone
- labelSelector:
matchExpressions:
- key: env
operator: In
values:
- prod
topologyKey: kubernetes.io/hostname
... (other specifications)
- soft affinity 사용
apiVersion: apps/v1
kind: Deployment
metadata:
name: example-deployment
spec:
replicas: 3
selector:
matchLabels:
app: example
template:
metadata:
labels:
app: example
spec:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: security
operator: In
values:
- high
topologyKey: failure-domain.beta.kubernetes.io/zone
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 90
podAffinityTerm:
labelSelector:
matchExpressions:
- key: env
operator: In
values:
- prod
topologyKey: kubernetes.io/hostname
... (other specifications)
'IT > DevOps' 카테고리의 다른 글
[DevOps] k8s sniff 를 사용한 pod의 tcp 패킷 캡처 (0) | 2023.08.20 |
---|---|
[DevOps] k9s -c pod 컬럼 설명 (0) | 2023.02.24 |
[DevOps] helm template에서 loop 돌리기 (rage until 사용) (0) | 2023.02.07 |
[DevOps] NodLocal DNS Cache 란? (EKS에서 Node local dns사용하기) (0) | 2022.10.04 |
[DevOps] helm template 다루기 (0) | 2022.09.08 |