Client-go操作Deployment

news/2024/11/17 4:35:14/

在工作中需要对kubernetes进行自定义资源的开发,操作K8s的资源肯定是必不可少的。K8s原生语言是用Go编写的,所以在CRD中使用client-go来操作资源。本次介绍一下使用client-go来操作Deployment。

1. 创建main函数

func main() {homePath := homedir.HomeDir()if homePath == "" {panic("homePath is empty")}kubeConfig := filepath.Join(homePath, ".kube", "config")config, err := clientcmd.BuildConfigFromFlags("", kubeConfig)if err != nil {panic(err)}// use the config to create a clientclientSet, err := kubernetes.NewForConfig(config)if err != nil {panic(err)}dpClient := clientSet.AppsV1().Deployments(corev1.NamespaceDefault)log.Println("start handle deployments...")// 创建一个deploymenterr = createDeployment(dpClient)if err != nil {panic(err)}log.Println("create deployment success")<-time.Tick(time.Minute * 1)// 修改一个deploymenterr = updateDeployment(dpClient)if err != nil {panic(err)}log.Println("update deployment success")<-time.Tick(time.Minute * 1)// 删除一个deploymenterr = deleteDeployment(dpClient)if err != nil {panic(err)}log.Println("delete deployment success")
}

这里创建了一个main函数,首先获取到kubernetes配置文件并创建出clientSet,再使用clientSet创建出来操作deployment的客户端。

随后定义了三个函数,分别是:

创建Deployment:createDeployment

修改Deployment:updateDeployment

删除Deployment:deleteDeployment

2. 创建Deployment

接下来编写createDeployment函数,此函数将在kubernetes集群中生成Deployment

func createDeployment(dpClient v1.DeploymentInterface) error {replicas := int32(3)newDp := appv1.Deployment{ObjectMeta: metav1.ObjectMeta{Name: "nginx-deployment",},Spec: appv1.DeploymentSpec{Replicas: &replicas,Selector: &metav1.LabelSelector{MatchLabels: map[string]string{"app": "nginx",},},Template: corev1.PodTemplateSpec{ObjectMeta: metav1.ObjectMeta{// 这里的label要和上面的selector的label一致Labels: map[string]string{"app": "nginx",},},Spec: corev1.PodSpec{Containers: []corev1.Container{{Name:  "nginx",Image: "nginx:1.16",Ports: []corev1.ContainerPort{{ContainerPort: 80,Name:          "http",Protocol:      corev1.ProtocolTCP,},},},},},},},}_, err := dpClient.Create(context.TODO(), &newDp, metav1.CreateOptions{})if err != nil {return err}return nil
}

定义副本数量3个,编写Deployment配置,定义ObjectMeta、Spec、Template各种参数

这里提一句Selector中"app": “nginx” 和 Template中是一样的,因为Deployment是通过标签关连到所属副本中pod的

3. 修改Deployment

在接下来的操作中,将nginx的版本变更一下,来达到修改的目的

func updateDeployment(dpClient v1.DeploymentInterface) error {dp, err := dpClient.Get(context.TODO(), "nginx-deployment", metav1.GetOptions{})if err != nil {return err}dp.Spec.Template.Spec.Containers[0].Image = "nginx:1.17"updateDp, err := dpClient.Update(context.TODO(), dp, metav1.UpdateOptions{})if err != nil {return err}return retry.RetryOnConflict(retry.DefaultRetry, func() error {_, err := dpClient.Update(context.TODO(), updateDp, metav1.UpdateOptions{})return err})
}

此处的操作为现将之前创建好的dp获取到,然后进行nginx镜像版本的变更,随后进行使用客户端进行更新操作

此外还通过retry.RetryOnConflict来解决更新冲突

4. 删除Deployment

func deleteDeployment(dpClient v1.DeploymentInterface) error {deletePolicy := metav1.DeletePropagationForegrounderr := dpClient.Delete(context.TODO(), "nginx-deployment", metav1.DeleteOptions{PropagationPolicy: &deletePolicy,})if err != nil {return err}return nil
}

这里的删除操作定义了删除选项,表示前台级联删除。在这种模式下,删除操作会首先返回删除的资源,然后在后台删除关联的依赖对象。在 Kubernetes API 中,前台级联删除的表现形式是:首先将删除的对象的 metadata.deletionTimestamp 字段设置为当前时间,然后客户端会在此对象的 metadata.finalizers 列表中看到值 foregroundDeletion。在依赖对象被删除后,Kubernetes 垃圾收集器会最后删除这个对象。

5. build

代码编写完成打包成二进制

go build -o ./handle_deployment

此时观察deployment所有流程效果

完整代码地址:https://github.com/xiaowei6688/k8s_go_example/tree/dev/handle_deployment


http://www.ppmy.cn/news/1014563.html

相关文章

你真的懂OP吗?知道什么是OP吗?看完你就懂了!

运维到底是干什么的&#xff1f;估计连运维工程师本身都不清楚&#xff0c;小编各种搜索也没找到答案&#xff0c;问了很多运维老员工&#xff0c;终于总结出了运维工程师的工作内容。 01运维的定义本质上是对网络、服务器各个阶段的运营与维护&#xff0c;在成本、稳定性、效率…

优思学院|成功「质量工程师」的关键技能

质量工程师是一个需要耐心、细心、坚持态度、沟通能力、协调能力的工作&#xff0c;更需要持续学习强化自身的专业知识。 质量工程师负责审核、客户投诉的调查、过程的改进以达到质量之提升&#xff0c;他們也必须要预警生产线风险、质量异常&#xff0c;并且协调不同的部門一…

Day 24 C++ deque容器

文章目录 deque容器基本概念定义特点双端性动态大小随机访问插入和删除高效内存管理迭代器支持 deque与vector区别内部工作原理 deque构造函数函数原型 deque赋值操作函数原型 对vector容器的大小操作函数原型注意 deque 插入和删除函数原型两端插入操作指定位置操作总结 示例 …

Flask进阶:构建RESTful API和数据库交互

在初级教程中&#xff0c;我们已经介绍了如何使用Flask构建基础的Web应用。在本篇中级教程中&#xff0c;我们将学习如何用Flask构建RESTful API&#xff0c;以及如何使用Flask-SQLAlchemy进行数据库操作。 一、构建RESTful API REST&#xff08;Representational State Tran…

网络安全进阶学习第十二课——SQL手工注入3(Access数据库)

文章目录 注入流程&#xff1a;1、判断数据库类型2、判断表名3、判断列名4、判断列数1&#xff09;判断显示位 5、判断数据长度6、爆破数据内容 注入流程&#xff1a; 判断数据库类型 ——> 判断表名 ——> 判断列名 ——> 判断列名长度 ——> 查出数据。 asp的网…

『CV学习笔记』docker和nvidia-docker离线安装

docker和nvidia-docker离线安装 文章目录 1. docker的deb包下载链接2. nvidia-docker 的deb包下载3. 重启 docker4. 检验安装5. 参考文献这里是ubuntu操作系统, 如果是其他的操作系统,则需要安装对应的deb包1. docker的deb包下载链接 https://download.docker.com/linux/ubun…

(十四)大数据实战——hadoop集群一键式高可用实现自动故障转移与故障初始化恢复

前言 本节内容延续前面几节内容,综合性的实现hadoop集群的高可用以及hadoop集群故障初始化的恢复,通过一个脚本,实现整个集群的高可用启停与状态观测。主要是zookeeper、hdfs、yarn等服务的高可用集群的一键式启停。 正文 hadoop高可用集群整体规划hadoop高可用集群服务规…

oracle的管道函数

Oracle管道函数(Pipelined Table Function)oracle管道函数 1、管道函数即是可以返回行集合&#xff08;可以使嵌套表nested table 或数组 varray&#xff09;的函数&#xff0c;我们可以像查询物理表一样查询它或者将其赋值给集合变量。 2、管道函数为并行执行&#xff0c;在…