跳到主要内容

搭建你的 K3s 环境 -- 采用 Flux 来构建 GitOps 实践

在前面的章节中,我们提到使用 local git repo 来管理我们的配置文件是个很好的实践,这一章节我们主要介绍采用 GitOps 的方式,通过使用Git 作为事实的唯一来源来自动化部署整个 K3s 环境,也就是我们常说的 GitOps。

本文假设你已经按照前面的文章,在你本地或者远程的 VPS 里搭建了 K3s 环境,并成功采用 Kustomize 部署好了 Wordpress 应用。我会在此基础之上应用 Flux 来启用 GitOps 实践。关于什么是 GitOps 以及为什么我们要采用 GitOps,你可以参考这篇文章来更好的了解概念。

Flux 简介 #

Flux 是一个开源项目,可以帮助我们实现在 K3s 里快速应用 GitOps 实践的想法。它会定期检查 Git 仓库,并确保集群的状态与仓库中的定义一致。一旦 Git 仓库里的内容发生了修改,Flux将自动把更改应用到集群上。

安装 Flux #

Flux 官方提供各个平台的 CLI 文件,你可以通过不同的分发平台来安装它

对于 Linux:

curl -s https://fluxcd.io/install.sh | sudo bash

对于 macOS:

brew install fluxcd/tap/flux

对于 Windows: 请确保你机器上安装了 Chocolatey

choco install flux

更多内容请参考官方安装文档

配置 Flux 到 WordPress 私有仓库 #

默认情况下,我们都会希望将这些配置文件的仓库设置为私有的,下面以 Github 私有仓库为例,展示如何配置 Flux 连接到你的私有仓库。

创建 GitHub Personal Access Token #

首先,您需要创建一个 GitHub Personal Access Token(PAT)。该令牌将授权Flux访问您的私有存储库。

  • 登录到 GitHub 帐户。
  • 转到 “Settings” -> “Developer settings” -> “Personal access tokens”。
  • 点击 “Generate new token”。
  • 在 “Note” 字段中输入描述性名称,例如 “Flux”。
  • 在 “Select scopes” 部分选择适当的权限。对于 Flux,通常需要选择 repo(全部仓库权限)和r ead:org(读取组织权限)。
  • 点击页面底部的 “Generate token” 按钮。

记得保存生成的令牌,因为这是唯一一次可以看到令牌的机会。

将本地仓库放到 Github 远程私有仓库 #

这里就不展示具体的命令了,但是最终的仓库内的目录结构应当为:

k3s-wordpress/
├──  mysql/
         └── base/
                  ├── configmap.yaml
                  ├── secret.yaml
                  ├── statefulset.yaml
                  ├── pv-claim.yaml
                  ├── service.yaml
                  └── kustomization.yaml
└── wordpress/
         ├── base/
                  ├── deployment.yaml
                  ├── service.yaml
                  └── kustomization.yaml
         └── overlays/
                  ├── development/
                           ├── kustomization.yaml
                           └── replica_count.yaml
                  └── production/
                           ├── kustomization.yaml
                           └── replica_count.yaml

使用 PAT 在 Flux 中配置 GitHub 私有仓库 #

  • 创建 serect 访问私有仓库,其中是刚刚创建的令牌:
flux create secret git my-repo-secret --url=https://github.com/yourusername/your-repo --username=<your-username> --password=<your-token>
  • 创建 Git 源并引用上面创建的 my-repo-secret
flux create source git wordpress-repo --secret-ref=my-repo-secret --url=https://github.com/yourusername/your-repo --branch=main
  • 定义 Flux Kustomization 资源来应用 Kustomize 配置:
flux create kustomization mysql-deployment --source=wordpress-repo --path="./mysql/base" --prune=true --validation=client
flux create kustomization wordpress-deployment --source=wordpress-repo --path="./wordpress/overlays/development" --prune=true --validation=client

请妥善保管好你的 Personal Access Token(PAT)

验证部署结果 #

等待一段时间让Flux检测到更改并应用配置。可以使用以下命令来检查状态:

flux get kustomizations

应该能看到 mysql-deploymentwordpress-deployment 的状态为 Ready。

使用 Flux 进行持续部署 #

设定自动同步频率 #

Flux 可以定期从 Git 仓库中拉取更改,并将其部署到集群中。

设置自动同步的频率:

flux create kustomization wordpress-deployment --source=wordpress-repo --path="./wordpress/overlays/development" --prune=true --validation=client --interval=5m

比如说刚才的配置我们通过加上 --interval=5m 来告诉 Flux 每 5 分钟去拉取一次,看看有没有新的改动需要部署

结合 CI 工具自动部署 #

将应用程序代码和部署文件分离成两个不同的仓库是一个常见的最佳实践,特别是在较大的项目或跨多个团队协作的情况下。

在这样的情况下想要实现持续集成和部署,可以使用CI工具桥接两个仓库的方案:

当应用程序的仓库(例如,源代码仓库)发生更改时,CI 工具(例如 Jenkins,GitLab CI,或 GitHub Actions)被触发进行构建和测试。

构建成功后,CI 工具将新的 Docker 镜像推送到镜像仓库,并更新部署仓库中的镜像标签,随后提交这些更改。这样,Flux 将能够检测到部署仓库中的更改,并自动将新镜像部署到 Kubernetes 集群。

示例步骤:

  1. 触发构建: 当应用程序仓库有新的提交时,触发 CI 工具构建和测试。
  2. 构建镜像: 构建成功后,将新镜像推送到Docker镜像仓库。
  3. 更新部署仓库: 在 CI 流程中添加步骤以自动更新部署仓库中的 Kubernetes 部署文件,以引用新的镜像标签。
  4. 提交更改: 自动提交并推送部署仓库中的更改。
  5. Flux 自动部署: Flux 检测到部署仓库的更改,并自动将新镜像部署到集群。

多环境部署 #

在实际应用场景里,我们常常需要实现多环境部署,结合 Flux 来进行多环境部署,可以有下面几种策略:

  1. 创建多个 Git Repo,每个 Repo 里存放不同环境的部署文件,然后根据前文的方式每个 Repository 分别进行设置。
  2. 创建多个 Git source, 每个 source 对应不同的 branch,然后分别针对每个 source 来创建不同的 kustomization deployment。
  3. 在同一个 branch 下,如 main branch,创建多个 kustomization deployment 并通过 path 指定不同环境的配置。

针对中小型团队,个人还是推荐第三种方案的,更简单直接,不过出于对生产环境的敏感信息保护,往往会将生产环境单独设置一个 repo 并妥善保护。

回滚和历史记录 #

Flux的另一个强大功能是它能够自动回滚到先前的状态(如果新更改导致问题)并提供详细的历史记录。您可以使用以下命令查看历史记录:

flux get kustomization wordpress-deployment --with-revision

执行回滚:

flux reconcile kustomization wordpress-deployment --with-source=<revision>

其中是选择的修订的哈希值。

监控和通知 #

Flux 也支持设置监控和通知,以便在部署失败或出现其他重要事件时接收警报。Flux 可以与通知服务集成,例如 Slack,邮箱或 WebHooks等,具体可以查阅官方文档详细说明

FAQ #

无法与Git仓库连接 #

描述:Flux 无法拉取 Git 仓库。 解决方案:检查 Git 仓库的 URL、凭据和网络连接,确保 Flux 有正确的访问权限。

资源限制问题 #

描述:Flux 组件因资源限制而崩溃或性能下降。 解决方案:检查和调整资源限制和请求,确保 Flux 组件有足够的资源运行。

RBAC权限不足 #

描述:Flux 无法访问或操作 Kubernetes 资源。 解决方案:检查RBAC策略,确保 Flux 的 ServiceAccount 有必要的权限。

自动同步失败 #

描述:Flux 无法自动将更改从 Git 同步到集群。 解决方案:检查同步策略、Webhook 配置和 Git 仓库的状态。

回滚问题 #

描述:Flux 回滚功能不工作。 解决方案:确认 Git 历史状态,使用正确的回滚命令和策略。

如有其他没有提及的问题,官方文档和社区是一个极好的寻求答案的地方,或者你可以在评论区留言,我看到的第一时间会尝试解答

写在最后 #

本文只是涵盖 Flux 的基础使用,更多的高级特性,如安全审计,集成 Prometheus 监控等还请作为扩展阅读来学习