作为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
是一个应用程序,提供有关其运行环境的详细信息。您将podinfo
在GitHub帐户上托管包含Flux 配置的存储库。您将设置 Flux 来监视应用程序存储库,自动应用更改,并使用 webhook 在 Slack 上通知您。最后,您对受监控存储库所做的所有更改都将迅速传播到您的集群。
先决条件
要完成本教程,您需要:
- 一个 DigitalOcean Kubernetes 集群,您的连接配置被配置为
kubectl
默认值。创建集群时,有关如何配置的说明kubectl
显示在“连接到集群”步骤下。要了解如何在 DigitalOcean 上创建 Kubernetes 集群,请参阅Kubernetes 快速入门。 - 您所属的 Slack 工作区。要了解如何创建工作区,请访问官方文档。
-
带有个人访问令牌 (PAT) 的 GitHub 帐户,创建时具有所有权限。要了解如何创建一个,请访问官方文档。
-
Git 已在您的本地计算机上进行初始化和设置。要开始使用 Git 并查看安装说明,请访问如何为开源做贡献:Git 入门教程。
第 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
输出将类似于以下内容:
---
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 repository
Flux 可以访问的源,但您仍然需要告诉它要部署什么。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
您创建是现在可用,但通量集群端还无法看到他们,因为他们在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
可以通过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。
启用网络挂接flux-app
通过翻转标题旁的开关按键激活传入网络挂接。
页面下方的新部分将被发现。向下滚动并单击将新 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
输出将是:
Outputsecret/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 对事件做出反应,您需要使用slack
Provider 通过运行以下命令来创建警报:
- 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
修改服务名称,如下所示:
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 云存储中的图表。您现在将设置它以监视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 图表升级:
您可以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 存储库。您可以访问官方文档以了解更多信息。