本文由簡體中文內容自動轉碼而成。阿里雲不保證此自動轉碼的準確性、完整性及時效性。本文内容請以簡體中文版本為準。

建立Arm節點池並調度工作負載至Arm節點

更新時間:2025-01-24 20:22

ACK叢集預設會將所有工作負載調度到x86架構的Worker節點。如果您的叢集中既有Arm節點,又有非Arm節點(例如x86節點),為了確保只相容Arm架構的工作負載調度到Arm節點,或多架構鏡像優先調度到Arm節點,您可以基於Kubernetes原生調度配置來實現。

前提條件

  • 已建立1.20及以上版本的叢集,且作業系統為Alibaba Cloud Linux 3。更多資訊,請參見建立叢集升級叢集

    說明
    • ACK組件中心中,僅核心組件日誌和監控儲存網路類的組件支援在Arm節點池中使用。

    • 應用市場的組件不支援在Arm節點池中使用。

  • 已安裝kube-scheduler組件,請參見管理組件

注意事項

如果您的ACK叢集同時存在Arm節點和x86節點,為了防止不支援Arm的應用和組件被錯誤地調度到Arm節點,請為Arm節點添加汙點kubernetes.io/arch=arm64:NoSchedule。如果您的叢集版本為v1.24之前,在使用nodeSelector或者nodeAffinity指定應用調度至Arm節點時,您需要同時聲明汙點容忍kubernetes.io/arch=arm64:NoScheduletolerations。如果您的叢集版本為v1.24版本及之後,調度器能夠自動識別Arm節點的汙點kubernetes.io/arch=arm64:NoSchedule,無需您額外聲明tolerations

相關計費

關於Arm架構的ECS規格及其定價的詳細資料,請參見:

建立Arm叢集或節點池

您可以在建立ACK叢集時添加Arm節點,建立一個只包含Arm節點的新叢集;也可以在已有叢集中建立一個Arm節點池,建立一個包含Arm節點的節點池。

建立叢集時添加
建立一個節點池

在叢集建立的節點池配置過程中,在執行個體規格地區,架構選擇ARM 計算,選擇通用型執行個體規格類型系列g8m的執行個體規格,然後按需配置其他參數,完成叢集的建立。關於建立叢集的配置介紹,請參見建立ACK託管叢集image.png

說明

您可以前往ECS執行個體可購買地區,查看執行個體在各地區的可購情況。

在節點池建立過程中,在執行個體規格地區,架構選擇ARM 計算,然後按需配置其他參數,完成節點池的建立。關於建立節點池的配置介紹,請參見建立和管理節點池image.png

說明

您可以前往ECS執行個體可購買地區,查看執行個體在各地區的可購情況。

指定Arm架構的工作負載調度到Arm節點

如果您的叢集中既有Arm節點也有非Arm節點,且您的應用只支援Arm架構,您可以指定應用運行在Arm節點上,以免應用Pod被調度到非Arm節點上導致啟動失敗。所有Arm節點上預設帶有Labelkubernetes.io/arch=arm64,您可以通過兩種方式nodeSelector和nodeAffinity指定應用部署到Arm節點上。

nodeSelector
nodeAffinity

您可以在Pod上增加如下約束,使用nodeSelector將Pod調度到Arm架構的節點上。nodeSelector將指定此工作負載僅調度到具有arm64標籤的節點,ACK叢集的Arm架構的節點都具有此標籤。

nodeSelector:
  kubernetes.io/arch: arm64 # 指定Arm節點。

您可以使用以下範例程式碼將一個無狀態應用部署到Arm節點。

展開查看YAML檔案

apiVersion: apps/v1
kind: Deployment
metadata:
  name: only-arm
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      nodeSelector:
        kubernetes.io/arch: arm64 # 指定Arm節點。
      containers:
      - name: nginx
        image: nginx

您可以在Pod上增加如下約束,使用節點親和性聲明指定應用部署到Arm節點上。此約束指定Pod只能被調度到帶有Label kubernetes.io/arm=arm64的節點上。

當Pod Spec上帶有此約束時,調度器自動容忍節點上的汙點kubernetes.io/arch=arm64:NoSchedule

affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/arch
          operator: In
          values:
          - arm64

您可以使用以下範例程式碼將一個無狀態應用部署到Arm節點。

展開查看YAML檔案

apiVersion: apps/v1
kind: Deployment
metadata:
  name: only-arm
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/arch
                operator: In
                values:
                - arm64
      containers:
      - name: nginx
        image: nginx

指定多架構鏡像調度到Arm節點

ACK叢集預設會將所有工作負載調度到x86架構的節點,並在x86節點資源不足時保持等待x86節點資源。如果您的應用鏡像為多架構鏡像,例如同時支援x86和Arm架構,您需要配置跨x86和Arm架構的節點調度。

例如,您可以通過配置節點親和性,使工作負載優先調度到Arm架構或x86架構的節點上,並在目標類型的節點資源不足時嘗試調度至其他架構類型的節點。

      affinity:
        nodeAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 1
            preference:
              matchExpressions:
              - key: kubernetes.io/arch
                operator: In
                values:
                - arm64
優先調度到Arm架構
優先調度到x86架構

優先調度到Arm架構的節點上的工作負載樣本如下。

展開查看YAML檔案

apiVersion: apps/v1
kind: Deployment
metadata:
  name: arm-prefer
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
# 優先調度到Arm架構的節點上。
      affinity:
        nodeAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 1
            preference:
              matchExpressions:
              - key: kubernetes.io/arch
                operator: In
                values:
                - arm64
      containers:
      - name: my-container
        image: nginx

優先將工作負載調度至x86架構的節點的樣本如下。

展開查看YAML檔案

apiVersion: apps/v1
kind: Deployment
metadata:
  name: amd-prefer
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      tolerations:
# 優先調度到x86架構的節點上。
      affinity:
        nodeAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 1
            preference:
              matchExpressions:
              - key: kubernetes.io/arch
                operator: In
                values:
                - amd64
      containers:
      - name: my-container
        image: nginx

常見問題

是否可以使用Arm架構類型的競價(Spot)執行個體?

目前已經提供Arm架構的競價執行個體。關於使用方式,請參見使用搶佔式執行個體

在ACK叢集中使用Arm架構節點有哪些限制?

目前,對於Arm架構,組件中心僅支援以下組件:

  • 核心組件

  • 日誌和監控

  • 儲存

  • 網路

應用市場的組件不支援Arm。

相關文檔

  • 本頁導讀 (1, M)
  • 前提條件
  • 注意事項
  • 相關計費
  • 建立Arm叢集或節點池
  • 指定Arm架構的工作負載調度到Arm節點
  • 指定多架構鏡像調度到Arm節點
  • 常見問題
  • 是否可以使用Arm架構類型的競價(Spot)執行個體?
  • 在ACK叢集中使用Arm架構節點有哪些限制?
  • 相關文檔
文檔反饋
phone 聯絡我們

立即和Alibaba Cloud在線服務人員進行交談,獲取您想了解的產品信息以及最新折扣。

alicare alicarealicarealicare