5.flux实践
实践
在本部分中,您将使用 YAML 文件以声明方式将 2048 游戏应用程序部署到您的集群。 您可以使用此方法将所有 Kubernetes 部署文件模板化为 Git,使其成为 Kubernetes 环境中所有内容的来源。 使用此方法,您可以轻松回滚和更新 Kubernetes 配置文件。
为清单创建存储库
第一步是创建一个 Git repo 来托管您的 Kubernetes 部署清单和 FluxCD 清单。 为此,请运行以下命令:
# create directory ~/2048
mkdir -p 2048/apps
# Switch to the ~/2048 directory and initialize a local Git repository.
cd ~/2048 && git init
接下来,运行下面的 gh repo 命令来创建一个公共 GitHub 存储库 (2048)。 此存储库将包含 2048 游戏部署清单
gh repo create 2048 --public
您现在已经创建了一个 Git 存储库。 下一步是添加 Kubernetes 部署清单和 Flux 清单。
现在,你必须进入应用程序目录:
cd apps/
在您的 app/ 目录中创建 2048.yaml 并添加以下配置:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: 2048-game
name: 2048-game
spec:
replicas: 2
selector:
matchLabels:
app: 2048-game
strategy: {}
template:
metadata:
labels:
app: 2048-game
spec:
containers:
- image: alexwhen/docker-2048
name: 2048-game
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: game-service
labels:
app: game-service
spec:
ports:
- name: 2048-game
port: 80
selector:
app: 2048-game
这个 YAML 文件定义了 Kubernetes 集群中的 Deployment 和 Service 资源。
创建一个 source
下一步是为 Flux 配置创建清单以部署 2048 游戏应用程序。 在 root 文件夹中,创建一个名为 flux.yaml 的文件并添加以下配置。
## change directory to the root folder (2048)
cd ..
apiVersion: source.toolkit.fluxcd.io/v1beta2
kind: GitRepository
metadata:
name: 2048-game
namespace: flux-system
spec:
interval: 1m
url: https://github.com/segunjkf/2048
ref:
branch: main
让我们仔细看看上面配置中的字段:
ApiVersion:source.toolkit.fluxcd.io/v1beta2 表示 GitRepository 资源的 API 版本。
Kind:GitRepository 指定这是一个 GitRepository 资源。
Name: 2048-game 和 namespace: flux-system 是元数据字段,分别指定 GitRepository 资源的名称和应该在其中创建 GitRepository 资源的命名空间。
Interval:1m 将 GitRepository 资源设置为每 1 分钟更新一次。
Url https://github.com/segunjkf/2048 指定包含 2048 游戏部署清单的 GitHub 存储库的 URL。 请确保将其更改为您创建的 GitHub 存储库的 URL。
Branch: main 指定用于 GitRepository 资源的分支。
apiVersion: kustomize.toolkit.fluxcd.io/v1beta2
kind: Kustomization
metadata:
name: 2048-game
namespace: flux-system
spec:
interval: 5m0s
path: ./apps
prune: true
sourceRef:
kind: GitRepository
name: 2048-game
targetNamespace: 2048-game
ApiVersion:kustomize.toolkit.fluxcd.io/v1beta2 指定 Kustomization 资源的 API 版本。
Kind:Kustomization 表示这是一个 Kustomization 资源。
元数据指定资源的元数据,包括名称和命名空间。
其他规范包括设置间隔:5m0s 每 5 分钟更新一次 Kustomization 资源和路径:./apps 指定 Git 存储库中 Kubernetes 部署清单的路径。 在这种情况下,路径是“./apps”。
此时,flux.yaml 文件将如下所示:
apiVersion: source.toolkit.fluxcd.io/v1beta2
kind: GitRepository
metadata:
name: 2048-game
namespace: flux-system
spec:
interval: 1m
url: https://github.com/segunjkf/2048
ref:
branch: main
---
apiVersion: kustomize.toolkit.fluxcd.io/v1beta2
kind: Kustomization
metadata:
name: 2048-game
namespace: flux-system
spec:
interval: 5m0s
path: ./apps
prune: true
sourceRef:
kind: GitRepository
name: 2048-game
targetNamespace: 2048-game
现在暂存、提交并将这些文件推送到您的 Git 存储库。
cd ..
git add .
git commit -m "Automating Flux deployment"
git branch -M main
## Replace the URL below with the url of the Git Repository you created
git remote add origin https://github.com/segunjkf/2048.git
git push -u origin main
在应用 FluxCD 配置文件之前,您必须首先创建一个名为“2048-game”的命名空间。 这是将托管 2048 游戏的命名空间。 为此,请运行以下命令:
kubectl create namespace 2048-game
使用 Flux 部署应用程序
现在apply flux.yaml 文件以使用 Flux 部署您的应用程序:
kubectl apply -f flux.yaml
apply Flux 配置文件后,您需要验证 FluxCD 是否已部署您的应用程序。 为此,请运行以下命令:
kubectl get pods -n 2048-game
现在,运行以下 kubectl 命令将端口 8085 端口转发到端口 80,这是在容器中运行的 2048 游戏应用程序的 HTTP 端口。 这样您就可以通过 Web 浏览器访问 2048 游戏应用程序。
kubectl port-forward svc\2048-service -n 2048 8086:80
如下所示,2048 服务已配置并通过端口 80 侦听连接。
最后,打开您最喜欢的 Web 浏览器并导航到以下端点:
http://localhost:8086 (local) – 如果您在计算机上运行本地 Kubernetes 集群
演示 gitops
为了演示 FluxCD 的持续交付功能,您对 Git 存储库进行更改并验证 Flux 是否自动将更改应用到您的 Kubernetes 集群。
打开您的 Web 浏览器并导航到 https://github.com/segunjkf/2048/edit/main/apps/2048.yaml。 确保将 segunjkf 替换为您的 GitHub 用户名。
现在编辑 deployment 文件; 将副本从 2 更改为 3,保存并提交更改。
等待几分钟并确认 FluxCD 已将新更改应用到您的集群。 ✅
通知
每当资源状态发生变化时,Flux 控制器都会发出 Kubernetes 事件。 您可以使用通知控制器将这些事件转发给 Slack、Microsoft Teams、Discord 等。 通知控制器是默认 Flux 安装的一部分。
Define a provider
首先使用您的Slack入站webhook创建一个secret:
kubectl -n flux-system create secret generic slack-url \
--from-literal=address=https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK
注意,该 secret 必须包含一个地址字段,它可以是Slack,Microsoft Teams,Discord或Rocket webhook URL。
通过引用上述 secret 为Slack创建 notification provider:
apiVersion: notification.toolkit.fluxcd.io/v1beta2
kind: Provider
metadata:
name: slack
namespace: flux-system
spec:
type: slack
channel: some-channel-name
secretRef:
name: slack-url
提供者类型可以是slack,msteams,discord,rocket,googlechat,webex,sentry或generic。
当指定generic类型时,通知控制器将以JSON格式将传入事件发布到webhook地址。这样,您可以创建可以将事件存储在Elasticsearch,CloudWatch,Stackdriver等中的自定义处理程序。
define an alert
为所有的 repositories 和 kustomizations 创建警报定义:
apiVersion: notification.toolkit.fluxcd.io/v1beta2
kind: Alert
metadata:
name: on-call-webapp
namespace: flux-system
spec:
summary: "production cluster"
providerRef:
name: slack
eventSeverity: info
eventSources:
- kind: GitRepository
name: '*'
- kind: Kustomization
name: '*'
应用上述文件或将它们提交到 2048 存储库。要验证警报是否已被通知控制器确认,请执行以下操作:
$ kubectl -n flux-system get alerts
NAME READY STATUS AGE
on-call-webapp True Initialized 1m
多个警报可用于向不同渠道或 Slack 组织发送通知。
事件严重性可以设置为信息或错误。 当严重性设置为错误时,kustomize 控制器将对协调过程中遇到的任何错误发出警报。 这包括 kustomize 构建和验证错误、应用错误和健康检查失败。