作者选择了 自由和开源基金作为 写给捐款计划的一部分接受捐款。
介绍
虽然这些概念在较小的项目中通常不普遍使用,但大型团队广泛托管和更新部署的团队发现设置此类流程更容易,以减轻手动耗时的任务,而是专注于开发正在部署的软件。
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。
启用流程应用
的 webhooks 按下标题旁边的开关按钮 启用入口 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
的警报宣言,它会对所有Customization
和Git 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 中的更改在部署时出现:
流收取了新的委托,创建了一个名为podinfo-1
的新服务,配置了它,并删除了旧的服务。
如果观看的宣言的新修订包含语法错误,则 Flux 会报告一个错误:
您已将 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图表升级:
您可以通过运行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存储库的检索和启动。