1.Flux 简介

Flux 是一种工具,用于保持 Kubernetes 集群与配置源(如 Git 仓库)同步,并在有新代码要部署时自动更新配置。
Flux 从一开始就使用 Kubernetes 的 API 扩展系统,并与 Prometheus 和 Kubernetes 生态系统的其他核心组件集成。Flux 支持多租户,并支持同步任意数量的 Git 仓库

2.架构图

Flux 采用 GitOps 工具包组件构建,该组件是一套专用工具和 Flux 控制器
可组合 API,fluxcd GitHub organisation下的 GitOps 可重用 Go 软件包用于在 Kubernetes 上构建持续交付(Continuous Delivery)。
Alt

3.快速开始

3.1前提条件

1.Kubernetes 集群。我们建议在本地开发环境中试用 参见Kubernetes Kind
2.具有 repo 权限的 GitHub 个人访问令牌 GitHub 个人访问令牌

3.2 安装 Flux CLI

Flux 命令行界面(CLI)用于启动 Flux 并与之交互
使用以下命令来安装flux

#通过bash安装flux 适用于mac和linux
curl -s https://fluxcd.io/install.sh | sudo bash

其他的操作系统参考CLI install documentation

3.3 配置shell

. <(flux completion bash)

要配置 shell 以加载 flux bash completions,将其添加到你的配置文件

3.4 设置凭证

设置环境变量包括 GitHub 个人访问令牌用户名
token获取在前提条件里有

export GITHUB_TOKEN=<your-token>
export GITHUB_USER=<your-username>

3.5检查Kubernetes 集群

运行以下命令,检查是否具备运行 Flux 所需的一切条件

flux check --pre

输出结果类似于以下,kubernetes版本要大于1.24

► checking prerequisites
✔ kubernetes 1.27.3 >=1.24.0
✔ prerequisites checks passed

3.6在集群上安装FLux

运行以下初始化命令

flux bootstrap github \
  --owner=$GITHUB_USER \
  --repository=fleet-infra \
  --branch=main \
  --path=./clusters/my-cluster \
  --personal

输出结果类似于以下

► connecting to github.com
✔ repository created
✔ repository cloned
✚ generating manifests
✔ components manifests pushed
► installing components in flux-system namespace
deployment "source-controller" successfully rolled out
deployment "kustomize-controller" successfully rolled out
deployment "helm-controller" successfully rolled out
deployment "notification-controller" successfully rolled out
✔ install completed
► configuring deploy key
✔ deploy key configured
► generating sync manifests
✔ sync manifests pushed
► applying sync manifests
◎ waiting for cluster sync
✔ bootstrap finished

bootstrap命令做了以下的事情
1.在你的 GitHub 账户上创建一个 git 仓库 fleet-infra。
2.向该仓库添加 Flux 组件清单。
3.将 Flux 组件部署到 Kubernetes 集群。
4.配置 Flux 组件,以跟踪版本库中的 /clusters/my-cluster/ 路径。
注意在初始化flux的时候,可以查看flux-system里的pod是否全部已经运行,
如果,pod没有成功运行,会显示一直卡在响应sync,然后超时失败

3.7克隆git仓库

将 fleet-infra 仓库克隆到本地计算机上

git clone https://github.com/$GITHUB_USER/fleet-infra
cd fleet-infra

3.8将 podinfo 仓库添加到 Flux

这里使用的是公共存储库 github.com/stefanprodan/podinfo,podinfo 是一个使用 Go 开发的小型网络应用程序。

3.8.1 GitRepository 清单

创建指向 podinfo 仓库主分支的 GitRepository 清单

flux create source git podinfo \
  --url=https://github.com/stefanprodan/podinfo \
  --branch=master \
  --interval=1m \
  --export > ./clusters/my-cluster/podinfo-source.yaml

注意:如果是你自己的仓库,这里的url是你自己将来要存放资源的那个仓库的url

podinfo-source.yaml里的内容如下

apiVersion: source.toolkit.fluxcd.io/v1
kind: GitRepository
metadata:
  name: podinfo
  namespace: flux-system
spec:
  interval: 1m
  ref:
    branch: master
  url: https://github.com/stefanprodan/podinfo

3.8.2 push 源文件

提交 podinfo-source.yaml 文件并将其推送至你的 fleet-infra 源库

git add -A && git commit -m "Add podinfo GitRepository"
git push

3.9 部署 podinfo 应用程序

3.9.1 创建Kustomization

使用 flux create 命令创建可应用 podinfo 部署的 Kustomization

flux create kustomization podinfo \
  --target-namespace=default \
  --source=podinfo \
  --path="./kustomize" \
  --prune=true \
  --wait=true \
  --interval=30m \
  --retry-interval=2m \
  --health-check-timeout=3m \
  --export > ./clusters/my-cluster/podinfo-kustomization.yaml

注意:这里的path路径是上面你自己的仓库存放的manifest的资源文件夹路径
在本文里./kustomize就是https://github.com/stefanprodan/podinfo里的文件夹
里面存放的就是podinfo相关的manifest文件

在这里插入图片描述

podinfo-kustomization.yaml里的内容如下

apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
  name: podinfo
  namespace: flux-system
spec:
  interval: 30m0s
  path: ./kustomize
  prune: true
  retryInterval: 2m0s
  sourceRef:
    kind: GitRepository
    name: podinfo
  targetNamespace: default
  timeout: 3m0s
  wait: true

3.9.2 push Kustomization 资源文件

提交并将 Kustomization 清单推送至版本库

git add -A && git commit -m "Add podinfo Kustomization"
git push

fleet-infra仓库的结构如下

fleet-infra
└── clusters/
    └── my-cluster/
        ├── flux-system/                        
        │   ├── gotk-components.yaml
        │   ├── gotk-sync.yaml
        │   └── kustomization.yaml
        ├── podinfo-kustomization.yaml
        └── podinfo-source.yaml

4 查看Flux 同步应用程序

flux get kustomizations --watch

结果如下

NAME          REVISION             SUSPENDED  READY   MESSAGE
flux-system   main@sha1:4e9c917f   False      True    Applied revision: main@sha1:4e9c917f
podinfo       master@sha1:44157ecd False      True    Applied revision: master@sha1:44157ecd

检查 podinfo 是否已部署到群集上

kubectl -n default get deployments,services

结果如下

NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/podinfo   2/2     2            2           108s

NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)             AGE
service/podinfo      ClusterIP   10.100.149.126   <none>        9898/TCP,9999/TCP   108s

对主分支中 podinfo Kubernetes manifest所做的更改会映射在这个集群里
使用kubectl edit更改 podinfo 部署时,更改会被还原为与 Git仓库 中描述的状态一致。

5 参考资料

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐