在 Kubernetes 集群上引导 Flux 并部署示例应用程序
本教程将向您展示如何将 Flux 引导到 Kubernetes 集群,并以 GitOps 方式部署一个示例应用程序。
开始之前
在你开始本教程前,你需要准备以下2个前置资源:
- 一个 Kubernetes 集群 我们推荐 Kubernetes kind,用于在本地开发环境中试用 Flux。
- 具有 repo 权限的 GitHub 个人访问令牌 参阅 GitHub 文档,了解如何创建个人访问令牌。
目标
- 在 Kubernetes 集群上引导安装 Flux自身。
- 使用 Flux 部署一个示例应用程序。
- 通过 Kustomize patches 自定义应用程序配置。
安装 Flux CLI
Flux CLI 用于引导安装 Flux自身以及与 Flux系统交互。
要使用 Homebrew 安装 CLI,请运行:
brew install fluxcd/tap/flux
导出凭据
导出您的GitHub个人访问令牌和用户名:
export GITHUB_TOKEN=<您的令牌>
export GITHUB_USER=<您的用户名>
检查您的Kubernetes集群
通过运行以下命令检查是否具备运行Flux所需的所有条件:
flux check --pre
我们会检查你的集群是否符合要求,输出如下:
► checking prerequisites
✔ kubernetes 1.22.2 >=1.20.6
✔ prerequisites checks passed
安装Flux到您的集群
有关如何使用 GitHub 组织、GitLab 和其他 Git 提供程序进行引导的信息,请参阅安装文档。
运行 bootstrap 命令:
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
上面的引导命令执行以下操作:
- 在您的 GitHub 帐户上创建一个 git 存储库 fleet-infra。
- 将 Flux 组件清单添加到存储库。
- 将 Flux 组件部署到您的 Kubernetes 集群。
- 配置 Flux 组件以跟踪存储库中的路径 /clusters/my-cluster/。
克隆git仓库
将fleet-infra仓库克隆到本地机器上:
git clone https://github.com/$GITHUB_USER/fleet-infra
cd fleet-infra
将podinfo仓库添加到Flux中
此示例使用一个公共仓库 github.com/stefanprodan/podinfo,podinfo是一个使用Go创建的小型Web应用程序。
- 创建一个GitRepository清单,指向podinfo仓库的主分支:
flux create source git podinfo \
--url=https://github.com/stefanprodan/podinfo \
--branch=master \
--interval=30s \
--export > ./clusters/my-cluster/podinfo-source.yaml
输出如下:
apiVersion: source.toolkit.fluxcd.io/v1
kind: GitRepository
metadata:
name: podinfo
namespace: flux-system
spec:
interval: 30s
ref:
branch: master
url: https://github.com/stefanprodan/podinfo
- 提交并推送podinfo-source.yaml文件到fleet-infra仓库:
git add -A && git commit -m "Add podinfo GitRepository"
git push
部署podinfo应用程序
配置 Flux , build and apply 位于 podinfo 仓库中的kustomize清单。
使用flux create命令创建一个Kustomization来应用podinfo部署:
flux create kustomization podinfo \
--target-namespace=default \
--source=podinfo \
--path="./kustomize" \
--prune=true \
--interval=5m \
--export > ./clusters/my-cluster/podinfo-kustomization.yaml
输出如下:
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
name: podinfo
namespace: flux-system
spec:
interval: 5m0s
path: ./kustomize
prune: true
sourceRef:
kind: GitRepository
name: podinfo
targetNamespace: default
提交并推送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
监视Flux同步应用程序
- 使用 flux get 命令监视 podinfo 应用程序:
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
暂停更新
暂停kustomization的更新允许您直接编辑从 kustomization 应用的对象,而不会受到Git中的状态回滚影响。
要暂停kustomization的更新,运行以下命令:
flux suspend kustomization <name>
要恢复更新,运行以下命令:
flux resume kustomization <name>
自定义 podinfo 部署
要自定义不受您控制的仓库中的 deployment,您可以使用Flux的内联补丁(inline patches)。下面的示例展示了如何使用内联补丁来更改podinfo部署。
在podinfo-kustomization.yaml文件的spec字段中添加以下内容:
patches:
- patch: |-
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: podinfo
spec:
minReplicas: 3
target:
name: podinfo
kind: HorizontalPodAutoscaler
提交并推送podinfo-kustomization.yaml文件的更改:
git add -A && git commit -m "Increase podinfo minimum replicas"
git push
同步完成后,运行kubectl get pods
命令应显示3个Pod。
多集群设置
如果要使用Flux管理多个集群或从Staging环境推广部署到Production环境,请参考下面列出的两种方法: