本发明涉及资源部署,具体的说是一种k8s资源的简易部署方法。
背景技术:
1、kubernetes(k8s)是一个用于自动化容器化应用程序部署、扩展和管理的开源平台。k8s提供了多种资源对象,如deployment、service、virtualservice和ingress等,用于管理容器化应用的生命周期。然而,在实际应用中,用户往往需要手动编写多个yaml文件来定义和创建这些资源对象,这一过程既繁琐又容易出错。
2、crd(custom resource definition,自定义资源定义)是kubernetes中的一种扩展机制。它允许用户定义自己的资源类型,这些资源类型在kubernetes api服务器中不存在,但用户可以像使用内置资源(如pod、service等)一样使用它们。crd使得kubernetes可以支持更多的应用场景和需求。
3、传统方法中,开发人员需要对每个应用编写多个资源定义文件,并分别应用这些文件来完成应用的部署。这种方式要求用户对k8s资源有深入的理解,并具备一定的配置管理能力,增加了部署复杂性和错误的可能性。kubernetes提供了强大的容器编排功能,允许用户通过yaml或json配置文件定义并管理应用资源。然而,随着应用规模的扩大,所需的kubernetes资源数量也急剧增加,导致配置文件繁多且管理困难。同时,由于资源之间存在复杂的依赖关系,手动部署时容易出现遗漏或错误,增加了维护成本和部署风险。因此,提出一种能够简化k8s资源部署的方法和装置具有重要意义。
技术实现思路
1、本发明为了解决现有技术中存在的部署复杂性问题,提供一种k8s资源的简易部署方法。
2、本发明的一种k8s资源的简易部署方法,解决上述技术问题采用的技术方案如下:
3、一种k8s资源的简易部署方法,该方法通过创建crd,自动完成k8s资源的创建,其具体包括以下操作:
4、s1、安装并配置golang环境和linux下的make工具,随后按照操作系统版本和以及cpu架构选择kubebuilder版本,并下载解压至指定目录;
5、s2、创建项目目录并初始化kubebuilder项目;创建autodeployspec结构体,用于表示autodeploy crd创建时需要的定义信息;拼装autodeploy结构体,用于描述autodeploy crd的数据结构;
6、s3、实现reconcile方法,对k8s中的各项资源进行协调,以达到系统期望的状态;
7、s4、查询crd对象是否存在,创建或更新相关的k8s资源,并根据部署状态更新crd资源状态;
8、s5、配置setupwithmanager方法,用于将控制器注册到manager,并设置对autodeploy 资源的监听,以触发reconcile方法的实现逻辑;
9、s6、在项目目录执行make manifests命令,生成autodeploycrd的资源清单,并使用k8s客户端将生成的crd资源清单应用于k8s集群;
10、s7、构建docker镜像并部署至k8s集群,最终实现自动管理资源的功能。
11、可选的,执行步骤s2,创建项目目录并初始化kubebuilder项目的具体流程如下:
12、s2.1.1、创建并进入项目目录;
13、s2.1.2、调用kubebuilder,执行kubebuilder init命令,同时传入参数,包括自定义域名domain和项目名称repo;
14、s2.1.3、调用kubebuilder,执行kubebuilder create api命令,同时传入参数,包括指定crd的group、指定crd的版本version、指定crd的kind。
15、进一步可选的,执行步骤s2,创建项目目录并初始化kubebuilder项目时,传入的参数具体如下:
16、自定义域名domain为com.wyb,项目名称repo为com.wyb/autodeploy;
17、指定crd的group为webapp,指定crd的版本version为v1,指定crd的kind为autodeploy。
18、进一步可选的,执行步骤s2,创建的autodeployspec结构体具体包含以下字段:
19、(a)deploymentapplyconfiguration对象或image字段,其中:使用deploymentapplyconfiguration对象进行完整的deployment定义,或者,使用image字段指定要部署的镜像地址;
20、(b)用于service配置的port字段、targetport字段和nodeport字段,其中:port字段用于表示级联创建的service所暴露的地址,port字段若为空则默认用80端口;targetport字段用于表示service代理的pod暴露的服务地址,为必填项;nodeport字段用于表示服务是否以nodeport方式创建,并指明要暴露的节点端口,且指明要暴露的节点端口大于30000;
21、(c)virtualservice对象或istiohost字段,其中:使用virtualservice对象进行完整的istiovirtualservice定义,或者,使用指定的istiohost字段设置virtualservice主机名匹配路由;
22、(d)ingressapplyconfiguration对象或ingresshost字段,其中:使用ingressapplyconfiguration对象进行完整的ingress定义,或者,使用指定的ingresshost字段设置ingress域名路由规则。
23、进一步可选的,执行步骤s2,拼装的autodeploy结构体包含autodeployspec对象、tymemeta对象和objectmeta对象,以及包含表达服务状态的status对象。
24、进一步可选的,所涉及步骤s3的reconcile方法采用控制器模式以声明式事件驱动的方法管理k8s资源,具体实现过程包括:
25、获取当前的对象资源状态,比较当前状态与期望状态,根据比较结果决定是否需要创建更新或删除当前对象以外的资源,或者修改自身资源的状态。
26、进一步可选的,所涉及步骤s4具体包括如下操作:
27、s4.1、使用k8s客户端查询自定义的autodeploy crd对象在命名空间中是否存在,若存在,则执行后续操作,若不存在则代表资源被删除,直接返回;
28、s4.2、根据objectmeta对象的name和namespace字段查询deployment资源的存在情况,并根据需要创建或更新deployment资源:
29、若deployment资源不存在,则根据deploymentapplyconfiguration对象与image字段组装创建k8s deploy资源所需要的对象,这一过程中:a)若deploymentapplyconfiguration对象不为空,则直接使用deploymentapplyconfiguration对象创建deployment资源;b)若deploymentapplyconfiguration为空,则构建deploymentapplyconfiguration对象,添加label:autodeploy-app: autodeploy.name,容器名称为autodeploy名称,容器镜像为image字段值,将 autodeploy 对象设置为deployment 对象的所有者;
30、若deployment资源存在,则根据deploymentapplyconfiguration对象执行更新操作;
31、s4.3、根据objectmeta对象的name和namespace字段查询service资源的存在情况,并根据需要创建或更新service资源:
32、若不存在service资源,则根据port字段、targetport字段和nodeport字段的具体信息构建service对象,添加label:autodeploy-app: autodeploy.name,service名称为autodeploy名称, 将 autodeploy 对象设置为 service 对象的所有者;
33、若存在service资源,则创建service对象并执行更新操作;
34、s4.4、根据objectmeta对象的name和namespace字段查询istio virtualservice资源的存在情况,并根据需要创建或更新istio virtualservice资源:
35、若不存在istio virtualservice资源,则根据virtualservice对象与istiohost字段构建virtualservice对象,添加label:autodeploy-app: autodeploy.name,virtualservice名称为autodeploy名称,将 autodeploy 对象设置为 virtualservice对象的所有者;
36、若存在istio virtualservice资源,则创建virtualservice对象并执行更新操作;
37、s4.5、根据objectmeta对象的name和namespace字段查询ingress资源的存在情况,并根据需要创建或更新ingress资源:
38、若不存在ingress资源,则根据virtualservice对象与istiohost字段构建ingressapplyconfiguration对象,添加label:autodeploy-app: autodeploy.name,ingress名称为autodeploy名称, 将 autodeploy 对象设置为 ingress对象的所有者;
39、若存在ingress资源,则创建ingress对象并执行更新操作;
40、s4.6、根据deployment资源的可用副本数来判断deployment部署是否成功:若可用副本数大于0,则表示deployment部署成功,若可用副本数等于0,则表示deployment部署失败;随后根据deployment部署状态更新autodeploy资源的状态。
41、进一步可选的,执行步骤s5,setupwithmanager方法通过控制器管理器绑定协调的资源类型为autodeploy,同时协调所有者资源类型为deployment、service、virtualservice和ingress,以便响应创建事件、删除事件或更新事件。
42、进一步可选的,所涉及步骤s7具体包括:
43、运行make docker-build docker-push img=<some-registry>/<project-name>:tag命令,将控制器代码构建成docker镜像并推送到指定的镜像仓库;
44、运行make deploy img=<some-registry>/<project-name>:tag命令,将控制器镜像部署到k8s集群中;
45、编写autodeploycrd的资源清单文件,将其部署到k8s集群中,观察deployment资源、service资源、virtualservice资源和ingress资源的创建、更新和删除事件。
46、本发明的一种k8s资源的简易部署方法,与现有技术相比具有的有益效果是:
47、1、本发明通过创建crd,即可自动完成deployment、service、virtualservice和ingress等k8s资源的创建,从而大大简化了k8s资源的部署流程;
48、2、本发明通过crd和控制器的结合,实现了k8s资源的自动化创建和管理,用户无需手动编写复杂的yaml文件,简化了部署流程;控制器自动调和资源状态,确保k8s集群中的资源始终与crd定义保持一致,减少了手动干预的需求,提高了运维效率;差un构建负载均衡的crd可根据用户需求进行扩展,支持更多类型的k8s资源,适应不同的应用场景;通过自动化流程,显著降低了由于手动操作导致的部署错误,提升了系统的稳定性。
1.一种k8s资源的简易部署方法,其特征在于,该方法通过创建crd,自动完成k8s资源的创建,其具体包括以下操作:
2.根据权利要求1所述的一种k8s资源的简易部署方法,其特征在于,执行步骤s2,创建项目目录并初始化kubebuilder项目的具体流程如下:
3.根据权利要求2所述的一种k8s资源的简易部署方法,其特征在于,执行步骤s2,创建项目目录并初始化kubebuilder项目时,传入的参数具体如下:
4.根据权利要求3所述的一种k8s资源的简易部署方法,其特征在于,执行步骤s2,创建的autodeployspec结构体具体包含以下字段:
5.根据权利要求4所述的一种k8s资源的简易部署方法,其特征在于,执行步骤s2,拼装的autodeploy结构体包含autodeployspec对象、tymemeta对象和objectmeta对象,以及包含表达服务状态的status对象。
6.根据权利要求5所述的一种k8s资源的简易部署方法,其特征在于,所述步骤s3的reconcile方法采用控制器模式以声明式事件驱动的方法管理k8s资源,具体实现过程包括:
7.根据权利要求5所述的一种k8s资源的简易部署方法,其特征在于,所述步骤s4具体包括如下操作:
8.根据权利要求7所述的一种k8s资源的简易部署方法,其特征在于,执行步骤s5,setupwithmanager方法通过控制器管理器绑定协调的资源类型为autodeploy,同时协调所有者资源类型为deployment、service、virtualservice和ingress,以便响应创建事件、删除事件或更新事件。
9.根据权利要求8所述的一种k8s资源的简易部署方法,其特征在于,所述步骤s7具体包括:
