跳到主要内容

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 构建和验证错误、应用错误和健康检查失败。