因為篇幅太多所以分成兩篇來說明,這邊還會提到最後的重點就是關於 Pods 的部分,因為前面講可以在 Karpenter 上面去如何設置 provisioner 來呼叫 AWSNodeTmeplate 來提供 computing resource ,但是反過來我要如何讓 Node 上面知道我需要更多的支援?
因此這邊就是要把 Pod 安排進去 Node ,然後當 Node 上面的 resource滿的時候, Pod 就會是 pendding 的狀態,這時候才會觸發 Karpenter 去要求更多得資源,因此pod 的安排也是很重要的一環
因為pod 如果放置錯誤可能會導致其他的在同一個node 上產生資源的競爭,因而把其他的pod 給排除掉
可以想像給不同的Ds 在使用的時候,如果他跑兩個不同的training job , 然後兩邊互相搶奪支援,兩邊的pod 都訓練到一半就被排除,這樣到頭來都沒訓練好。
就是為了要避免這個情況發生,因此就要好好設定 pod 的 toleration 跟 affinity
Note : 如果不知道什麼是 toleration 的話,可以參考下一張
Pod 上面基本的我就不另外說明跟解釋,這邊的部分針對Karpenter 的設置的部分會另外解釋的就是 Toleration
跟 Affinity
至於怎麼安排進去的先後順序的話就是下面的 Affinity
File: Pod.yml
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
env: test
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
tolerations:
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoSchedule"
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoExecute"
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: topology.kubernetes.io/zone
operator: In
values:
- antarctica-east1
- antarctica-west1
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: another-node-label-key
operator: In
values:
- another-node-label-value
Pod 的部分的話就著重於設定的 Toleration 和 Affinity 的部分即可,其他的部分則是大同小異。後面後再分析設定Karpenter 會出現的狀況。
另外上面提到建立玩資源,但是這邊要提的是如何是砍掉那些資源
Cleanup
kubectl delete node $NODE_NAME
helm uninstall karpenter --namespace karpenter
aws cloudformation delete-stack --stack-name "Karpenter-${CLUSTER_NAME}"
aws ec2 describe-launch-templates --filters Name=tag:karpenter.k8s.aws/cluster,Values=${CLUSTER_NAME} |
jq -r ".LaunchTemplates[].LaunchTemplateName" |
xargs -I{} aws ec2 delete-launch-template --launch-template-name {}
eksctl delete cluster --name "${CLUSTER_NAME}"
以上大致上就是設置karpenter 的基本概念,然後這個設置目前只是比較手動的方式來進行設置,後面的部分會透過 Terraform 的方式來設置 Karpenter ,所以後面的部分會有些不同。
不過 AWSNodeTemplate & Provisioner 還有Pod 基本上都是一樣的
https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/