【前置文章】
【环境】
- MacOS
- minikube version: v1.25.2
- helm v3.8.2
【资源】
- flux官网:https://fluxcd.io/docs/get-started/
- Flux 命令行工具fluxctl安装参考:https://fluxcd.io/legacy/flux/references/fluxctl/
说明
fluxcd的学习,需要对Kubernetes和helm有一定的基础。
本文主要参考这个链接:Flux安装参考:https://fluxcd.io/legacy/flux/tutorials/get-started-helm/,用官网的示例项目flux-get-started
通过flux工具,实现GitOps配置文件的自动化部署。
【但是】,从这个安装参考的网址上就可以看出,它是legacy的url,(即历史遗留版本,已经有另外的更新的解决方案了。
网址:https://fluxcd.io/legacy/helm-operator/,有说明:
This documentation is for Flux (v1) and Helm Operator (v1). Both projects are in maintenance mode and will soon reach end-of-life. We strongly recommend you familiarise yourself with the newest Flux and start looking at your migration path.
【即最新的flux和helm一起工作协调的,已经朋helm operator升级到了helm controller了。】
【而本文是通过helm operator,以及flux安装版本还停在v1,所以应该没什么参考价值。我会再出一个基于flux v2版本的文章。】
【不过通过自己的实践,还是对flux以及其工作运转有了一定的了解,以及也安装了fluxctl,然后学会了一些交互。】
关于flux和helm:
-
flux
的工作原理是安装在kubernetes集群中的agent,每隔一段时间对比Git Repo中的配置和kubernetes集群中的配置是否一样,如果不一样,则开始从Git中pull最新配置,apply到kubernetes集群中。 -
helm
则是kubernetes上的包管理工具,即我们每次都要自己写deployment, service, ingress等yaml配置,这样子比较麻烦,通过一些通用的模板(template),以传入动态的values.yaml,来帮助生成k8s中的yaml文件。
另外:本文没有对flux作更多的解释,目标只是跑通官网的demo示例。
1. 准备工作
【如果已经安装了helm,那么可以直接通过helm安装。】
如果没有helm,可以先安装helm:brew install helm
Add the Flux repository:
helm repo add fluxcd https://charts.fluxcd.io
通过kubectl运行Helm crds.yaml配置:
kubectl apply -f https://raw.githubusercontent.com/fluxcd/helm-operator/master/deploy/crds.yaml
通过kubectl在minikube中创建namespace:
前三步截图:kubectl create namespace flux
2. 使用Helm安装Flux:
从Flux官方github中fork项目到自己的git中:
官网github:https://github.com/fluxcd/flux-get-started
右上角点击fork:
需要修改fork后的以下文件git地址(注:需要在自己的repo中改):
https://github.com/fluxcd/flux-get-started/blob/master/releases/ghost.yaml#L13
开始安装flux(需要用自己的git信息来替换)
helm upgrade -i flux fluxcd/flux
--set git.url=git@github.com:YOURUSER/flux-get-started
--namespace flux
根据上述的提示查看:
kubectl -n flux logs deployment/flux | grep identity.pub | cut -d '"' -f2
继续使用helm安装helm-operator:
helm upgrade -i helm-operator fluxcd/helm-operator
--set git.ssh.secretName=flux-git-deploy
--namespace flux
使用kubectl命令在namaspace=flux下查看Pod:
可以看到helm-operator-6ff96bf4d5-c82qv READY = 0/1,用kubectl查看下log:
kubectl logs -f helm-operator-6ff96bf4d5-c82qv -n flux
打印的日志:ts=2022-06-23T00:34:13.207913657Z caller=helm.go:61 component=helm version=v2 error="errored creating Helm 2 client: services \"tiller-deploy\" not found"
找到原因了,因为我用的是helm3,version3是没有tiller的,所以在安装的时候出错了,重新安装下(加上参数--set helm.versions=v3
:
可以看到:Pod为flux和flux-memcached,还有helm-operator都已经安装好了。
【通过查看deployment中的image,可以看到安装的flux版本有点低】
3. fluxctl安装与学习
3.1 安装flux命令行工具:fluxctl
对于MacOS系统,使用HomeBrew来安装:
brew install fluxctl
fluxctl version
1.25.0
3.2 学习fluxctl命令
使用fluxctl --help
来查看学习下fluxctl命令。
其中一个命令:fluxctl identity
:用来显示SSH公钥。
再使用命令:fluxctl identity --help
,查看具体的参数,其中:
--k8s-fwd-ns <namespace>
:可以查看在传入的namespace下的SSH的公钥。
把上述ssh-rsa复制到git网站上的SSH and GPG keys
中:
4. Demo-1
上述我们fork的flux-get-started
项目可以当做一个例子来演示。
flux-get-started项目里面的配置,namespace都为demo。
4.1 首先是改下mongodb的yaml配置文件:
地址(把YOURUSER改成自己的github地址):https://github.com/YOURUSER/flux-get-started/edit/master/releases/mongodb.yaml下。
这里我是fork到自己的github下,如果是fork到别的git仓库也可以的,文件就是在flux-get-started项目的releases目录的mondodb.yaml。
我们的目标是在这里修改一点点内容,如把tag从4.0.13
改到4.0.14
:
4.2 commit代码到master branch后,查看flux log:
kubectl -n flux logs deployment/flux -f
默认情况下,flux operator会每隔5分钟同步一次(即对比Kubernetes中的配置和Git Repo配置)。
4.3 手动同步配置:
可以看到目标Git Repo即是我们配置的url:fluxctl sync --k8s-fwd-ns flux
4.4 设置k8s-fwd-ns
这里每次都要在fluxctl命令后加上--k8s-fwd-ns
,是因为默认的namespace为default,而我们要查看的ns为flux,可以通过export set环境变量:
export FLUX_FORWARD_NAMESPACE=flux
【如此一来,就可以不用加--k8s-fwd-ns flux
这个参数了。】
4.5 通过fluxctl list-workloads
来查看flux的工作负载
fluxctl list-workloads -a
可以看到demo的namespace下的mongodb的version从4.0.13更新到了4.0.14了:
5. Demo-2
首先在(YOURUSER改成自己的用户名):https://github.com/YOURUSER/flux-get-started/blob/master/workloads/podinfo-hpa.yaml
可以看到配置:再通过kubectl查看已经在运行的Pod,确实有2个podinfo:
【修改podinfo-hpa.yaml
中的minReplicas和macReplicas为1】:
等待一段时间(flux同步时间为5分钟),查用kubectl查看podinfo数量,从2个减到了1个:
【目标达成】
我们仅仅改了一个在Git Repository中的podinfo-hpa.yaml
文件里的内容,别的什么都没有动,在本地的minikube中的pod数据,就自动的从2个变成了1个。做到了GitOps的目标,即配置文件的CI/CD。
参考:
https://techbloc.net/archives/4283
https://fluxcd.io/legacy/flux/tutorials/driving-flux/