基于 KubeVela 的 GitOps 交付( 四 )

构建后我们就可以将应用的镜像打包后推送到 Docker Hub 去 。

基于 KubeVela 的 GitOps 交付

文章插图
配置秘钥信息在新的镜像推送到镜像仓库后,KubeVela 会识别到新的镜像,并更新仓库及集群中的 Application 配置文件 。因此,我们需要一个含有 Git 信息的 Secret,使 KubeVela 向 Git 仓库进行提交 。部署如下文件 , 将其中的用户名和密码替换成你的 Git 用户名及密码(或 Token):
apiVersion: v1kind: Secretmetadata:name: git-secrettype: kubernetes.io/basic-authstringData:username: <your username>password: <your password>准备配置仓库配置仓库与之前面向运维人员的配置大同小异 , 只需要加上与镜像仓库相关的配置即可 。
修改 clusters/ 中的 apps.yaml,该 GitOps 配置会监听仓库中 apps/ 下的应用文件变动以及镜像仓库中的镜像更新:
# ...... 省略其他的imageRepository:# 镜像地址image: <your image># 如果这是一个私有的镜像仓库,可以通过 `kubectl create secret docker-registry` 创建对应的镜像秘钥并相关联secretRef: dockerhub-secretfilterTags:# 可对镜像 tag 进行过滤pattern: "^main-[a-f0-9]+-(?P<ts>[0-9]+)"extract: "$ts"# 通过 policy 筛选出最新的镜像 Tag 并用于更新policy:numerical:order: asc# 追加提交信息commitMessage: "Image: {{range .Updated.Images}}{{println .}}{{end}}"修改 apps/my-app.yaml 中的 image 字段,在后面加上 # {"$imagepolicy": "default:apps"} 的注释,KubeVela 会通过该注释去更新对应的镜像字段,default:apps 是上面 GitOps 配置对应的命名空间和名称 。
spec:components:- name: my-servertype: webserviceproperties:image: cnych/kubevela-gitops-demo:main-9e8d2465-1697703645 # {"$imagepolicy": "default:apps"}将 clusters/ 中包含镜像仓库配置的文件更新到集群中后 , 我们便可以通过修改代码来完成应用的更新 。
部署 clusters/apps.yaml:
$ kubectl apply -f clusters/apps.yaml$ vela lsAPPCOMPONENTTYPETRAITSPHASEHEALTHYSTATUSCREATED-TIMEappsappskustomizerunninghealthy2023-10-19 16:31:49 +0800 CSTmy-appmy-serverwebservicescaler,gatewayrunningWorkflow unhealthyReady:0/12023-10-19 16:32:11 +0800 CST$ kubectl get podsNAMEREADYSTATUSRESTARTSAGEmy-server-6947fd65f9-84zhv1/1Running02m这样我们就可以通过部署 KubeVela GitOps 配置文件,自动在集群中拉起应用了 。我们可以通过 curl 应用的 Ingress 来验证结果是否正确,可以看到目前的版本是 0.1.5,并且成功地连接到了数据库:
$ kubectl get ingressNAMECLASSHOSTSADDRESSPORTSAGEmy-servernginxvela-gitops-demo.k8s.local80115s$ curl -H "Host:vela-gitops-demo.k8s.local" http://192.168.0.100Version: 0.1.8$ curl -H "Host:vela-gitops-demo.k8s.local" http://192.168.0.100/dbUser: KubeVelaDescription: It's a test user修改代码将代码文件中的 Version 改为 0.2.0,并修改数据库中的数据:
const VERSION = "0.2.0"...func InsertInitData(db *sql.DB) {stmt, err := db.Prepare(insertInitData)if err != nil {panic(err)}defer stmt.Close()_, err = stmt.Exec("KubeVela2", "It's another test user")if err != nil {panic(err)}}提交该改动至代码仓库 , 正常我们配置的 CI 流水线就会自动开始构建镜像并推送至镜像仓库 。
而 KubeVela 会通过监听镜像仓库,根据最新的镜像 Tag 来更新配置仓库中 apps/ 下的应用 my-app 。
此时,可以看到配置仓库中有一条来自 kubevelabot 的提交,提交信息均带有 Update image automatically. 前缀 。你也可以通过 {{range .Updated.Images}}{{println .}}{{end}} 在 commitMessage 字段中追加你所需要的信息 。
基于 KubeVela 的 GitOps 交付

文章插图
经过一段时间后,应用 my-app 就自动更新了 。KubeVela 会通过你配置的 interval 时间间隔,来每隔一段时间分别从配置仓库及镜像仓库中获取最新信息:
  • 当 Git 仓库中的配置文件被更新时,KubeVela 将根据最新的配置更新集群中的应用 。
  • 当镜像仓库中多了新的 Tag 时,KubeVela 将根据你配置的 policy 规则,筛选出最新的镜像 Tag,并更新到 Git 仓库中 。而当代码仓库中的文件被更新后 , KubeVela 将重复第一步,更新集群中的文件,从而达到了自动部署的效果 。
通用我们可以通过 curl 对应的 Ingress 查看当前版本和数据库信息:


推荐阅读