如何在 DigitalOcean Kubernetes 上使用 Flux 设置持续交付管道

作为Write for DOnations计划的一部分,作者选择了免费和开源基金来接受捐赠

介绍

就其本身而言,Kubernetes不提供持续集成和部署功能。虽然这些概念在较小的项目中通常并不普遍,但托管和更新部署的大型团队发现设置此类流程要容易得多,以减少手动耗时的任务,而是专注于开发正在部署的软件。维护 Kubernetes 持续交付的一种方法是GitOps

GitOps将托管应用程序的 Git 存储库和 Kubernetes 清单视为有关部署的中心事实来源。它允许通过使用存储库分支来实现分离的部署环境,使您能够在任何集群上快速重现当前或过去的任何配置状态,并且由于 Git 版本控制使回滚变得微不足道。清单始终安全、同步且易于访问。可以根据外部因素(通常是持续集成系统)审核、允许或拒绝对清单或应用程序的修改。自动化从推送代码到将其部署在集群上的过程可以大大提高生产力并增强开发人员体验,同时使部署始终与中央代码库保持一致。

Flux是一种开源工具,可促进 Kubernetes 的 GitOps 持续交付方法。Flux 允许通过监控配置的 Git 存储库并在更改可用时自动应用更改来自动将应用程序和配置部署到您的集群。它可以应用Kustomize清单(它提供了一种简单的方法来选择性地动态修补常用 Kubernetes 清单的部分),以及监视 Helm 图表发布。您还可以将其配置为通过 Slack、Discord、Microsoft Teams 或任何其他支持 Webhook 的服务来接收通知。Webhooks 提供了一种通知应用程序或服务发生在其他地方的事件并提供其描述的方法。

在本教程中,您将安装 Flux 并使用它为podinfo应用程序设置持续交付到您的 DigitalOcean Kubernetes 集群。podinfo是一个应用程序,提供有关其运行环境的详细信息。您将podinfoGitHub帐户托管包含Flux 配置的存储库您将设置 Flux 来监视应用程序存储库,自动应用更改,并使用 webhook 在 Slack 上通知您。最后,您对受监控存储库所做的所有更改都将迅速传播到您的集群。

先决条件

要完成本教程,您需要:

  • 一个 DigitalOcean Kubernetes 集群,您的连接配置被配置为kubectl默认值。创建集群时,有关如何配置的说明kubectl显示在“连接到集群”步骤下。要了解如何在 DigitalOcean 上创建 Kubernetes 集群,请参阅Kubernetes 快速入门
  • 您所属的 Slack 工作区。要了解如何创建工作区,请访问官方文档
  • 带有个人访问令牌 (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

在此命令中,您指定应flux-config在 provider 处调用存储库,该存储库github由您刚刚定义的用户拥有。新存储库将是个人的(不在组织之下),并且默认情况下将设为私有。

您将看到的输出与此类似:

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

在这里,您指定源将是Git repository具有给定 URL 和分支的 。您传入--export以输出生成的清单并将其通过管道传输到podinfo-source.yaml位于./clusters/my-cluster/主配置存储库下的 ,其中存储了当前集群的清单。

您可以通过运行来显示生成文件的内容:

  • 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 的参数是否在生成的清单中正确布局。

您现在已经定义了Git repositoryFlux 可以访问的源,但您仍然需要告诉它要部署什么。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 repositoryKustomization您创建是现在可用,但通量集群端还无法看到他们,因为他们在GitHub上的远程存储库不是。要推送它们,您必须首先通过运行来提交它们:

  • git add . && git commit -m "podinfo added"

现在提交更改后,将它们推送到远程存储库:

  • git push

与上次相同,git可能会要求您提供凭据。输入您的用户名和您的个人访问令牌以继续。

新的清单现已上线,集群端 Flux 将很快接收它们。您可以通过运行以下命令来观察它将集群的状态与清单中显示的状态同步:

  • watch flux get kustomizations

在为Git repository经过指定的刷新间隔(您30s在上面的清单中设置)之后,Flux 将检索其最新提交并更新集群。完成后,您将看到类似于以下内容的输出:

Output
NAME READY MESSAGE flux-system True Applied revision: main/fc07af652d3168be329539b30a4c3943a7d12dd8 podinfo True Applied revision: master/855f7724be13f6146f61a893851522837ad5b634

您可以看到podinfo应用Kustomization,以及它的分支和提交哈希。您还可以列出部署和服务以检查podinfo已部署:

  • kubectl get deployments,services

您会看到它们存在,并根据它们各自的清单进行配置:

Output
NAME 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

可以通过flux resume在 paused 上运行来恢复默认行为Kustomization

  • flux resume kustomization kustomization_name

您现在拥有一个自动化流程,podinfo每次发生更改时都会部署到您的集群。您现在将设置 Slack 通知,以便您知道何时podinfo部署了新版本

第 3 步 – 设置 Slack 通知

现在您已经podinfo为集群设置了自动部署,您将把 Flux 连接到一个 Slack 频道,在那里您将收到关于每个部署及其结果的通知。

要与 Slack 集成,您需要在 Slack 上为您的工作区设置一个传入的 webhook。传入的 webhook 是一种将消息发布到配置的 Slack 通道的方式。

如果您从未创建过 webhook,则首先需要为您的工作区创建一个应用程序。为此,首先登录 Slack 并导航到应用程序创建页面按绿色的“创建新应用程序”按钮并选择“从头开始”将其命名为flux-app,选择所需的工作区,然后单击Create New App

您将被重定向到新应用的设置页面。单击左侧导航栏上的传入 Webhook

Slack 应用程序 - 传入的 Webhooks

启用网络挂接flux-app通过翻转标题旁的开关按键激活传入网络挂接

Slack 应用程序 - 激活传入的 Webhooks

页面下方的新部分将被发现。向下滚动并单击将新 Webhook 添加到工作区按钮。在下一页上,选择要将报告发送到的频道,然后单击允许

您将被重定向回 webhook 的设置页面,并且您会看到表中列出了一个新的 webhook。单击“复制”将其复制到剪贴板并记下以备后用。

您将为您的应用程序生成的 Slack webhook 存储在集群中的 Kubernetes Secret中,以便 Flux 可以访问它,而无需在其配置清单中明确指定它。将 webhook 存储为 Secret 还可以让您在将来轻松替换它。

slack-url通过运行以下命令创建一个包含 webhook的 Secret ,替换your_slack_webhook为您刚刚复制的 URL:

  • kubectl -n flux-system create secret generic slack-url --from-literal=address=your_slack_webhook

输出将是:

Output
secret/slack-url created

您现在将创建一个 Provider,它允许 Flux 使用 webhooks 与指定的服务对话。他们从 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 还支持通过 webhooks 与 Microsoft Teams、Discord 和其他平台进行通信。它还支持发送通用JSON以容纳更多解析此格式的软件。

Provider 只允许 Flux 发送消息,并没有指定何时应该发送消息。为了让 Flux 对事件做出反应,您需要使用slackProvider 通过运行以下命令来创建警报

  • 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,该清单将对所有KustomizationGit 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

Output
NAME 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 中的更改在部署时弹出:

Slack - Flux 报告的变化

Flux 获取了新的提交,创建了一个名为 的新服务podinfo-1,配置了它,然后删除了旧的。如果新服务的供应失败,则此操作顺序可确保旧服务(或任何其他清单)保持不变。

如果监视清单的新版本包含语法错误,Flux 将报告错误:

Slack - Flux 报告部署失败

你已经将 Flux 连接到你的 Slack 工作区,并且会立即收到所有发生的操作和部署的通知。您现在将设置 Flux 以监视 Helm 版本。

第 4 步——(可选)自动化 Helm 发布部署

除了监视 Kustomizations 和 Git 存储库,Flux 还可以监视 Helm 图表。Flux 可以监控位于 Git 或 Helm 存储库以及 S3 云存储中的图表。您现在将设置它以监视podinfo位于 Helm 存储库中图表。

指示 Flux 监视 Helm 图表的过程与您在第 2 步中所做的类似。您首先需要定义一个可以轮询更改的源(前面提到的三种类型之一)。然后,您将通过创建HelmRelease来指定在它找到的图表中实际部署哪个图表

导航回flux-config存储库:

  • cd ~/flux-config

运行以下命令为 Helm 存储库创建一个源,其中包含podinfo

  • 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您刚刚定义的存储库,并指定图表将安装到的命名空间是podinfo-helm

由于podinfo-helm命名空间不存在,请通过运行创建它:

  • kubectl create namespace podinfo-helm

然后,提交并推送更改:

  • git add . && git commit -m "Added podinfo Helm chart" && git push

几分钟后,您将看到 Flux 在 Slack 中记录了成功的 Helm 图表升级:

Slack - Flux 记录成功的图表安装

您可以podinfo-helm通过运行以下命令来检查命名空间中包含的 pod

  • kubectl get pods -n podinfo-helm

输出将类似于:

Output
NAME READY STATUS RESTARTS AGE podinfo-chart-podinfo-7c9b7667cb-gshkb 1/1 Running 0 33s

这意味着您已成功配置 Flux 来监控和部署podinfoHelm 图表。一旦发布了新版本或推送了修改,Flux 将为您检索和部署 Helm 图表的最新变体。

结论

您现在已经使用 Flux 自动化了 Kubernetes 清单部署,这允许您将提交推送到监视的存储库并让它们自动应用于您的集群。您还为 Slack 设置了警报,因此您将始终实时了解正在发生的部署,并且您可以查看以前的部署并查看可能发生的任何错误。

除了 GitHub,Flux 还支持检索和引导 GitLab 托管的 Git 存储库。您可以访问官方文档以了解更多信息。

觉得文章有用?

点个广告表达一下你的爱意吧 !😁