flux2-kustomize-helm 示例

test e2e license

在这个例子中,我们假设一个有两个集群的场景:staging 集群和 production 集群。 最终目标是利用 Flux 和 Kustomize 来管理这两个集群,同时尽量减少重复声明。

我们将配置 Flux,以便使用 HelmRepositoryHelmRelease自定义资源来安装、测试和升级一个演示应用。 Flux将监控 Helm 代码库,并根据 semver 版本号范围自动将 Helm 版本升级到最新的 chart 版本。

先决条件

您需要一个 Kubernetes 集群版本 1.21 或更高版本。 要进行快速本地测试,您可以使用Kubernetes kind 其他 Kubernetes 设置也同样适用。

为了遵循本指南,您需要一个 GitHub 帐户和一个 可以创建存储库的个人访问令牌(检查repo下的所有权限)。

使用 Homebrew 在 macOS 或 Linux 上安装 Flux CLI:

或者通过使用 Bash 脚本下载预编译的二进制文件来安装 CLI:

存储库结构

Git 存储库包含以下顶级目录:

应用

应用程序配置结构如下:

apps/base/podinfo/ 目录中,我们有一个对两个集群具有公共值的Flux HelmRelease

apps/staging/ 目录中,我们有一个带有暂存特定值的 Kustomize 补丁:

请注意,version: ">=1.0.0-alpha"我们配置 Flux 以自动升级 HelmRelease到最新的图表版本,包括 alpha、beta 和预发布版本。

apps/production/ 目录中,我们有一个 Kustomize 补丁,其中包含特定于生产的值:

请注意,version: ">=1.0.0"我们将 Flux 配置为自动升级 HelmRelease到 latest stable chart 版本(alpha、beta 和预发布版本将被忽略)。

基础设施

基础设施结构如下:

infrastructure/controllers/ 目录中,我们有 FluxHelmRepositoryHelmRelease如下定义:

请注意,interval: 12h我们将 Flux 配置为每十二小时拉取一次 Helm 仓库索引以检查更新。 如果1.x找到与 semver 范围匹配的新 chart 版本,Flux 将升级该版本。

infrastructure/configs/ 目录中,我们有 Kubernetes 自定义资源,例如 Let's Encrypt issuer:

clusters/production/infrastructure.yaml中,我们替换 Let's Encrypt 服务器值以指向生产 API:

请注意,dependsOn 我们告诉 Flux 首先安装或升级控制器,然后再安装或升级配置。 这确保在 Flux 应用任何自定义资源之前,Kubernetes CRD 已在集群上注册。

引导阶段和生产

clusters 目录包含 Flux 配置:

clusters/staging/ 目录中,我们有 Flux Kustomization 定义,例如:

请注意,使用path: ./apps/staging,我们配置 Flux 来同步暂存 Kustomize overlay,并 使用dependsOn告诉 Flux 在部署应用程序之前创建基础设施项。

在您的个人 GitHub 帐户上 Fork 此存储库并导出您的 GitHub 访问令牌、用户名和存储库名称:

验证您的暂存集群是否满足先决条件:

将 kubectl 上下文设置为您的暂存集群并引导 Flux:

bootstrap 命令提交目录中 Flux 组件的清单clusters/staging/flux-system 并在 GitHub 上创建具有只读访问权限的部署密钥,以便它可以拉取集群内的更改。

观察在staging安装的 Helm 版本:

验证是否可以通过 ingress 访问演示应用程序:

通过设置生产集群的上下文和路径在生产中引导 Flux:

观察生产 reconciliation:

添加集群

如果要向fleet添加集群,请首先在本地克隆您的 repo:

使用您的集群名称在其中创建一个目录clusters

从暂存区复制同步清单:

您可以在apps里面创建一个 dev overlay,确保 spec.path内部更改clusters/dev/apps.yamlpath: ./apps/dev

将更改推送到主分支:

将 kubectl 上下文和路径设置为您的开发集群并引导 Flux:

相同的环境

如果您想要启动一个相同的环境,您可以引导一个集群 production-clone 并重用production定义。

引导production-clone集群:

将更改拉到本地:

创建kustomization.yamlclusters/production-clone目录中:

请注意,除了flux-system kustomize overlay之外,我们还包括 来自生产目录的infrastructureapps清单。

将更改推送到主分支:

告诉 Flux 在集群上部署生产工作负载production-clone

测试

在拉取请求合并到主分支并在集群上同步之前,应该在 CI 中验证对 Kubernetes 清单或存储库结构的任何更改。

此存储库包含以下 GitHub CI 工作流程: