使用 Argo CD 管理
Argo CD 是面向 Kubernetes 的声明式 GitOps 持续交付工具。Argo CD Application 用于指定源仓库及版本、期望的 Kubernetes 配置和目标集群。Application Controller 会比较实际资源与期望状态,并手动或自动同步变更。
对于 APISIX 或 API7 Ingress Controller,Application 使用 Helm 根据 Git 中保存的配置渲染 Controller Chart。Argo CD 会协调渲染出的 Kubernetes 资源,但不会创建 Helm Release。该差异会影响 Chart 中准入 Webhook 证书和 CRD 的管理方式。
本指南介绍如何准备稳定的 Webhook 证书、创建 Controller Application、配置 CRD 所有权,以及协调 Gateway 和应用资源;还包括验证、OpenShift 和 ROSA 要求、升级与回滚。
前置条件
开始前,请确保满足以下要求:
- 已完成为 GitOps 做准备中所述的仓库、资源所有权、CRD 和凭证准备。
- 已安装 Argo CD,并配置已认证的
argocdCLI。 - 已有一个 AppProject,并将其限制到所选 Chart 仓库、目标命名空间和所需资源类型。除非 Argo CD 管理员另有限制,否则内置
default项目的权限范围很宽。
示例使用 aic 作为目标命名空间。如果使用其他命名空间,请替换所有清单、命令和 Webhook Service DNS 名称中的 aic。
示例 values 侧重 GitOps 所有权与协调,副本数、资源请求和 Pod 调度仍使用 Chart 默认值。用于生产前,请按工作负载配置容量、运行多个 Controller 副本,并将其分布到不同故障域。请参阅 AIC 高可用,并在目标集群中测试故障转移。
提供稳定的 Webhook 证书
在 Argo CD 渲染并同步 Controller Chart 前,配置内容确定的证书。
使用默认值 webhook.certificate.provided: false 时,示例中的 APISIX 和 API7 Chart 会在每次离线 Helm 渲染时生成新的准入 Webhook CA 和证书。Argo CD 渲染 Chart 时,Helm lookup 调用无法获取已有 Secret,因此 Secret 与 Webhook caBundle 可能长期处于 OutOfSync,或在自动同步期间发生轮换。
创建 Application 资源前,请选择 Argo CD 处理准入 Webhook 的方式:
| 方式 | 结果 | 建议 |
|---|---|---|
| 提供外部管理的证书 | 保留准入验证并生成稳定的清单。 | 推荐用于 Argo CD。平台必须管理证书及其轮换。 |
设置 webhook.enabled: false | 阻止 Chart 渲染 Webhook 资源,但会移除 Controller 的准入验证。 | 仅当可以接受验证能力降低且已单独测试时使用。 |
| 保持启用 Chart 生成的证书 | Argo CD 重复渲染时会产生不同的期望清单。 | 对于使用这些 Chart 版本且持续协调的 Application,请勿使用。 |
Application 示例保持启用 Webhook,并使用外部管理的证书。使用示例 Release 名称和 aic 命名空间时,请采用以下值:
| 产品 | 证书 DNS 名称 | Secret 名称 |
|---|---|---|
| APISIX Ingress Controller | apisix-ingress-controller-webhook-svc.aic.svc | apisix-ingress-controller-webhook-cert |
| API7 Ingress Controller | api7-ingress-controller-webhook-svc.aic.svc | api7-ingress-controller-webhook-cert |
准备证书和 Secret:
-
签发可用于服务器身份验证的证书,并把证书 DNS 名称作为主题备用名称(SAN)。
-
配置目标集群的 Secret 管理器,在目标命名空间中创建对应 Secret。
-
把服务器证书和私钥分别存为
tls.crt与tls.key。不要在 Git 中存储私钥。 -
对签发 CA 证书进行编码:
openssl base64 -A -in ca.crt -
把 Application 中的
webhook.certificate.caBundle设置为编码后的输出。示例使用REPLACE_WITH_BASE64_CA_CERTIFICATE占位符。
如果更改 releaseName、nameOverride、fullnameOverride 或目标命名空间,请先渲染 Chart。检查 Deployment 的 webhook-certs Volume 以确定所需 Secret 名称,并检查 Webhook Service 以确定所需 DNS 名称。
将 webhook.certificate.secretName 设置为外部 Secret 名称。这些 Chart 不会读取该 Secret 中的 ca.crt;请另行设置 webhook.certificate.caBundle,配置客户端对 Webhook 的信任。
如果续期证书仍由同一 CA 签发,请在证书过期前更新外部 Secret。Controller 会监视挂载的证书文件,并重新加载更新后的密钥对。
如果签发 CA 发生变化,请分阶段轮换信任。首先,把 caBundle 设置为旧 CA 与新 CA 的 PEM 证 书拼接后经 Base64 编码的内容,然后同步 Application。接着,用新 CA 签发的服务器证书更新外部 Secret,并验证准入请求。只有所有 Controller Pod 都开始提供新证书后,才能从 caBundle 中移除旧 CA。两种轮换路径都应先在非生产集群中测试。
不要把宽泛的 Argo CD ignoreDifferences 规则作为常规解决方案。它们会隐藏真实的证书变化,并可能使 Webhook 配置与挂载的 Secret 使用不同的信任链。
如果决定接受较弱的验证,请把示例的整个 webhook 配置块替换为 webhook.enabled: false。在平台仓库中记录该决策,并把无效资源测试纳入不依赖准入机制的验证流程。
创建 Application
为所选 Controller 创建 Application。示例采用 Controller 管理 CRD 的模型,并使用前面准备的外部管理 Webhook 证书。
配置 Application 时,请应用为 GitOps 做准备中确定的 CRD 所有权策略:
- 如果由 Controller Application 管理两组资源,请保持
source.helm.skipCrds: false。对于 APISIX Chart 1.4.0,还应保持crds.gatewayAPI.enabled=true。对体积较大的 HTTPRoute CRD 使用 Server-Side Apply,并禁用 Prune。 - 如果由平台管理 Gateway API,而独立的 APISIX Controller Application 管理 APISIX CRD,请设置
crds.gatewayAPI.enabled=false,并保持source.helm.skipCrds: false。 - 如果由平台管理两组资源,请通过独立且固定版本的 Application 协调它们。对于 APISIX Chart 1.4.0,请设置
crds.gatewayAPI.enabled=false和source.helm.skipCrds: true;对于 API7,请设置source.helm.skipCrds: true。等待 CRD 报告Established状态后,再协调 Controller Application。不要使用 Sync Wave 为相互独立的 Application 排序;如果一个 Application 必须明确控制顺序,请采用 App of Apps 模式。
清单使用 valuesObject。应用前请确认当前 Argo CD 版本支持该字段。
- APISIX
- API7
目标命名空间(示例中为 aic)必须已经存在 APISIX Admin API Service、apisix-admin-key Secret 和 apisix-ingress-controller-webhook-cert Secret。
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: apisix-ingress-controller
namespace: argocd
spec:
project: <app-project>
source:
repoURL: https://apache.github.io/apisix-helm-chart
chart: apisix-ingress-controller
targetRevision: 1.4.0
helm:
releaseName: apisix-ingress-controller
skipCrds: false
valuesObject:
crds:
gatewayAPI:
enabled: true
webhook:
enabled: true
certificate:
provided: true
secretName: apisix-ingress-controller-webhook-cert
caBundle: REPLACE_WITH_BASE64_CA_CERTIFICATE
config:
listenerPortMatchMode: "off"
provider:
type: apisix-standalone
gatewayProxy:
createDefault: true
provider:
type: ControlPlane
controlPlane:
service:
name: apisix-admin
port: 9180
auth:
type: AdminKey
adminKey:
valueFrom:
secretKeyRef:
name: apisix-admin-key
key: admin-key
destination:
server: https://kubernetes.default.svc
namespace: aic
syncPolicy:
retry:
limit: 5
backoff:
duration: 5s
factor: 2
maxDuration: 3m
syncOptions:
- ServerSideApply=true
高亮值会覆盖 APISIX Chart 自带的 auto 模式,避免把 Service 对外的 Gateway 监听器端口转换为物理 server_port 匹配条件。
如果 CRD 发现或其他临时依赖导致首次同步失败,有限重试策略会让 Argo CD 再尝试同步。当 CRD 与自定义资源包含在同一次同步中时,Argo CD 通常会跳过该自定义资源的初始 dry run。重试可以在 Discovery 刷新后恢复同步,但不能保证无效或持续失败的同步最终完成。
如果平台 Application 会先于 Controller Application 安装并验证 CRD,且没有其他临时依赖需要重试,请移除此策略。
目标命名空间(示例中为 aic)必须已存在 api7-ingress-controller-webhook-cert Secret。如果 Controller 名称和 Leader Election ID 与 API7 Dashboard 生成的值不同,请替换为生成值。
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: api7-ingress-controller
namespace: argocd
spec:
project: <app-project>
source:
repoURL: https://charts.api7.ai
chart: api7-ingress-controller
targetRevision: 0.1.28
helm:
releaseName: api7-ingress-controller
skipCrds: false
valuesObject:
webhook:
enabled: true
certificate:
provided: true
secretName: api7-ingress-controller-webhook-cert
caBundle: REPLACE_WITH_BASE64_CA_CERTIFICATE
config:
controllerName: api7.ai/api7-ingress-controller
leaderElection:
id: api7-ingress-controller-leader
provider:
type: api7ee
destination:
server: https://kubernetes.default.svc
namespace: aic
syncPolicy:
syncOptions:
- ServerSideApply=true
对于 Gateway API 工作流,请在 Controller 就绪后,通过独立目录协调 API7 Dashboard 生成的非敏感 GatewayProxy、GatewayClass 和 Gateway。确保其中的 Admin Key 引用指向 Secret 管理方案创建的 Secret。此 Chart 不会创建默认自定义资源,因此 Application 不需要 APISIX 首次同步重试策略。
ServerSideApply=true 允许 Application 创建 Chart 自带的大型 CRD。Server-Side Apply 会作用于 Application 中的所有资源,而不只是 CRD。如果其他协调器会修改相同对象,启用前请审查字段所有权。对于使用 APISIX Chart 1.4.0 的平台所有权模型,请禁用 Gateway API 模板;只有平台也管理 APISIX CRD 时才设置 skipCrds: true。
如果禁用 Webhook,且同步前命名空间中不需要存在其他资源,可以在 syncOptions 中添加 CreateNamespace=true,让 Application 创建命名空间。