使用 Flux 管理
Flux 是由多个专用 Kubernetes Controller 组成的 GitOps 工具集。Source Controller 获取带版本的配置和部署产物,其他 Controller 则把这些来源协调到集群中。在本工作流中,Flux Helm Controller 把 APISIX 或 API7 Ingress Controller 作为 Git 中定义的声明式 Helm Release 管理。
Flux Helm Controller 执行 Helm 安装与升级,并保存渲染后的 Release 清单。它还可以修复失败操作和配置漂移。由于 Flux 不会在每次比较时重新渲染 Chart,当前 Webhook 证书生成行为预计不会造成持续漂移。请保持启用 Webhook,并在生产使用该工作流前验证一次无变更协调。
本指南介绍如何创建 HelmRepository 与 HelmRelease、配置 CRD 生命周期策略和修复机制,以及协调 Gateway 和应用资源;还包括验证、升级、回滚和故障排查。
前置条件
开始前, 请确保满足以下要求:
- 已完成为 GitOps 做准备中所述的仓库、资源所有权、CRD 和凭证准备。
- 已安装 Flux,并配置已认证的
fluxCLI。 - Flux 可以访问平台仓库,并有权管理目标命名空间和所需集群级资源。
示例使用 aic 作为目标命名空间。如果使用其他命名空间,请替换所有清单和命令中的 aic。
示例 values 侧重 GitOps 所有权与协调,副本数、资源请求和 Pod 调度仍使用 Chart 默认值。用于生产前,请按工作负载配置容量、运行多个 Controller 副本,并将其分布到不同故障域。请参阅 AIC 高可用,并在目标集群中测试故障转移。固定的两个 Controller Chart 均可在 podDisruptionBudget.enabled=true,且自动伸缩的最小副本数至少为 2,或关闭自动伸缩且 deployment.replicas 大于 1 时,渲染 PodDisruptionBudget。
创建 Helm Source 与 Release
为所选 Controller 创建 HelmRepository 与 HelmRelease。示例采用 Controller 管理 CRD 的模型。
配置 HelmRelease 时,请应用为 GitOps 做准备中确定的 CRD 所有权策略:
- 如果由 HelmRelease 管理两组资源,请把
install.crds设置为Create,并把upgrade.crds设置为CreateReplace。对于 APISIX Chart 1.4.0,还应保持crds.gatewayAPI.enabled=true。升级 Release 前应分别审查两组资源。 - 如果由平台管理 Gateway API,而独立 APISIX HelmRelease 管理 APISIX CRD,请设置
crds.gatewayAPI.enabled=false,并保留Create和CreateReplace策略。 - 如果由平台管理两组资源,请通过独立且固定版本的 Flux Kustomization 协调它们。对于 APISIX Chart 1.4.0,请设置
crds.gatewayAPI.enabled=false;对于两种产品,请把 HelmRelease 的两项 CRD 策略都设为Skip。等待 CRD 报告Established状态后,再协调 HelmRelease。如果 Flux 也通过 Kustomization 应用 HelmRelease,请让该 Kustomization 依赖 CRD Kustomization。
清单使用 Flux v2 HelmRelease API 和漂移检测。应用前请确认当前 Flux 安装支持这些字段。
在共享或多租户集群中,把 HelmRelease 的 spec.serviceAccountName 设置为平台管理且仅拥有必要权限的 ServiceAccount。该 ServiceAccount 必须能够管理分配给 Release 的命名空间级与集群级资源;如果 HelmRelease 管理 CRD,还必须有权管理 CRD。否则 Flux 会使用授予 Helm Controller 的权限执行 Helm 操作。
- APISIX
- API7
目标命名空间(示例中为 aic)必须已经存在 APISIX Admin API Service 和 apisix-admin-key Secret。
apiVersion: v1
kind: Namespace
metadata:
name: aic
---
apiVersion: source.toolkit.fluxcd.io/v1
kind: HelmRepository
metadata:
name: apisix
namespace: aic
spec:
interval: 1h
url: https://apache.github.io/apisix-helm-chart
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: apisix-ingress-controller
namespace: aic
spec:
interval: 30m
releaseName: apisix-ingress-controller
chart:
spec:
chart: apisix-ingress-controller
version: "1.4.0"
sourceRef:
kind: HelmRepository
name: apisix
namespace: aic
interval: 12h
install:
crds: Create
remediation:
retries: 3
upgrade:
crds: CreateReplace
remediation:
retries: 3
driftDetection:
mode: enabled
values:
crds:
gatewayAPI:
enabled: true
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
高亮值会覆盖 APISIX Chart 自带的 auto 模式,避免把 Service 对外的 Gateway 监听器端口转换为物理 server_port 匹配条件。
如果 Controller 名称和 Leader Election ID 与 API7 Dashboard 生成的值不同,请替换为生成值。
apiVersion: v1
kind: Namespace
metadata:
name: aic
---
apiVersion: source.toolkit.fluxcd.io/v1
kind: HelmRepository
metadata:
name: api7
namespace: aic
spec:
interval: 1h
url: https://charts.api7.ai
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: api7-ingress-controller
namespace: aic
spec:
interval: 30m
releaseName: api7-ingress-controller
chart:
spec:
chart: api7-ingress-controller
version: "0.1.28"
sourceRef:
kind: HelmRepository
name: api7
namespace: aic
interval: 12h
install:
crds: Create
remediation:
retries: 3
upgrade:
crds: CreateReplace
remediation:
retries: 3
driftDetection:
mode: enabled
values:
config:
controllerName: api7.ai/api7-ingress-controller
leaderElection:
id: api7-ingress-controller-leader
provider:
type: api7ee
对于 Gateway API 工作流,请单独协调 API7 Dashboard 生成的非敏感 GatewayProxy、GatewayClass 和 Gateway,并通过 Secret 管理方案提供其凭证 Secret。
示例会把失败操作重试三次。Flux 会在重试失败的安装前先卸载,并在重试失败的升级前先回滚。请根据恢复策略调整重试次数并设置有限值,使持续存在的配置或权限错误必须由操作人员审查。
协调 Helm Release
把清单提交到 Flux 协调的路径,请求协调并检查 Release:
flux reconcile source helm <repository-name> -n aic
flux reconcile helmrelease <release-name> -n aic --with-source
flux get helmreleases -n aic
HelmRelease 应报告 Ready=True。在不更改 Git 的情况下再次执行协调,并确认版本和 Webhook Secret 保持不变。
协调 Gateway 与应用资源
HelmRelease 管理 Controller Release。请使用独立 Flux Kustomization 资源管理共享 Gateway 资源和应用路由,使其所有权与生命周期互相独立。尽管资源名为 Kustomization,每个被引用目录都可以只包含普通 Kubernetes YAML,而无需 kustomization.yaml 文件。
把产品专用 GatewayProxy、GatewayClass、共享 Gateway、应用命名空间和授权标签存放在之前准备且由平台管理的 infrastructure/gateway-resources/ 目录。对于 APISIX,如果 Controller Chart 会创建默认 GatewayProxy,请不要在该目录中重复保存。对于 API7,请使用 API7 Dashboard 生成的非敏感资源,并保留其名称和引用。
为平台仓库创建 GitRepository,并为共享资源创建 Kustomization:
apiVersion: source.toolkit.fluxcd.io/v1
kind: GitRepository
metadata:
name: platform-config
namespace: flux-system
spec:
interval: 1m
url: https://github.com/example/platform-config.git
ref:
branch: main
---
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
name: platform-gateway-resources
namespace: flux-system
spec:
interval: 10m
path: ./clusters/production/infrastructure/gateway-resources
prune: true
wait: true
timeout: 3m
sourceRef:
kind: GitRepository
name: platform-config
把每个应用的 Deployment、Service、HTTPRoute 和策略与该应用存放在一起。可以直接使用配置示例中的清单,无需创建 Overlay。为应用目录添加另一个 Kustomization,并让它依赖共享资源:
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
name: httpbin-production
namespace: flux-system
spec:
interval: 10m
path: ./clusters/production/applications/httpbin
prune: true
wait: true
timeout: 3m
targetNamespace: <application-namespace>
sourceRef:
kind: GitRepository
name: platform-config
dependsOn:
- name: platform-gateway-resources
如果任一目录包含普通清单,Flux 会生成构建配置。请把这些资源提交到 Flux Bootstrap 路径。应用 Kustomization 运行前,应用命名空间必须已由平台 Kustomization 或其他所有者创建。在共享或多租户集群中,请把每个 Kustomization 的 spec.serviceAccountName 设置为权限范围适当的 ServiceAccount。
该依赖会等待平台 Kustomization 报告 Ready=True,但两个 Controller 的 GatewayProxy 都没有状态。请通过 Gateway 与 HTTPRoute 状态和端到端请求验证实际 Gateway 连接。
验证
把 Release 推广到其他环境前,请验证 Controller Deployment、CRD、Gateway 连接和端到端路由。
确认 Deployment 可用且 CRD 已建立:
kubectl rollout status deployment \
-l app.kubernetes.io/instance=<release-name> \
-n aic \
--timeout=300s
kubectl get pods,services -n aic
kubectl get crd gatewayproxies.apisix.apache.org
kubectl wait --for=condition=Established \
crd/gatewayproxies.apisix.apache.org \
--timeout=60s
Controller Pod 应报告 Controller 与 ADC 两个容器都已就绪。检查渲染出的 Controller 配置和预期 GatewayProxy:
kubectl get configmap -n aic
kubectl get configmap <configmap-name> -n aic \
-o jsonpath='{.data.config\.yaml}{"\n"}'
kubectl get gatewayproxy -n aic
kubectl describe gatewayproxy <gatewayproxy-name> -n aic
两个 Controller 的 GatewayProxy 都不公开接受状态。启用准入 Webhook 后,无效对象可能在创建时被拒绝。请通过 Controller 日志,以及相关 Gateway 与 HTTPRoute 资源上的 Accepted、Programmed 和 ResolvedRefs 状态验证运行时连接。
使用 Git 管理的 Gateway 与 Class 完成代理请求到服务。成功请求可以验证从 Kubernetes 路由资源经 Controller 到 Gateway 的完整路径。
最后再次协调,并确认没有资源变化:
flux reconcile helmrelease <release-name> -n aic --with-source
flux get helmreleases -n aic
升级与回滚
通过 Git 管理升级和回滚,确保 Flux 始终是 Helm Release 的唯一协调器。
将 APISIX Ingress Controller Chart 1.3.x 升级到 1.4.0 之前,请先按迁移 APISIX Chart 1.3.x Gateway API 所有权操作。
升级 Controller:
- 审查 Ingress Controller 发布说明。另行审查所选 Chart 的 Release Notes,包括 CRD 变更。
- 在 Git 中更改固定的 Chart 版本和所需 values。
- 协调前检查渲染出的差异。
- 协调一个环境,并重复 Deployment、路由和无变更验证。
- 把相同 Git 变更推广到下一个环境。
回滚前,请确认已安装 CRD 与旧版 Controller 兼容。在回滚变更中把 upgrade.crds 设置为 Skip,防止旧 Chart 替换静态 CRD。对于 APISIX Chart 1.4.0,还应设置 crds.gatewayAPI.enabled=false,以免回滚变更渲染 Gateway API bundle。如果两组资源都由平台 Kustomization 管理,请保持 install.crds 与 upgrade.crds 均为 Skip。然后在 Git 中恢复 Chart 版本和 Controller values。
CRD 策略只控制 Chart crds/ 目录中的资源,不能抑制 APISIX Chart 1.4.0 作为模板渲染的 Gateway API 资源。请检查渲染出的回滚差异,确认它不会修改任一 bundle。自动失败升级修复可能重新应用已存储的 release 清单,之后的 Git 变更无法改写该清单。避免在 CRD 所有权变更期间自动回滚,并使用已审查的 Git revision 恢复。不要对 Flux 管理的 Release 运行 helm rollback 或 helm upgrade。
故障排查
使用以下检查诊断常见 Release 与协调故障:
| 现象 | 检查 | 解决方案 |
|---|---|---|
| HelmRelease 报告 CRD 所有权或升级失败 | 检查 install.crds、upgrade.crds、APISIX Chart 1.4.0 的 crds.gatewayAPI.enabled,以及管理相同 CRD 的其他 Controller。 | 为每组资源分别选定唯一所有者,并在其他 release 中禁用该 bundle。 |
| GatewayProxy 创建被拒绝,或 Controller 日志报告连接错误 | 确认其 Secret、端点或 Service、网络访问和 CRD 在协调前已经存在。 | 修正 Secret 引用、连接或依赖顺序,然后重新协调。 |
| 手动删除或编辑后 Controller 资源重新出现 | 检查是否启用 Flux 漂移检测。 | 在 Git 中完成预期变更,不要编辑实际对象。 |
| Release 修复机制持续重试 | 检查 Helm Controller 事件与 Release 历史。 | 修正 Chart values 或依赖,然后重新协调来源与 Release。 |