iT邦幫忙

2023 iThome 鐵人賽

DAY 16
0

因為篇幅太多所以分成兩篇來說明,這邊還會提到最後的重點就是關於 Pods 的部分,因為前面講可以在 Karpenter 上面去如何設置 provisioner 來呼叫 AWSNodeTmeplate 來提供 computing resource ,但是反過來我要如何讓 Node 上面知道我需要更多的支援?

How to trigger karpenter to add more resource to specific provisioner?

因此這邊就是要把 Pod 安排進去 Node ,然後當 Node 上面的 resource滿的時候, Pod 就會是 pendding 的狀態,這時候才會觸發 Karpenter 去要求更多得資源,因此pod 的安排也是很重要的一環

因為pod 如果放置錯誤可能會導致其他的在同一個node 上產生資源的競爭,因而把其他的pod 給排除掉

可以想像給不同的Ds 在使用的時候,如果他跑兩個不同的training job , 然後兩邊互相搶奪支援,兩邊的pod 都訓練到一半就被排除,這樣到頭來都沒訓練好。

就是為了要避免這個情況發生,因此就要好好設定 pod 的 toleration 跟 affinity

Note : 如果不知道什麼是 toleration 的話,可以參考下一張

What kinds of configurations do we set on pod?

Pod 上面基本的我就不另外說明跟解釋,這邊的部分針對Karpenter 的設置的部分會另外解釋的就是 TolerationAffinity

  • Toleration :這個主要的針對的對象是 Node 上面的 Taint,其實不難想像,中文來理解就是 在 Node 上面設置污點( Taint ),然後 Pod 的要設置可以忍受的污點,所以Pod 就會在 k8s 裡面的 Scheduler 就會被安排到可以忍受的 Node 上面。 至於怎麼安排進去的先後順序的話就是下面的 Affinity
  • Affinity:這個要設置的主要原因是因為可能會設置 Default Node,負責執行一些比較無關緊要的 Job,因此 Default Node 可能會讓很多 Pod 直接搶佔使用。要就是 Toleration 跟 Taint 區分的很明確,一個坑一個蘿菠,不然要有先後順序排名的話就要設定 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 會出現的狀況。

Clean Up

另外上面提到建立玩資源,但是這邊要提的是如何是砍掉那些資源

Cleanup

kubectl delete node $NODE_NAME

**Delete the cluster

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 基本上都是一樣的


Reference

https://karpenter.sh/

https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/


上一篇
{Day 15: AutoScalar Karpenter for AWS - part 1}
下一篇
{Day 17: Toleration and Taint, Affinity Concept}
系列文
Don't be a Machine Learning Engineer30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言