基于 KubeVela 的 GitOps 交付( 二 )

KubeVela 建议使用如上的目录结构管理你的 GitOps 仓库 。clusters/ 中存放相关的 KubeVela GitOps 配置并需要被手动部署到集群中 , apps/ 和 infrastructure/ 中分别存放你的应用和基础设施配置 。通过把应用和基础配置分开,能够更为合理的管理你的部署环境,隔离应用的变动影响 。
clusters/ 目录首先,我们来看下 clusters 目录,这也是 KubeVela 对接 GitOps 的初始化操作配置目录 。
以 clusters/infra.yaml 为例:
apiVersion: core.oam.dev/v1beta1kind: Applicationmetadata:name: infraspec:components:- name: database-configtype: kustomizeproperties:repoType: git# 将此处替换成你需要监听的 git 配置仓库地址url: https://github.com/cnych/KubeVela-GitOps-Infra-Demo# 如果是私有仓库,还需要关联 git secret# secretRef: git-secret# 自动拉取配置的时间间隔,由于基础设施的变动性较小,此处设置为十分钟pullInterval: 10mgit:# 监听变动的分支branch: mAIn# 监听变动的路径,指向仓库中 infrastructure 目录下的文件path: ./infrastructureapps.yaml 与 infra.yaml 几乎保持一致,只不过监听的文件目录有所区别 。在 apps.yaml 中,properties.path 的值将改为 ./apps,表明监听 apps/ 目录下的文件变动 。
cluster 文件夹中的 GitOps 管控配置文件需要在初始化的时候一次性手动部署到集群中 , 在此之后 KubeVela 将自动监听 apps/ 以及 infrastructure/ 目录下的配置文件并定期更新同步 。
apps/ 目录apps/ 目录中存放着应用配置文件,这是一个配置了数据库信息以及 Ingress 的简单应用 。该应用将连接到一个 MySQL 数据库,并简单地启动服务 。在默认的服务路径下,会显示当前版本号 。在 /db 路径下,会列出当前数据库中的信息 。
【基于 KubeVela 的 GitOps 交付】apiVersion: core.oam.dev/v1beta1kind: Applicationmetadata:name: my-appnamespace: defaultspec:components:- name: my-servertype: webserviceproperties:image: cnych/kubevela-gitops-demo:main-76a34322-1697703461port: 8088env:- name: DB_HOSTvalue: mysql-cluster-mysql.default.svc.cluster.local:3306- name: DB_PASSwordvalueFrom:secretKeyRef:name: mysql-secretkey: ROOT_PASSWORDtraits:- type: scalerproperties:replicas: 1- type: gatewayproperties:class: NginxclassInSpec: truedomain: vela-gitops-demo.k8s.localhttp:/: 8088pathType: ImplementationSpecific这是一个使用了 KubeVela 内置组件类型 webservice 的应用,该应用绑定了 gateway 运维特征 。通过在应用中声明运维能力的方式,只需一个文件,便能将底层的 Deployment、Service、Ingress 集合起来 , 从而更为便捷地管理应用 。infrastructure/ 目录infrastructure/ 目录下存放一些基础设施的配置 。此处我们使用 mysql controller 来部署了一个 MySQL 集群 。
apiVersion: core.oam.dev/v1beta1kind: Applicationmetadata:name: mysqlnamespace: defaultspec:components:- name: mysql-secrettype: k8s-objects # 需要添加一个包含 ROOT_PASSWORD 的 secretproperties:objects:- apiVersion: v1kind: Secretmetadata:name: mysql-secrettype: OpaquestringData:ROOT_PASSWORD: root321- name: mysql-operatortype: helmproperties:repoType: helmurl: https://helm-charts.bitpoke.iochart: mysql-operatorversion: 0.6.3- name: mysql-clustertype: rawdependsOn:- mysql-operator- mysql-secretproperties:apiVersion: mysql.presslabs.org/v1alpha1kind: MysqlClustermetadata:name: mysql-clusterspec:replicas: 1secretName: mysql-secret在这个 MySQL 应用中,我们添加了 3 个 KubeVela 的组件,第一个是一个 k8s-objects 类型的组件,也就是直接应用 Kube.NETes 资源对象,我们这里需要部署一个 Secret 对象;然后添加一个 helm 类型的组件,用来部署 MySQL 的 Operator 。当 Operator 部署成功且正确运行后,最后我们将开始部署 MySQL 集群 。
部署 clusters/ 目录下的文件配置完以上文件并存放到 Git 配置仓库后,我们需要在集群中手动部署 clusters/ 目录下的 KubeVela GitOps 配置文件 。
首先 , 在集群中部署 clusters/infra.yaml 。可以看到它自动在集群中拉起了 infrastructure/ 目录下的 MySQL 部署文件:
$ kubectl apply -f clusters/infra.yaml$ vela lsAPPCOMPONENTTYPETRAITSPHASEHEALTHY STATUSCREATED-TIMEinfradatabase-config kustomizerunning healthy2023-10-19 15:27:28 +0800 CSTmysqlmysql-operatorhelmrunning healthy Fetch repository successfully, Create helm release2023-10-19 15:27:31 +0800 CSTsuccessfully└─mysql-clusterrawrunning healthy2023-10-19 15:27:31 +0800 CST至此,我们通过部署 KubeVela GitOps 配置文件,自动在集群中拉起了数据库基础设施 。


推荐阅读