全部產品
Search
文件中心

Container Service for Kubernetes:配置DaemonSet升級模型以解決升級阻塞以及OTA升級問題

更新時間:Sep 24, 2024

在邊緣計算情境中,原生的DaemonSet升級模型無法滿足某些特定的需求,例如,由於雲邊網路中斷,節點NotReady而導致的DaemonSet滾動升級被阻塞,或者您需要根據實際邊緣環境的狀態在邊緣節點上直接觸發應用的升級,而不由雲端驅動(例如新能源汽車的OTA升級)。此時,您可以通過配置擴充的DaemonSet升級模型AdvancedRollingUpdateOTA以解決雲邊網路中斷導致的升級阻塞以及OTA升級問題。

前提條件

適用於v1.26.3-aliyun.1及以上版本的ACK Edge叢集

升級模型說明

  • AdvancedRollingUpdate升級模型

    該升級模型幫您解決雲邊網路斷鏈時,由於節點狀態NotReady而導致的DaemonSet升級阻塞問題。在升級過程中,它會忽略NotReady狀態的節點,優先完成狀態為Ready的節點上的Pod升級。同時,當節點狀態從NotReady轉變為Ready時,它會自動完成該節點上DaemonSet Pod的升級。

  • OTA升級模型

    該升級模型允許您直接在邊緣節點上通過調用REST API來檢查Pod是否可以更新,以及觸發Pod的升級操作。

配置說明

apiVersion: apps/v1
kind: DaemonSet
metadata:
  annotations:
    apps.openyurt.io/update-strategy: AdvancedRollingUpdate
    apps.openyurt.io/max-unavailable: 30%
spec:
  updateStrategy:
    type: OnDelete

參數

說明

apps.openyurt.io/update-strategy

啟用擴充升級模型,支援AdvancedRollingUpdate或OTA。

apps.openyurt.io/max-unavailable

此配置僅在AdvancedRollingUpdate模式下生效。定義進階滾動升級過程中最大不可用Pod的數量,此註解的值與原生DaemonSet的maxUnavailable配置相同。如果未指定,則預設值為10%

DaemonSet.spec.updateStrategy.type

必須設定為OnDelete,即需要手動刪除舊的Pod以觸發新版本的Pod的建立。

使用方式

AdvancedRollingUpdate升級模型

以下範例程式碼為AdvancedRollingUpdate升級樣本,在樣本中建立了一個名為nginx-daemonset的DaemonSet,使用AdvancedRollingUpdate升級模型,並且在滾動升級過程中最多允許30%的Pod不可用。則該AdvancedRollingUpdate升級使用樣本如下。

cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: nginx-daemonset
  annotations:
    apps.openyurt.io/update-strategy: AdvancedRollingUpdate
    apps.openyurt.io/max-unavailable: 30%
spec:
  selector:
    matchLabels:
      app: nginx
  updateStrategy:
    type: OnDelete
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.19.4
EOF

OTA升級模型

  • OTA升級介面

    邊緣節點上的edge-hub組件提供了兩個與OTA升級相關的REST APIs。

    • GET /pods

      通過此介面可以擷取節點上的Pod資訊。您可以通過Pod.status.conditions中的PodNeedUpgrade來檢查Pod是否可以更新。

    • POST /openyurt.io/v1/namespaces/{ns}/pods/{podname}/upgrade

      通過此介面允許觸發特定的DaemonSet Pod的更新。路徑參數{ns}{podname}分別代表Pod的命名空間和名稱。您可以根據實際需求對指定的Pod執行升級操作。

  • OTA升級使用樣本

    建立一個名為nginx-daemonset的DaemonSet,使用OTA升級模型,當DaemonSet的鏡像更新後,節點上的Pod並不會自動更新,您需要在邊緣節點上通過REST API來檢查和觸發Pod的升級。

    cat <<EOF | kubectl apply -f -
    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: nginx-daemonset
      annotations:
        apps.openyurt.io/update-strategy: OTA
    spec:
      selector:
        matchLabels:
          app: nginx
      updateStrategy:
        type: OnDelete
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx:1.19.4
    
    EOF
  • OTA升級用例

    1. 登入邊緣節點,執行以下命令,查看節點上的所有Pod是否有升級需求。

      curl http://127.0.0.1:10267/pods

      若輸出結果中default/nginx-daemonset-bwzss pod.Status.Conditions`PodNeedUpgrade=true`,表明對應的Pod需要升級。

    2. 執行以下命令,對該Pod進行升級。

      curl -X POST http://127.0.0.1:10267/openyurt.io/v1/namespaces/default/pods/nginx-daemonset-bwzss/upgrade
    3. 執行以下命令,更新DaemonSet配置。

      Start updating pod default/nginx-daemonset-bwzss

相關文檔

如需確認Pod運行狀態,請參見管理容器組(Pod)