如何在 DigitalOcean Kubernetes 上使用 Flux 建立持续交付管道

作者选择了 自由和开源基金作为 写给捐款计划的一部分接受捐款。

介绍

虽然这些概念在较小的项目中通常不普遍使用,但大型团队广泛托管和更新部署的团队发现设置此类流程更容易,以减轻手动耗时的任务,而是专注于开发正在部署的软件。

GitOps将 Git 存储库视为应用程序的主机,而 Kubernetes 作为部署的核心真理来源。它允许使用存储库分开的部署环境,使您能够在任何集群上快速复制任何配置状态,无论是当前还是过去,并且通过 Git 版本化使回归变得微不足道。 显示是安全、同步和随时易于访问的。 根据外部因素(通常是连续集成系统)可以审核、允许或拒绝对示例或应用程序的更改。 将过程从推动代码到部署到集群自动化,可以大大提高生产力和提高开发人员的体验,同时使部署始终符合中央代码库。

Flux是一个开源工具,可为Kubernetes提供GitOps连续交付方法。Flux允许自动应用和配置部署到您的集群,通过监控配置的Git存储库并自动应用变更,一旦它们变得可用。它可以应用Customize示例(提供一种轻松的方式,可选地修补通常的Kubernetes示例的部分),以及监控Helm图表发布。您还可以配置它通过Slack,Discord,Microsoft Teams或支持Webhooks的任何其他服务进行通知。Webhooks提供一种方式,通知应用程序或服务发生在其他地方的事件,并提供其描述。

在本教程中,您将安装Flux,并使用它来为 podinfo应用程序设置连续交付到您的 DigitalOcean Kubernetes群集)。 'podinfo' 是一个提供其运行环境的详细信息的应用程序。 您将在您的 GitHub帐户中托管持有Flux配置的存储库。 您将设置Flux来监控应用程序存储库,自动应用更改,并使用Webhooks通知您Slack。

前提条件

要完成本教程,您将需要:

要了解如何在 DigitalOcean 上创建一个 Kubernetes 群集,请参阅 Kubernetes Quickstart。 A GitHub account with a Personal Access Token (PAT) created with all privileges. 要了解如何创建一个工作空间,请访问 [官方文件] (https://slack.com/help/articles/206845317-Create-a-Slack-workspace on DigitalOcean)。 A GitHub account with a Personal Access Token (PAT) created with all privileges. 要了解如何创建一个工作空间,请参阅 官方文件

步骤 1 – 安装和启动流程

在此步骤中,您将在本地机器上设置Flux,将其安装到您的集群中,并设置一个专用的Git存储库来存储和版本化其配置。

在 Linux 上,您可以使用官方的 Bash 脚本来安装 Flux. 如果您在 MacOS 上,您可以使用官方脚本,按照与 Linux 相同的步骤,或使用 Homebrew来安装 Flux 使用以下命令:

1brew install fluxcd/tap/flux

要使用官方提供的脚本安装 Flux,请通过运行以下命令下载它:

1curl https://fluxcd.io/install.sh -so flux-install.sh

您可以检查flux-install.sh脚本,通过运行此命令来验证它是否安全:

1less ./flux-install.sh

要运行它,您必须将其标记为可执行:

1chmod +x flux-install.sh

然后,运行脚本来安装 Flux:

1./flux-install.sh

您将看到以下输出,详细说明正在安装哪个版本:

1[secondary_label Output]
2[INFO]  Downloading metadata https://api.github.com/repos/fluxcd/flux2/releases/latest
3[INFO]  Using 0.13.4 as release
4[INFO]  Downloading hash https://github.com/fluxcd/flux2/releases/download/v0.13.4/flux_0.13.4_checksums.txt
5[INFO]  Downloading binary https://github.com/fluxcd/flux2/releases/download/v0.13.4/flux_0.13.4_linux_amd64.tar.gz
6[INFO]  Verifying binary download
7[INFO]  Installing flux to /usr/local/bin/flux

要启用命令自动完成,运行以下命令来配置壳:

1echo ". <(flux completion bash)" >> ~/.bashrc

若要更改生效,请通过运行以下方式重新加载 `~/.bashrc:

1. ~/.bashrc

您现在可以在本地机器上使用 Flux。在将其安装到您的集群之前,您首先需要运行验证兼容性的先决条件检查:

1flux check --pre

Flux 将连接到您在前提条件中已设置连接的群集,您将看到类似的输出:

1[secondary_label Output]
2► checking prerequisites
3✔ kubectl 1.21.1 >=1.18.0-0
4✔ Kubernetes 1.20.2 >=1.16.0-0
5✔ prerequisites checks passed

<$>[注] 注: 如果您看到错误或警告,请双重检查您连接的集群,您可能需要进行升级才能使用Flux。

在启动过程中,Flux在指定的提供商上创建一个Git存储库,并以默认配置初始化。 要做到这一点,需要您的GitHub用户名和个人访问代码,您已在前提条件中获取。

您将将您的 GitHub 用户名和个人访问令牌存储为环境变量,以避免多次键入它们。

1export GITHUB_USER=your_username
2export GITHUB_TOKEN=your_personal_access_token

您现在可以启动Flux并通过运行来安装到您的集群中:

1flux bootstrap github \
2  --owner=$GITHUB_USER \
3  --repository=flux-config \
4  --branch=main \
5  --path=./clusters/my-cluster \
6  --personal

在此命令中,您指定该存储库在提供商github中称为flux-config,该存储库由您刚刚定义的用户拥有。

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

 1[secondary_label Output]
 2► connecting to github.com
 3► cloning branch "main" from Git repository "https://github.com/GITHUB_USER/flux-config.git"
 4✔ cloned repository
 5► generating component manifests
 6✔ generated component manifests
 7✔ committed sync manifests to "main" ("b750ffae686c2f110364694d2ddae26c7f18c6a2")
 8► pushing component manifests to "https://github.com/GITHUB_USER/flux-config.git"
 9► installing components in "flux-system" namespace
10✔ installed components
11✔ reconciled components
12► determining if source secret "flux-system/flux-system" exists
13► generating source secret
14✔ public key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDKw943TnUiKLVk4WMLC5YCeC+tIPVvJprQxTfLqcwkHtedMJPanJFifmbQ/M3CAq1IgqyQTydRJSJu6E/4YDOwx1vawStR9XU16rkn+rZbmvRxZ97E0HNb5m54OwmziAWf0EPdsfiIIJYSRkCMihpKJUNoakl+sng6LQsW+WIRlOK39aJRWud+rygQEuEKmD7YHKQ0VSb/L5v50jiPgEZImiREHNfjBU+RkEni3aZuOO3jNy5WdlPkpdqfHe8fdFsjJnvNB0zmfe3eTIB2fbdDzxo2usLbFeAMhGCRYsGnniHsytBHNLmxDM/4I18xlNN9e6WEYpgHEJVb8azKmwSX
15✔ configured deploy key "flux-system-main-flux-system-./clusters/my-cluster" for "https://github.com/GITHUB_USER/flux-config"
16► applying source secret "flux-system/flux-system"
17✔ reconciled source secret
18► generating sync manifests
19✔ generated sync manifests
20✔ committed sync manifests to "main" ("1dc033e24f3288a70ff80c57816e16c52bc62303")
21► pushing sync manifests to "https://github.com/GITHUB_USER/flux-config.git"
22► applying sync manifests
23✔ reconciled sync configuration
24◎ waiting for Kustomization "flux-system/flux-system" to be reconciled
25✔ Kustomization reconciled successfully
26► confirming components are healthy
27✔ source-controller: deployment ready
28✔ kustomize-controller: deployment ready
29✔ helm-controller: deployment ready
30✔ notification-controller: deployment ready
31✔ all components are healthy

Flux 指出,它创建了一个新的Git 存储库,对其进行了基本的启动配置,并在您的集群中提供了必要的控制器。

在此步骤中,您已在本地机器上安装了 Flux,创建了一个新的Git 存储库,以保留其配置,并将其服务器侧组件部署到您的集群中。

步骤 2 – 配置自动部署

在本节中,您将配置流程来监控您已构造的podinfo存储库,并在它们可用时将更改应用到您的集群中。

除了创建存储库和初始配置外,Flux还提供命令,以帮助您更快地生成配置示例,而不是从头开始编写它们。不论它们定义了什么,示例必须在其Git存储库中可用,以便考虑。

1git clone https://github.com/$GITHUB_USER/flux-config ~/flux-config

您可能会被要求提供您的用户名和密码。输入您的帐户用户名并为该密码提供您的个人访问代码。

然后,导航到它:

1cd ~/flux-config

要指示流程监控podinfo存储库,您首先需要让它知道它的位置,这是通过创建一个 GitRepository 宣言来实现的,其中详细介绍了存储库的 URL、分支和监控间隔。

要创建示意图,请运行以下命令:

1flux create source git podinfo \
2  --url=https://github.com/$GITHUB_USER/podinfo \
3  --branch=master \
4  --interval=30s \
5  --export > ./clusters/my-cluster/podinfo-source.yaml

在這裡,您指定來源將是一個「Git 儲存庫」與所提供的 URL 和分支部位. 您輸入「--export」來輸出生成的宣言,並將其輸入到「podinfo-source.yaml」中,位於主 config 儲存庫的「./clusters/my-cluster/」下,儲存現行集群的宣言。

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

1cat ./clusters/my-cluster/podinfo-source.yaml

结果将看起来像这样:

 1[label ~/flux-config/clusters/my-cluster/podinfo-source.yaml]
 2---
 3apiVersion: source.toolkit.fluxcd.io/v1beta1
 4kind: GitRepository
 5metadata:
 6  name: podinfo
 7  namespace: flux-system
 8spec:
 9  interval: 30s
10  ref:
11    branch: master
12  url: https://github.com/GITHUB_USER/podinfo

您可以检查您刚刚传输到 Flux 的参数是否正确地列出在生成的宣言中。

现在你已经定义了一个源Git 存储库,Flux 可以访问,但你仍然需要告诉它要部署什么。Flux 支持 Customize]资源,而podinfo 将其暴露在customize目录下。通过支持Customizations,Flux 不会限制自己,因为Customize 宣言可以简单地包括所有常见的宣言不变。

创建一个自定义宣言,该宣言告诉流在哪里寻找可部署的宣言,运行以下命令:

1flux create kustomization podinfo \
2  --source=podinfo \
3  --path="./kustomize" \
4  --prune=true \
5  --validation=client \
6  --interval=5m \
7  --export > ./clusters/my-cluster/podinfo-kustomization.yaml

对于--source,你指定你刚刚创建的podinfo Git 存储库。你还将--path设置为./kustomize,指的是源存储库的文件系统结构。

您创建的Git 存储库自定义现在可用,但Flux 的集群侧仍然看不到它们,因为它们不在 GitHub 的远程存储库中。

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

有了现在所做的更改,将它们推到远程存储库:

1git push

与上次一样,git可能会要求您提供您的身份证件. 输入您的用户名和个人访问代码以继续。

新的宣言现在是活跃的,集群侧Flux很快就会收集它们,你可以观看它通过运行来同步集群的状态与在宣言中呈现的状态:

1watch flux get kustomizations

在指定为Git 存储库的更新间隔过后(您在上面的示例中已设置为30s),Flux 将检索其最新的委托并更新集群。

1[secondary_label Output]
2NAME READY MESSAGE
3flux-system True Applied revision: main/fc07af652d3168be329539b30a4c3943a7d12dd8
4podinfo True Applied revision: master/855f7724be13f6146f61a893851522837ad5b634

您可以看到podinfo自定义应用,以及其分支和 commit hash. 您可以列出部署和服务,也可以检查podinfo是否部署:

1kubectl get deployments,services

您将看到它们是存在的,根据各自的宣言配置:

1[secondary_label Output]
2NAME READY UP-TO-DATE AVAILABLE AGE
3deployment.apps/podinfo 2/2 2 2 56s
4
5NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)             AGE
6service/kubernetes ClusterIP 10.245.0.1      <none>        443/TCP 34m
7service/podinfo ClusterIP 10.245.78.189   <none>        9898/TCP,9999/TCP 56s

您手动对这些和其他流量控制的资源所做的任何更改都会很快被从 Git 存储库中引用的资源重写。 要进行更改,您需要更改中心源,而不是集群中的实际部署。

Flux 的行为是故意僵硬的,因为它在每个更新间隔结束时在远程存储库中找到的内容上运行。

您可以通过运行以下方式无限期停止对自定义的监控:

1flux suspend kustomization kustomization_name

默认行为可以通过在暂停的自定义上运行流程简历来恢复:

1flux resume kustomization kustomization_name

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

步骤 3 – 设置 Slack 通知

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

要与 Slack 集成,您需要在 Slack 上为您的工作空间提供一个入口 Webhook. 入口 Webhooks 是向配置的 Slack 频道发布消息的一种方式。

如果您从未创建过 Webhook,那么您首先需要为工作区创建一个应用程序。 要做到这一点,先登录 Slack 并导航到 应用创建页面. 点击绿色 创建新应用程序按钮,然后选择 从头开始

您将被重定向到新应用程序的设置页面. 点击左导航栏的 Incoming Webhooks

Slack app - Incoming Webhooks

启用流程应用的 webhooks 按下标题旁边的开关按钮 启用入口 Webhooks

Slack app - Activate Incoming Webhooks

页面下方会发现一个新的部分。滚向下,点击 新 Webhook 添加到 Workspace ** 按钮. 下一页,选择要发送报告的渠道,然后点击 ** 允许

您将被重定向回webhooks的设置页面,您将看到在表中列出的新的webhook。

您将为您的应用程序存储生成的 Slack Webhook 在您的集群中的 Kubernetes Secret中,这样Flux 就可以访问它而不会在其配置示例中明确指定它。

通过运行以下命令创建一个名为slack-url的秘密,用你刚刚复制的 URL 代替your_slack_webhook:

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

产量将是:

1[secondary_label Output]
2secret/slack-url created

您现在将创建一个提供商,允许Flux使用webhooks与指定的服务交谈,他们会从Secrets读取webhook URL,这就是为什么您刚刚创建了一个。

1flux create alert-provider slack \
2  --type slack \
3  --channel general \
4  --secret-ref slack-url \
5  --export > ./clusters/my-cluster/slack-alert-provider.yaml

除了 Slack 之外,Flux 还支持通过 webhooks 与 Microsoft Teams、Discord 和其他平台进行通信,还支持发送通用 JSON来容纳更多解析此格式的软件。

提供商只允许流程发送消息,而不指定何时发送消息。

1flux create alert slack-alert \
2  --event-severity info \
3  --event-source Kustomization/* \
4  --event-source GitRepository/* \
5  --provider-ref slack \
6  --export > ./clusters/my-cluster/slack-alert.yaml

此命令会创建一个名为slack-alert的警报宣言,它会对所有CustomizationGit repository的变化做出反应,并将其报告给slack提供商。事件严重性设置为info,这将允许在所有事件中触发警报,例如创建或应用Kubernetes宣言,延迟部署或出现错误。 若要仅报告错误,您可以指定错误。 结果生成的YAML被导出到名为slack-alert.yaml的文件中。

通过运行执行变更:

1git add . && git commit -m "Added Slack alerts"

将更改推到远程存储库,运行以下命令,如有需要,输入您的 GitHub 用户名和个人访问令牌:

1git push

在 Git 存储库配置的更新间隔过后,Flux 会检索并应用这些更改。

1watch kubectl -n flux-system get alert

你很快就会看到它是初始化:

1[secondary_label Output]
2NAME READY STATUS AGE
3slack-alert True Initialized 7s

现在设置了警告,Flux 所采取的任何操作都将记录在 Webhook 连接到的工作区的 Slack 频道中。

您将通过对您的podinfo叉子进行更改来测试此连接。

1git clone https://github.com/$GITHUB_USER/podinfo.git ~/podinfo

导航到克隆存储库:

1cd ~/podinfo

您将更改其服务的名称,该名称在 ~/podinfo/kustomize/service.yaml 中定义。

1nano ~/podinfo/kustomize/service.yaml

更改服务名称,如下:

 1[label ~/podinfo/kustomize/service.yaml]
 2apiVersion: v1
 3kind: Service
 4metadata:
 5  name: podinfo-1
 6spec:
 7  type: ClusterIP
 8  selector:
 9    app: podinfo
10  ports:
11    - name: http
12      port: 9898
13      protocol: TCP
14      targetPort: http
15    - port: 9999
16      targetPort: grpc
17      protocol: TCP
18      name: grpc

保存并关闭文件,然后通过运行执行更改:

1git add . && git commit -m "Service name modified"

然后,按一下变化:

1git push

几分钟后,您将看到 Slack 中的更改在部署时出现:

Slack - Flux reported changes

流收取了新的委托,创建了一个名为podinfo-1的新服务,配置了它,并删除了旧的服务。

如果观看的宣言的新修订包含语法错误,则 Flux 会报告一个错误:

Slack - Flux reported failed deployment

您已将 Flux 连接到 Slack 工作区,并将立即通知发生的所有操作和部署。

步骤 4 — (可选) 自动化头盔释放部署

除了监控自定义和Git存储库之外,Flux还可以监控Helm图表。Flux还可以监控Git或Helm存储库以及S3云存储库中的图表。

指示 Flux 监控 Helm 图表的过程类似于您在步骤 2 中所做的,您首先需要定义一个可以对更改进行调查的源(前面提到的三种类型之一)。

返回flux-config存储库:

1cd ~/flux-config

运行以下命令来创建包含podinfo的 Helm 存储库的源:

1flux create source helm podinfo \
2  --url=https://stefanprodan.github.io/podinfo \
3  --interval=10m \
4  --export > ./clusters/my-cluster/podinfo-helm-repo.yaml

在这里,您指定了存储库的URL,以及应该检查的频率,然后将输出保存到名为podinfo-helm-repo.yaml的文件中。

有了现在定义的源存储库,您可以创建一个HelmRelease,定义要监控的图表:

1flux create hr podinfo \
2  --interval=10m \
3  --source=HelmRepository/podinfo \
4  --chart=podinfo \
5  --target-namespace=podinfo-helm \
6  --export > ./clusters/my-cluster/podinfo-helm-chart.yaml

与上一个命令一样,你将结果的YAML输出保存到一个名为podinfo-helm-chart.yaml的文件中,你还会输入图表的名称(podinfo),将--source设置为你刚刚定义的存储库,并指定图表将安装的名称空间为podinfo-helm

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

1kubectl create namespace podinfo-helm

然後,承諾並推動變化:

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

几分钟后,你会看到Flux在Slack中登录了成功的Helm图表升级:

Slack - Flux logged successful chart install

您可以通过运行podinfo-helm名称空间中包含的 pods 来检查:

1kubectl get pods -n podinfo-helm

结果将类似于此:

1[secondary_label Output]
2NAME READY STATUS RESTARTS AGE
3podinfo-chart-podinfo-7c9b7667cb-gshkb 1/1 Running 0 33s

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

结论

您现在使用 Flux 自动化了 Kubernetes 显式部署,这允许您将承诺推到观看的存储库,并将其自动应用到您的集群中。

除了GitHub之外,Flux还支持在GitLab上托管的Git存储库的检索和启动。

Published At
Categories with 技术
comments powered by Disqus