配置DaemonSet升级模型以解决升级阻塞以及OTA升级问题

在边缘计算场景中,原生的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)