欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 新车 > 【云原生开发】K8S集群调度资源deployment,daemonset,statefulset,cronjob,节点管理等开发设计与实现

【云原生开发】K8S集群调度资源deployment,daemonset,statefulset,cronjob,节点管理等开发设计与实现

2025/10/22 13:47:03 来源:https://blog.csdn.net/littlefun591/article/details/143886346  浏览:    关键词:【云原生开发】K8S集群调度资源deployment,daemonset,statefulset,cronjob,节点管理等开发设计与实现

在这里插入图片描述

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,Golang开发,云原生开发,PyQt5和Tkinter桌面开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生K8S,linux,shell脚本等实操经验,网站搭建,数据库等分享。

所属的专栏:云原生开发
景天的主页:景天科技苑

在这里插入图片描述

文章目录

  • k8s调度资源管理开发设计与实现
    • 1. Deployment的功能开发
    • 2. Statefulset的功能开发
    • 3. Daemonset的功能开发
    • 4. cronjob功能开发
    • 5. Replicaset功能实现
    • 6. 实现节点管理

k8s调度资源管理开发设计与实现

在上一章,我们在做pod管理的开发后,对我们得接口进行了优化,后续我们对其他资源的操作,都采用接口的方式进行开发。本文我们就使用接口,开发k8s集群各个调度资源的管理。

1. Deployment的功能开发

我们直接将pod目录进行复制改成deployment,然后对代码稍加修改即可。

路由:
routers/deployment/deployment.go

package deploymentimport ("github.com/gin-gonic/gin""jingtian/krm-backend/controllers/deployment"
)// 实现创建deployment的接口
func create(deploymentGroup *gin.RouterGroup) {//具体逻辑写到控制器controller里面deploymentGroup.POST("/create", deployment.Create)
}// 实现更新deployment的接口
func update(deploymentGroup *gin.RouterGroup) {//具体逻辑写到控制器controller里面deploymentGroup.POST("/update", deployment.Update)
}// 删除deployment
func deletedeployment(deploymentGroup *gin.RouterGroup) {deploymentGroup.GET("/delete", deployment.Delete)
}// 批量删除deployment
func deleteList(deploymentGroup *gin.RouterGroup) {deploymentGroup.POST("/deleteList", deployment.DeleteList)
}// 获取deployment信息
func get(deploymentGroup *gin.RouterGroup) {deploymentGroup.GET("/get", deployment.Get)
}// 列出所有deployment
func list(deploymentGroup *gin.RouterGroup) {deploymentGroup.GET("/list", deployment.List)
}// RegisterSubRouter 认证子路由
func RegisterSubRouter(g *gin.RouterGroup) {//配置登录功能路由策略deploymentGroup := g.Group("/deployment")create(deploymentGroup)update(deploymentGroup)deletedeployment(deploymentGroup)get(deploymentGroup)list(deploymentGroup)deleteList(deploymentGroup)}

在这里插入图片描述

控制器
在这里插入图片描述

封装接口之后,我们再写代码就变得非常简单了,比如deployment/update.go

package deploymentimport ("github.com/gin-gonic/gin""github.com/littlefun91/kubeutils/kubeutils""jingtian/krm-backend/controllers""jingtian/krm-backend/utils/logs"appsv1 "k8s.io/api/apps/v1"
)func Update(c *gin.Context) {logs.Debug(nil, "更新deployment")//更新,只需要把create代码复制过来,将info中的create方法改成update方法即可var deployment appsv1.Deploymentvar info controllers.Infoinfo.Item = &deploymentkubeconfig := controllers.NewInfo(c, &info, "deployment更新成功")// 改为接口形式的创建var kubeUtilser kubeutils.KubeUtilserinstance := kubeutils.NewDeployment(kubeconfig, &deployment)// 把实例复制给kubeUtilserkubeUtilser = instance// 使用kubeUtilser创建资源info.Update(c, kubeUtilser)
}

在这里插入图片描述

测试deployment功能
我们在postman中将pod文件夹,复制一份,改名为deployment
在这里插入图片描述

将请求路径改为deployment
在这里插入图片描述

创建deployment:
我们使用kubectl create deployment --dry-run=client的方式生成创建deployment的json文件

kubectl create deployment myweb --image="web:v4" --dry-run=client -ojson

在这里插入图片描述

我们将json文件复制到postman,执行创建deployment操作

{"kind": "Deployment","apiVersion": "apps/v1","metadata": {"name": "myweb","creationTimestamp": null,"labels": {"app": "myweb"}},"spec": {"replicas": 1,"selector": {"matchLabels": {"app": "myweb"}},"template": {"metadata": {"creationTimestamp": null,"labels": {"app": "myweb"}},"spec": {"containers": [{"name": "web","image": "web:v4","resources": {}}]}},"strategy": {}},"status": {}
}

创建成功
在这里插入图片描述

在k8s集群查看,创建成功
在这里插入图片描述

更新deployment:

我们更新下deployment的annotations

{"clusterId":"cluster01","namespace":"jingtian","item": {"kind": "Deployment","apiVersion": "apps/v1","metadata": {"name": "myweb","creationTimestamp": null,"annotations":{"kubeasy.com":"true"},"labels": {"app": "myweb"}},"spec": {"replicas": 1,"selector": {"matchLabels": {"app": "myweb"}},"template": {"metadata": {"creationTimestamp": null,"labels": {"app": "myweb"}},"spec": {"containers": [{"name": "web","image": "web:v4","resources": {}}]}},"strategy": {}},"status": {}
}
}

在这里插入图片描述

集群中查看,更新成功
在这里插入图片描述

查看deployment列表:
再创建个deployment
在这里插入图片描述

postman发送查询请求
在这里插入图片描述

查询deployment详情:
在这里插入图片描述

删除deployment功能:
在这里插入图片描述

2. Statefulset的功能开发

与deployment管理的开发大致类似,都是先创建路由,然后开发控制器。
routers/statefulset.go

package statefulsetimport ("github.com/gin-gonic/gin""jingtian/krm-backend/controllers/statefulset"
)// 实现创建statefulset的接口
func create(statefulsetGroup *gin.RouterGroup) {//具体逻辑写到控制器controller里面statefulsetGroup.POST("/create", statefulset.Create)
}// 实现更新statefulset的接口
func update(statefulsetGroup *gin.RouterGroup) {//具体逻辑写到控制器controller里面statefulsetGroup.POST("/update", statefulset.Update)
}// 删除statefulset
func deletestatefulset(statefulsetGroup *gin.RouterGroup) {statefulsetGroup.GET("/delete", statefulset.Delete)
}// 批量删除statefulset
func deleteList(statefulsetGroup *gin.RouterGroup) {statefulsetGroup.POST("/deleteList", statefulset.DeleteList)
}// 获取statefulset信息
func get(statefulsetGroup *gin.RouterGroup) {statefulsetGroup.GET("/get", statefulset.Get)
}// 列出所有statefulset
func list(statefulsetGroup *gin.RouterGroup) {statefulsetGroup.GET("/list", statefulset.List)
}// RegisterSubRouter 认证子路由
func RegisterSubRouter(g *gin.RouterGroup) {//配置登录功能路由策略statefulsetGroup := g.Group("/statefulset")create(statefulsetGroup)update(statefulsetGroup)deletestatefulset(statefulsetGroup)get(statefulsetGroup)list(statefulsetGroup)deleteList(statefulsetGroup)}

注册总路由
在这里插入图片描述

控制器
在这里插入图片描述

创建statefulset和deployment有些不一样。
创建statefulset的时候,需要指定servicename。
在这里插入图片描述

需要看一下是否要自动创建headless service。这个功能我们在前后端交互时,我们再做

测试管理statefulset的可用性

创建sts
创建statefulset的时候,不能再用–dry-run=client生成json文件。因为kubectl create命令行没有生成statefulset的命令
在这里插入图片描述

我们需要通过yaml方式生成statefulset,然后导出json文件

{"apiVersion": "apps/v1","kind": "StatefulSet","metadata": {"name": "myweb","namespace": "jingtian",},"spec": {"podManagementPolicy": "OrderedReady","replicas": 1,"revisionHistoryLimit": 10,"selector": {"matchLabels": {"app": "myweb"}},"template": {"metadata": {"creationTimestamp": null,"labels": {"app": "myweb"}},"spec": {"containers": [{"image": "web:v4","imagePullPolicy": "IfNotPresent","name": "myweb"}],"nodeSelector": {"stateless": "yes"},"restartPolicy": "Always","schedulerName": "default-scheduler","securityContext": {},"terminationGracePeriodSeconds": 30}},"updateStrategy": {"rollingUpdate": {"partition": 0},"type": "RollingUpdate"}}
}

在这里插入图片描述

k8s集群查看,statefunset创建成功
在这里插入图片描述

更新statefulset:
我们将updateStrategy下的partition改为2
在这里插入图片描述

集群中查看,修改成功
在这里插入图片描述

查看statefulset列表:
在这里插入图片描述

获取statefulset详情:
在这里插入图片描述

删除statefulset:
在这里插入图片描述

3. Daemonset的功能开发

类似的,复制,修改

先添加路由
routers/daemonset.go

package daemonsetimport ("github.com/gin-gonic/gin""jingtian/krm-backend/controllers/daemonset"
)// 实现创建daemonset的接口
func create(daemonsetGroup *gin.RouterGroup) {//具体逻辑写到控制器controller里面daemonsetGroup.POST("/create", daemonset.Create)
}// 实现更新daemonset的接口
func update(daemonsetGroup *gin.RouterGroup) {//具体逻辑写到控制器controller里面daemonsetGroup.POST("/update", daemonset.Update)
}// 删除daemonset
func deletedaemonset(daemonsetGroup *gin.RouterGroup) {daemonsetGroup.GET("/delete", daemonset.Delete)
}// 批量删除daemonset
func deleteList(daemonsetGroup *gin.RouterGroup) {daemonsetGroup.POST("/deleteList", daemonset.DeleteList)
}// 获取daemonset信息
func get(daemonsetGroup *gin.RouterGroup) {daemonsetGroup.GET("/get", daemonset.Get)
}// 列出所有daemonset
func list(daemonsetGroup *gin.RouterGroup) {daemonsetGroup.GET("/list", daemonset.List)
}// RegisterSubRouter 认证子路由
func RegisterSubRouter(g *gin.RouterGroup) {//配置登录功能路由策略daemonsetGroup := g.Group("/daemonset")create(daemonsetGroup)update(daemonsetGroup)deletedaemonset(daemonsetGroup)get(daemonsetGroup)list(daemonsetGroup)deleteList(daemonsetGroup)}

在这里插入图片描述

注册到总路由
在这里插入图片描述

控制器
controllers/daemonset
在这里插入图片描述

创建daemonset

{"clusterId":"cluster01","namespace":"jingtian","item": {"apiVersion": "apps/v1","kind": "DaemonSet","metadata": {"labels": {"name": "node-exporter"},"name": "node-exporter","namespace": "jingtian"},"spec": {"revisionHistoryLimit": 10,"selector": {"matchLabels": {"name": "node-exporter"}},"template": {"metadata": {"labels": {"name": "node-exporter"}},"spec": {"containers": [{"image": "web:v4","imagePullPolicy": "IfNotPresent","name":"webdaemonset"}],"restartPolicy": "Always","terminationGracePeriodSeconds": 30,"tolerations": [{"effect": "NoSchedule","key": "k8s-master","operator": "Equal","value": "null"},{"effect": "NoExecute","key": "node-role.kubernetes.io/etcd","operator": "Equal","value": "true"},{"effect": "NoSchedule","key": "nexus","operator": "Equal","value": "null"},{"effect": "NoSchedule","key": "node-role.kubernetes.io/control-plane","operator": "Exists"}]}},"updateStrategy": {"rollingUpdate": {"maxUnavailable": 1},"type": "RollingUpdate"}}
}}

在这里插入图片描述

创建成功
在这里插入图片描述

更新daemonset:
我们将最大不可用改为2
在这里插入图片描述

集群查看,更新成功
在这里插入图片描述

查看daemonset列表
在这里插入图片描述

查看daemonset详情
在这里插入图片描述

删除daemonset

在这里插入图片描述

4. cronjob功能开发

路由routers/cronjob.go

package cronjobimport ("github.com/gin-gonic/gin""jingtian/krm-backend/controllers/cronjob"
)// 实现创建cronjob的接口
func create(cronjobGroup *gin.RouterGroup) {//具体逻辑写到控制器controller里面cronjobGroup.POST("/create", cronjob.Create)
}// 实现更新cronjob的接口
func update(cronjobGroup *gin.RouterGroup) {//具体逻辑写到控制器controller里面cronjobGroup.POST("/update", cronjob.Update)
}// 删除cronjob
func deletecronjob(cronjobGroup *gin.RouterGroup) {cronjobGroup.GET("/delete", cronjob.Delete)
}// 批量删除cronjob
func deleteList(cronjobGroup *gin.RouterGroup) {cronjobGroup.POST("/deleteList", cronjob.DeleteList)
}// 获取cronjob信息
func get(cronjobGroup *gin.RouterGroup) {cronjobGroup.GET("/get", cronjob.Get)
}// 列出所有cronjob
func list(cronjobGroup *gin.RouterGroup) {cronjobGroup.GET("/list", cronjob.List)
}// RegisterSubRouter 认证子路由
func RegisterSubRouter(g *gin.RouterGroup) {//配置登录功能路由策略cronjobGroup := g.Group("/cronjob")create(cronjobGroup)update(cronjobGroup)deletecronjob(cronjobGroup)get(cronjobGroup)list(cronjobGroup)deleteList(cronjobGroup)}

在这里插入图片描述

注册总路由
在这里插入图片描述

控制器
在这里插入图片描述

创建cronjob:
我们通过kubectl create -h 查看哪些资源可以通过kubectl create命令行来创建
在这里插入图片描述

我们发现,cronjob是可以的,因此我们可以通过kubectl create --dry-run=client 来导出生成cronjob的json文件
我们可以通过 kubectl create cronjob -h 来查看通过命令行来创建cronjob的示例
在这里插入图片描述

kubectl create cronjob my-job --image=alphinewithlocaltime:v1 --schedule="*/1 * * * *" --dry-run=client -ojson

在这里插入图片描述

{"clusterId":"cluster01","namespace":"jingtian","item": {"kind": "CronJob","apiVersion": "batch/v1","metadata": {"name": "my-job"},"spec": {"schedule": "*/1 * * * *","jobTemplate": {"metadata": {"name": "my-job"},"spec": {"template": {"spec": {"containers": [{"name": "my-job","image": "alphinewithlocaltime:v1","resources": {}}],"restartPolicy": "OnFailure"}}}}},"status": {}
}}

在这里插入图片描述

集群查看,创建成功
在这里插入图片描述

修改cronjob:
我们将调度周期改为每五分钟调度一次
在这里插入图片描述

修改成功
在这里插入图片描述

查看cronjob列表
在这里插入图片描述

查询cronjob详情
在这里插入图片描述

删除cronjob
在这里插入图片描述

删除成功
在这里插入图片描述

5. Replicaset功能实现

我们在执行deployment回滚的时候,需要查询有哪些replicaset。因此,我们也需要对rs的操作管理进行开发实现。
在这里插入图片描述

我们一般不需要去更新或删除rs。只需要查询即可,因此需要有个查询列表和查询详情的功能

一样的,我们需要路由和控制器
routers/replicaset.go

package replicasetimport ("github.com/gin-gonic/gin""jingtian/krm-backend/controllers/replicaset"
)// 获取replicaset信息
func get(replicasetGroup *gin.RouterGroup) {replicasetGroup.GET("/get", replicaset.Get)
}// 列出所有replicaset
func list(replicasetGroup *gin.RouterGroup) {replicasetGroup.GET("/list", replicaset.List)
}// RegisterSubRouter 认证子路由
func RegisterSubRouter(g *gin.RouterGroup) {//配置登录功能路由策略replicasetGroup := g.Group("/replicaset")get(replicasetGroup)list(replicasetGroup)}

在这里插入图片描述

注册到总路由
在这里插入图片描述

控制器
在这里插入图片描述

我们先看下jingtian命名空间下的rs
在这里插入图片描述

查询rs列表
在这里插入图片描述

查询rs详情
在这里插入图片描述

6. 实现节点管理

节点的功能和rs也是比较类似的,它也是去实现查询节点状态,节点详情。更新一些节点的标签,污点等操作。

路由
routers/node.go

package nodeimport ("github.com/gin-gonic/gin""jingtian/krm-backend/controllers/node"
)// 实现更新node的接口
func update(nodeGroup *gin.RouterGroup) {//具体逻辑写到控制器controller里面nodeGroup.POST("/update", node.Update)
}// 获取node信息
func get(nodeGroup *gin.RouterGroup) {nodeGroup.GET("/get", node.Get)
}// 列出所有node
func list(nodeGroup *gin.RouterGroup) {nodeGroup.GET("/list", node.List)
}// RegisterSubRouter 认证子路由
func RegisterSubRouter(g *gin.RouterGroup) {//配置登录功能路由策略nodeGroup := g.Group("/node")update(nodeGroup)get(nodeGroup)list(nodeGroup)}

在这里插入图片描述

注册到总路由
在这里插入图片描述

node控制器
在这里插入图片描述

查看node列表
在这里插入图片描述

查询node详情
在这里插入图片描述

更新node标签或者注解
我们将查询节点详情里面item里面的json拿出来,其他的status等全部删除,对标签或注解稍作修改。
添加一个注解

{"clusterId":"cluster01","name":"node01","item": {"kind": "Node","apiVersion": "v1","metadata": {"name": "node01","uid": "96bf47a9-15ac-4e09-929c-754ed361c890","resourceVersion": "2139695","creationTimestamp": "2024-06-20T08:33:12Z","labels": {"beta.kubernetes.io/arch": "amd64","beta.kubernetes.io/os": "linux","kubernetes.io/arch": "amd64","kubernetes.io/hostname": "node01","kubernetes.io/os": "linux","node-role.kubernetes.io/worker": "true"},"annotations": {"kubeadm.alpha.kubernetes.io/cri-socket": "unix:///var/run/containerd/containerd.sock","node.alpha.kubernetes.io/ttl": "0","projectcalico.org/IPv4Address": "10.10.0.11/24","projectcalico.org/IPv4IPIPTunnelAddr": "172.29.55.0","volumes.kubernetes.io/controller-managed-attach-detach": "true","jingtian":"true"}},"spec": {"podCIDR": "172.16.1.0/24","podCIDRs": ["172.16.1.0/24"]}}
}

在这里插入图片描述

集群查看,添加成功
在这里插入图片描述

添加标签
在这里插入图片描述

集群查看,添加成功
在这里插入图片描述

当然也可以删除注解,删除标签,添加删除污点等操作,感兴趣的朋友试试吧!

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词