如何在DigitalOceanKubernetes上使用Flux设置持续交付管道
作为 Write for DOnations 计划的一部分,作者选择了 Free and Open Source Fund 来接受捐赠。
介绍
Kubernetes 本身不提供持续集成和部署功能。 虽然这些概念在较小的项目中通常并不普遍,但广泛托管和更新其部署的大型团队发现设置此类流程以减轻手动耗时的任务并专注于开发正在部署的软件要容易得多。 为 Kubernetes 维护持续交付的一种方法是 GitOps。
GitOps 查看托管应用程序的 Git 存储库,并且 Kubernetes 清单显示为有关部署的中心事实来源。 它允许通过使用存储库分支来分离部署环境,使您能够在任何集群上快速重现当前或过去的任何配置状态,并通过 Git 版本控制使回滚变得微不足道。 清单始终是安全、同步且易于访问的。 根据外部因素(通常是持续集成系统),可以审核、允许或拒绝对清单或应用程序的修改。 自动化从推送代码到将其部署在集群上的过程可以大大提高生产力并增强开发人员体验,同时使部署始终与中央代码库保持一致。
Flux 是一个开源工具,可促进 Kubernetes 的 GitOps 持续交付方法。 Flux 允许通过监控配置的 Git 存储库并在更改可用时自动应用更改来自动将应用程序和配置部署到您的集群。 它可以应用 Kustomize 清单(它提供了一种简单的方法来选择性地动态修补常规 Kubernetes 清单的一部分),以及监视 Helm 图表的发布。 您还可以将其配置为通过 Slack、Discord、Microsoft Teams 或任何其他支持 webhook 的服务接收通知。 Webhook 提供了一种通知应用程序或服务发生在其他地方的事件并提供其描述的方法。
在本教程中,您将安装 Flux 并使用它为 podinfo 应用程序设置持续交付到您的 DigitalOcean Kubernetes 集群。 podinfo
是一款应用程序,可提供有关其运行环境的详细信息。 您将在 GitHub 帐户上托管包含 Flux 配置和 podinfo
的存储库。 您将设置 Flux 以监视应用程序存储库,自动应用更改,并使用 webhook 在 Slack 上通知您。 最后,您对受监控存储库所做的所有更改都将快速传播到您的集群。
先决条件
要完成本教程,您需要:
- 一个 DigitalOcean Kubernetes 集群,您的连接配置配置为
kubectl
默认值。 创建集群时,在 Connect to your Cluster 步骤下显示了有关如何配置kubectl
的说明。 要了解如何在 DigitalOcean 上创建 Kubernetes 集群,请参阅 Kubernetes 快速入门 。 - 您所属的 Slack 工作区。 要了解如何创建工作空间,请访问 [官方文档] (https://slack.com/help/articles/206845317-Create-a-Slack-workspace)。
- 具有个人访问令牌 (PAT) 的 GitHub 帐户,该帐户以所有权限创建。 要了解如何创建一个,请访问 官方文档 。
- Git 在本地机器上初始化和设置。 要开始使用 Git,以及查看安装说明,请访问 如何为开源做出贡献:Git 入门 教程。
- podinfo 应用程序存储库分叉到您的 GitHub 帐户。 有关如何将存储库分叉到您的帐户的说明,请访问 官方入门文档 。
第 1 步 — 安装和引导 Flux
在这一步中,您将在本地计算机上设置 Flux,将其安装到集群中,并设置专用 Git 存储库来存储其配置并对其进行版本控制。
在 Linux 上,您可以使用官方的 Bash 脚本来安装 Flux。 如果您使用的是 MacOS,您可以使用官方脚本,按照与 Linux 相同的步骤,或使用 Homebrew 使用以下命令安装 Flux:
brew install fluxcd/tap/flux
要使用官方提供的脚本安装 Flux,请运行以下命令下载它:
curl https://fluxcd.io/install.sh -so flux-install.sh
您可以通过运行以下命令检查 flux-install.sh
脚本以验证它是否安全:
less ./flux-install.sh
为了能够运行它,您必须将其标记为可执行文件:
chmod +x flux-install.sh
然后,执行脚本安装 Flux:
./flux-install.sh
您将看到以下输出,详细说明正在安装的版本:
Output[INFO] Downloading metadata https://api.github.com/repos/fluxcd/flux2/releases/latest [INFO] Using 0.13.4 as release [INFO] Downloading hash https://github.com/fluxcd/flux2/releases/download/v0.13.4/flux_0.13.4_checksums.txt [INFO] Downloading binary https://github.com/fluxcd/flux2/releases/download/v0.13.4/flux_0.13.4_linux_amd64.tar.gz [INFO] Verifying binary download [INFO] Installing flux to /usr/local/bin/flux
要启用命令自动完成,请运行以下命令来配置 shell:
echo ". <(flux completion bash)" >> ~/.bashrc
要使更改生效,请运行以下命令重新加载 ~/.bashrc
:
. ~/.bashrc
您现在可以在本地机器上使用 Flux。 在将其安装到集群之前,您首先需要运行验证兼容性的先决条件检查:
flux check --pre
Flux 将连接到您在先决条件中设置连接的集群。 您将看到与此类似的输出:
Output► checking prerequisites ✔ kubectl 1.21.1 >=1.18.0-0 ✔ Kubernetes 1.20.2 >=1.16.0-0 ✔ prerequisites checks passed
注意: 如果您看到错误或警告,请仔细检查您连接的集群。 您可能需要执行升级才能使用 Flux。 如果报告缺少 kubectl
,请针对您的平台重复先决条件中的步骤,并检查它是否在您的 PATH
中。
在引导过程中,Flux 在指定的提供者处创建一个 Git 存储库,并使用默认配置对其进行初始化。 为此,需要您在先决条件中检索到的 GitHub 用户名和个人访问令牌。 该存储库将在您在 GitHub 上的帐户下可用。
您将 GitHub 用户名和个人访问令牌存储为环境变量,以避免多次键入它们。 运行以下命令,将突出显示的部分替换为您的 GitHub 凭据:
export GITHUB_USER=your_username export GITHUB_TOKEN=your_personal_access_token
您现在可以通过运行引导 Flux 并将其安装到集群中:
flux bootstrap github \ --owner=$GITHUB_USER \ --repository=flux-config \ --branch=main \ --path=./clusters/my-cluster \ --personal
在此命令中,您指定应在提供者 github
处将存储库称为 flux-config
,由您刚刚定义的用户拥有。 新存储库将是个人的(不在组织下),默认情况下将设为私有。
您将看到的输出将与此类似:
Output► connecting to github.com ► cloning branch "main" from Git repository "https://github.com/GITHUB_USER/flux-config.git" ✔ cloned repository ► generating component manifests ✔ generated component manifests ✔ committed sync manifests to "main" ("b750ffae686c2f110364694d2ddae26c7f18c6a2") ► pushing component manifests to "https://github.com/GITHUB_USER/flux-config.git" ► installing components in "flux-system" namespace ✔ installed components ✔ reconciled components ► determining if source secret "flux-system/flux-system" exists ► generating source secret ✔ public key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDKw943TnUiKLVk4WMLC5YCeC+tIPVvJprQxTfLqcwkHtedMJPanJFifmbQ/M3CAq1IgqyQTydRJSJu6E/4YDOwx1vawStR9XU16rkn+rZbmvRxZ97E0HNb5m54OwmziAWf0EPdsfiIIJYSRkCMihpKJUNoakl+sng6LQsW+WIRlOK39aJRWud+rygQEuEKmD7YHKQ0VSb/L5v50jiPgEZImiREHNfjBU+RkEni3aZuOO3jNy5WdlPkpdqfHe8fdFsjJnvNB0zmfe3eTIB2fbdDzxo2usLbFeAMhGCRYsGnniHsytBHNLmxDM/4I18xlNN9e6WEYpgHEJVb8azKmwSX ✔ configured deploy key "flux-system-main-flux-system-./clusters/my-cluster" for "https://github.com/GITHUB_USER/flux-config" ► applying source secret "flux-system/flux-system" ✔ reconciled source secret ► generating sync manifests ✔ generated sync manifests ✔ committed sync manifests to "main" ("1dc033e24f3288a70ff80c57816e16c52bc62303") ► pushing sync manifests to "https://github.com/GITHUB_USER/flux-config.git" ► applying sync manifests ✔ reconciled sync configuration ◎ waiting for Kustomization "flux-system/flux-system" to be reconciled ✔ Kustomization reconciled successfully ► confirming components are healthy ✔ source-controller: deployment ready ✔ kustomize-controller: deployment ready ✔ helm-controller: deployment ready ✔ notification-controller: deployment ready ✔ all components are healthy
Flux 指出它制作了一个新的 Git repository
,为其提交了基本的启动配置,并在您的集群中配置了必要的控制器。
在这一步中,您已经在本地计算机上安装了 Flux,创建了一个新的 Git repository
来保存其配置,并将其服务器端组件部署到您的集群。 由存储库中的提交定义的更改现在将自动传播到您的集群。 在下一步中,您将创建配置清单以订购 Flux 以在发生更改时自动部署您已分叉的 podinfo
应用程序。
第 2 步 — 配置自动部署
在本节中,您将配置 Flux 以监视您分叉的 podinfo
存储库,并在更改可用时立即将更改应用到您的集群。
除了创建存储库和初始配置之外,Flux 还提供命令来帮助您使用参数生成配置清单,速度比从头开始编写它们要快。 清单,无论它们定义什么,都必须在其 Git 存储库中可用,才能被考虑在内。 要将它们添加到存储库中,您首先需要将其克隆到您的机器上以便能够推送更改。 通过运行以下命令来执行此操作:
git clone https://github.com/$GITHUB_USER/flux-config ~/flux-config
可能会要求您提供用户名和密码。 输入您的帐户用户名并提供您的个人访问令牌作为密码。
然后,导航到它:
cd ~/flux-config
要指示 Flux 监视分叉的 podinfo
存储库,您首先需要让它知道它的位置。 这是通过创建一个 GitRepository 清单来实现的,该清单详细说明了存储库 URL、分支和监视间隔。
要创建清单,请运行以下命令:
flux create source git podinfo \ --url=https://github.com/$GITHUB_USER/podinfo \ --branch=master \ --interval=30s \ --export > ./clusters/my-cluster/podinfo-source.yaml
在这里,您指定源将是具有给定 URL 和分支的 Git repository
。 您传入 --export
以输出生成的清单并将其通过管道传输到位于主配置存储库中 ./clusters/my-cluster/
下的 podinfo-source.yaml
,其中存储了当前集群的清单。
您可以通过运行显示生成文件的内容:
cat ./clusters/my-cluster/podinfo-source.yaml
输出将类似于以下内容:
~/flux-config/clusters/my-cluster/podinfo-source.yaml
--- apiVersion: source.toolkit.fluxcd.io/v1beta1 kind: GitRepository metadata: name: podinfo namespace: flux-system spec: interval: 30s ref: branch: master url: https://github.com/GITHUB_USER/podinfo
您可以检查您刚刚传递给 Flux 的参数在生成的清单中是否正确布局。
您现在已经定义了 Flux 可以访问的源 Git repository
,但您仍然需要告诉它要部署什么。 Flux 支持 Kustomize 资源,podinfo
暴露在 kustomize
目录下。 通过支持 Kustomizations,Flux 不会限制自己,因为 Kustomize 清单可以简单地包括所有通常的清单不变。
通过运行以下命令创建一个 Kustomization
清单,它告诉 Flux 在哪里寻找可部署的清单:
flux create kustomization podinfo \ --source=podinfo \ --path="./kustomize" \ --prune=true \ --validation=client \ --interval=5m \ --export > ./clusters/my-cluster/podinfo-kustomization.yaml
对于 --source
,您指定刚刚创建的 podinfo
Git 存储库。 您还将 --path
设置为 ./kustomize
,它指的是源存储库的文件系统结构。 然后,将 YAML 输出保存到当前集群目录中名为 podinfo-kustomization.yaml
的文件中。
您创建的 Git repository
和 Kustomization
现在可用,但 Flux 的集群端还看不到它们,因为它们不在 GitHub 上的远程存储库中。 要推送它们,您必须首先通过运行提交它们:
git add . && git commit -m "podinfo added"
现在提交更改后,将它们推送到远程存储库:
git push
与上次一样,git
可能会要求您提供凭据。 输入您的用户名和您的个人访问令牌以继续。
新的清单现在已经上线,集群端的 Flux 很快就会使用它们。 您可以通过运行以下命令来观察它将集群的状态与清单中显示的状态同步:
watch flux get kustomizations
在为 Git repository
指定的刷新间隔过去后(您在上面的清单中设置为 30s
),Flux 将检索其最新提交并更新集群。 完成后,您将看到与此类似的输出:
OutputNAME READY MESSAGE flux-system True Applied revision: main/fc07af652d3168be329539b30a4c3943a7d12dd8 podinfo True Applied revision: master/855f7724be13f6146f61a893851522837ad5b634
您可以看到应用了 podinfo
Kustomization 及其分支和提交哈希。 您还可以列出部署和服务以检查 podinfo
是否已部署:
kubectl get deployments,services
您会看到它们存在,并根据它们各自的清单进行配置:
OutputNAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/podinfo 2/2 2 2 56s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.245.0.1 <none> 443/TCP 34m service/podinfo ClusterIP 10.245.78.189 <none> 9898/TCP,9999/TCP 56s
您手动对 Flux 控制的这些资源和其他资源所做的任何更改都将很快被 Git 存储库中引用的更改覆盖。 要进行更改,您需要修改中央源,而不是集群中的实际部署。 这也适用于删除资源——您从集群中手动删除的任何资源都将很快恢复。 要删除它们,您需要从受监控的存储库中删除它们的清单并等待更改传播。
Flux 的行为是刻意的,因为它在每个刷新间隔结束时对它在远程存储库中找到的内容进行操作。 当您需要手动覆盖集群中的资源而不被 Flux 中断时,暂停 Kustomization 监控以及状态协调非常有用。
您可以通过运行以下命令无限期地暂停监视 Kustomization
:
flux suspend kustomization kustomization_name
可以通过在暂停的 Kustomization
上运行 flux resume
来恢复默认行为:
flux resume kustomization kustomization_name
您现在有一个自动化流程,每次发生更改时都会将 podinfo
部署到您的集群。 您现在将设置 Slack 通知,因此您将知道何时部署新版本的 podinfo
。
第 3 步 — 设置 Slack 通知
现在您已经为集群设置了自动 podinfo
部署,您将 Flux 连接到 Slack 通道,您将在其中收到有关每个部署及其结果的通知。
要与 Slack 集成,您需要在 Slack 上为您的工作区安装一个传入的 webhook。 传入 webhook 是一种将消息发布到配置的 Slack 通道的方式。
如果您从未创建过 webhook,则首先需要为您的工作区创建一个应用程序。 为此,首先登录 Slack 并导航到 应用程序创建页面 。 按下绿色的 Create New App 按钮并选择 From scratch。 将其命名为flux-app
,选择所需的工作空间,然后单击新建应用程序。
您将被重定向到新应用的设置页面。 点击左侧导航栏上的Incoming Webhooks。
通过翻转标题 Activate Incoming Webhooks 旁边的开关按钮,为 flux-app
启用 webhook。
将发现页面下方的新部分。 向下滚动并单击 Add New Webhook to Workspace 按钮。 在下一页上,选择您希望将报告发送到的通道,然后单击允许。
您将被重定向回 webhook 的设置页面,并且您会在表格中看到一个新的 webhook。 点击 Copy 将其复制到剪贴板并记下以备后用。
您将为您的应用程序生成的 Slack webhook 存储在集群中的 Kubernetes Secret 中,以便 Flux 可以访问它,而无需在其配置清单中明确指定它。 将 webhook 存储为 Secret 还可以让您在将来轻松替换它。
通过运行以下命令创建一个名为 slack-url
的 Secret,其中包含 Webhook,将 your_slack_webhook
替换为您刚刚复制的 URL:
kubectl -n flux-system create secret generic slack-url --from-literal=address=your_slack_webhook
输出将是:
Outputsecret/slack-url created
您现在将创建一个 Provider,它允许 Flux 使用 webhook 与指定的服务通信。 他们从 Secrets 中读取 webhook URL,这就是您刚刚创建一个的原因。 运行以下 Flux 命令以创建 Slack 提供程序:
flux create alert-provider slack \ --type slack \ --channel general \ --secret-ref slack-url \ --export > ./clusters/my-cluster/slack-alert-provider.yaml
除了 Slack,Flux 还支持通过 webhook 与 Microsoft Teams、Discord 和其他平台进行通信。 它还支持发送通用 JSON 以容纳更多解析此格式的软件。
Provider 只允许 Flux 发送消息,不指定何时发送消息。 为了让 Flux 对事件做出反应,您需要使用 slack
提供程序通过运行以下命令来创建警报:
flux create alert slack-alert \ --event-severity info \ --event-source Kustomization/* \ --event-source GitRepository/* \ --provider-ref slack \ --export > ./clusters/my-cluster/slack-alert.yaml
此命令创建一个名为 slack-alert
的警报清单,它将对所有 Kustomization
和 Git repository
更改做出反应,并将它们报告给 slack
提供程序。 事件严重性设置为 info
,这将允许在所有事件上触发警报,例如创建或应用 Kubernetes 清单、延迟部署或发生错误。 要仅报告错误,您可以指定 error
。 生成的 YAML 被导出到一个名为 slack-alert.yaml
的文件中。
通过运行提交更改:
git add . && git commit -m "Added Slack alerts"
通过运行以下命令将更改推送到远程存储库,如果需要,输入您的 GitHub 用户名和个人访问令牌:
git push
在为 Git 存储库配置的刷新间隔过去后,Flux 将检索并应用更改。 您可以通过运行以下命令来查看警报变为可用:
watch kubectl -n flux-system get alert
您很快就会看到它是 Initialized
:
OutputNAME READY STATUS AGE slack-alert True Initialized 7s
现在设置了警报,Flux 采取的任何操作都将记录在 webhook 连接到的工作区的 Slack 通道中。
您将通过对 podinfo
的分支进行更改来测试此连接。 首先,通过运行以下命令将其克隆到本地计算机:
git clone https://github.com/$GITHUB_USER/podinfo.git ~/podinfo
导航到克隆的存储库:
cd ~/podinfo
您将修改其服务的名称,该名称在 ~/podinfo/kustomize/service.yaml
中定义。 打开它进行编辑:
nano ~/podinfo/kustomize/service.yaml
修改服务名称,如下所示:
~/podinfo/kustomize/service.yaml
apiVersion: v1 kind: Service metadata: name: podinfo-1 spec: type: ClusterIP selector: app: podinfo ports: - name: http port: 9898 protocol: TCP targetPort: http - port: 9999 targetPort: grpc protocol: TCP name: grpc
保存并关闭文件,然后通过运行提交更改:
git add . && git commit -m "Service name modified"
然后,推送更改:
git push
几分钟后,您会在部署时看到更改在 Slack 中弹出:
Flux 获取了新的提交,创建了一个名为 podinfo-1
的新服务,对其进行了配置,然后删除了旧的。 如果新服务的配置失败,此操作顺序可确保旧服务(或任何其他清单)保持不变。
如果被监视的清单的新版本包含语法错误,Flux 将报告错误:
您已将 Flux 连接到您的 Slack 工作区,并且会立即收到所有发生的操作和部署的通知。 您现在将设置 Flux 以监视 Helm 版本。
第 4 步——(可选)自动化 Helm 发布部署
除了监视 Kustomizations 和 Git 存储库,Flux 还可以监视 Helm 图表。 Flux 可以监控位于 Git 或 Helm 存储库以及 S3 云存储中的图表。 您现在将设置它以监视位于 Helm 存储库中的 podinfo
图表。
指示 Flux 监控 Helm 图表的过程与您在步骤 2 中所做的类似。 您首先需要定义一个可以轮询更改的源(前面提到的三种类型之一)。 然后,您将通过创建 HelmRelease 来指定要在它找到的图表中实际部署的图表。
导航回 flux-config
存储库:
cd ~/flux-config
运行以下命令为包含 podinfo
的 Helm 存储库创建一个源:
flux create source helm podinfo \ --url=https://stefanprodan.github.io/podinfo \ --interval=10m \ --export > ./clusters/my-cluster/podinfo-helm-repo.yaml
在这里,您指定存储库的 URL 以及应多久检查一次。 然后,将输出保存到一个名为 podinfo-helm-repo.yaml
的文件中。
现在定义了源存储库,您可以创建 HelmRelease,定义要监控的图表:
flux create hr podinfo \ --interval=10m \ --source=HelmRepository/podinfo \ --chart=podinfo \ --target-namespace=podinfo-helm \ --export > ./clusters/my-cluster/podinfo-helm-chart.yaml
与前面的命令一样,您将生成的 YAML 输出保存到一个文件中,这里称为 podinfo-helm-chart.yaml
。 您还传入图表的名称 (podinfo
),将 --source
设置为您刚刚定义的存储库,并指定图表将安装到的命名空间是 [ X177X]。
由于 podinfo-helm
命名空间不存在,通过运行创建它:
kubectl create namespace podinfo-helm
然后,提交并推送更改:
git add . && git commit -m "Added podinfo Helm chart" && git push
几分钟后,您会看到 Flux 在 Slack 中记录了成功的 Helm 图表升级:
您可以通过运行以下命令检查 podinfo-helm
命名空间中包含的 pod:
kubectl get pods -n podinfo-helm
输出将与此类似:
OutputNAME READY STATUS RESTARTS AGE podinfo-chart-podinfo-7c9b7667cb-gshkb 1/1 Running 0 33s
这意味着您已成功配置 Flux 以监控和部署 podinfo
Helm 图表。 一旦发布了新版本,或者推送了修改,Flux 就会为您检索和部署 Helm 图表的最新变体。
结论
您现在已经使用 Flux 自动化了 Kubernetes 清单部署,它允许您将提交推送到监视的存储库并将它们自动应用于您的集群。 您还为 Slack 设置了警报,因此您将始终实时了解正在发生的部署,并且您可以查找以前的部署并查看可能发生的任何错误。
除了 GitHub,Flux 还支持检索和引导托管在 GitLab 上的 Git 存储库。 您可以访问官方文档了解更多。