使用RDS数据库持久化Argo工作流

更新时间:
复制为 MD 格式

Argo工作流在容器Argo工作流集群中被存储为Kubernetes资源,会被定期清理,如果需要对工作流的运行过程进行分析和回溯,可以通过配置持久化策略,将工作流持久化存储到数据库中。即使工作流被删除或者工作流运行的Pod被删除后,也可以查看工作流日志。本文以阿里云RDS MySQL数据库为例,介绍如何配置工作流持久化存储。

适用范围

  • 获取集群KubeConfig并通过kubectl工具连接集群

  • 创建RDS MySQL实例与配置数据库

    重要
    • RDS MySQL实例需要和已创建的容器Argo工作流集群处于同一VPC,并将该VPC网段添加到RDS实例的白名单中。

    • 操作过程中,请记录数据库名称、数据库的用户名和密码(需要具有数据库的读写权限)、RDS实例地址等信息,用于后续步骤。

  • Argo工作流持久化功能支持RDS MySQL数据库、RDS PostgreSQL数据库。

操作步骤

  1. 将下方的示例保存到rds-user.yaml,然后执行kubectl apply -f rds-user.yaml创建Secret。

    apiVersion: v1
    stringData:
      username: DATABASE_USERNAME  # 替换为数据库的用户名。
      password: DATABASE_PASSWORD  # 替换为数据库的密码。
    kind: Secret
    metadata:
      name: argo-mysql-config
      namespace: default
    type: Opaque
  2. 将下方命令中的CLUSTER_ID替换为集群ID,然后执行命令编辑ConfigMap, 添加持久化相关配置。

    kubectl edit configmap -n CLUSTER_ID workflow-controller-configmap

    配置项:

    • host:设置为RDS MySQL实例的地址。

    • database:设置为数据库的名称。

    • archive:开启持久化功能,需要设置为true

    • archiveTTL:持久化数据的保存时间。示例中设置为30d,表示工作流持久化到数据库中保存30天。

    • nodeStatusOffLoad:开启工作流状态卸载(Offload)功能,需设置为true。开启后,工作流节点状态将存储在数据库中而非etcd,从而支持包含大规模子任务的单体工作流。

      persistence: |
        connectionPool:
          maxIdleConns: 100
          maxOpenConns: 0
          connMaxLifetime: 0s     # 0 means connections don't have a max lifetime.
        archiveTTL: 30d
        archive: true
        nodeStatusOffLoad: true
        mysql:
          host: rm-xxx.mysql.cn-beijing.rds.aliyuncs.com
          port: 3306
          database: argo-workflow
          tableName: argo_workflows
          userNameSecret:
            name: argo-mysql-config
            key: username
          passwordSecret:
            name: argo-mysql-config
            key: password
  3. 配置完成后,重启Argo Server,并确认Pod是否正常更新。

    kubectl rollout restart deployment -n CLUSTER_ID argo-server 
    重要

    如果重启Argo Server后,Pod出现反复重启状况,可能是由于网络连接出现问题。请检查集群和数据库实例是否处于同一个VPC,数据库白名单是否允许集群访问。