Kubernetes 自定义控制器开发

k8s 实现自定义控制器-原理篇 文章最开头实现的控制器虽然也能实现控制器功能,但并不是官方推荐的编程模式,现在来看下官方推荐的自定义控制器的编程模式。在之前直接写informer.AddEventHandler不同,这里引入了一个工作队列,EventHandler里的逻辑就是把收到的消息发送到工作队列中,然后有一段代码不断从工作队列中消费消息,而这段代码就被称作control loop 控制循环。client 包提供了现成的工作队列。 阅读详情

目录

前言

一、CRD

二、创建数据库表(Mysql)

二、控制器开发

1.使用kubernetes的examplecontroller模板

2.在controller.go 中新增数据表监听方法

3.修改tools工具生成资源对象结构体定义

   

这里记录开发k8s控制器的一般方式,controller开发主要使用k8s提供的client-go库进行。



前言

        Controller监听集群内部资源对象的变化,编辑资源对象(增、删、改、查),根据不同与定义规则,对资源对象的当前状态进行调整。

一、CRD

        CustomResourceDefinitions   资源定义对象

                在集群内新增资源对象,和Controller配合使用可以进行集群扩展。

         Custom resources  自定义资源描述对象

                自定义资源对象的描述对象,它表示集群内一组对象集合。

定义了一个新的资源对象,它用于描述如何部署新应用。

新资源对象类别:ExampleRes

资源对象新增的属性:  

        deploymentName 部署deployment名称

        replicas 副本数量

        app 应用名称

        cluster 应用的部署名称

        image 使用的镜像名称

apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: samplecontroller.k8s.io
spec:
  group: samplecontroller.k8s.io
  versions:
    - name: v1alpha1
      served: true
      storage: true
      schema:
        openAPIV3Schema:
          type: object
          properties:
            spec:
              type: object
              properties:
                deploymentName:
                  type: string
                replicas:
                  type: integer
                  minimum: 1
                  maximum: 10
                app:
                  type: string
                cluster:
                  type: string
                image:
                  type: string
            status:
              type: object
              properties:
                availableReplicas:
                  type: integer
      subresources:
        status: {}
  names:
    kind: ExampleRes
    plural: exampleres
  scope: Namespaced

二、创建数据库表(Mysql)

        创建数据表,controller会监听这张表的数据变化,并创建出自定义资源对象及部署应用的资源对象

        

create table kubernetes_task
(
    id int primary key auto_increment,
    app varchar(100) null comment '应用名称',
    cluster varchar(100) null comment '部署名称',
    `image` varchar(100) null comment '使用的镜像名称',
    instances int null comment '副本数量',
    `status` varchar(50) null comment '部署状态,由k8s回写',
    writetime datetime null comment '记录写入时间',
    updatetime datetime null comment 'k8s处理时间'
)

二、控制器开发

1.使用kubernetes的examplecontroller模板

        可以使用kubernetes默认生成的controller模板,也可以使用k8s提供的tools重新生成。

2.在controller.go 中新增数据表监听方法

        该方法采用协程+延时周期性运行,读取mysql数据表中的新增数据,并部署deployment资源对象。

func (c *Controller) WatchEtcp() {
	var err error
	db_conn, err = sql.Open("mysql", "用户:密码+@tcp(IP:端口)/数据库名?charset=utf8&parseTime=True")

	go func(_c *Controller) {
		var rows *sql.Rows
		for {

			time.Sleep(time.Second * 3)
			rows, err = db_conn.Query("select id,app,cluster,image,instances,writetime from kubernetes_task where updatetime is null")
			if err != nil {
				klog.Error(err)
				continue
			}
			for rows.Next() {
				var task K8STask = K8STask{}
				err = rows.Scan(&task.id, &task.app, &task.cluster, &task.image, &task.instances, &task.writetime)
				if err != nil {
					klog.Error(err)
					continue
				}

				foo := samplev1alpha1.ExampleRes{ObjectMeta: metav1.ObjectMeta{Name: fmt.Sprintf("exampleapp-%s-%s", task.app, task.cluster)}, Spec: samplev1alpha1.FooSpec{DeploymentName: "exampleapp-api",
					Replicas: &task.instances, App: task.app, Cluster: task.cluster, Image: task.image}}

				_, err = _c.sampleclientset.SamplecontrollerV1alpha1().Foos("default").
					Create(context.TODO(), &foo, metav1.CreateOptions{})
				if err != nil {
					klog.Error(err)
					continue
				} else {
					db_conn.Exec("update kubernetes_task set updatetime=now(),`status`='已部署' where id=?", task.id)
					klog.Info(fmt.Sprintf("create %s %s %s", task.app, task.cluster, task.image))
				}
			}
			rows.Close()
		}
	}(c)
}

3.修改tools工具生成资源对象结构体定义

        该结构体用于controller处理资源对象时序列化。

type ExampleRes struct {
	metav1.TypeMeta   `json:",inline"`
	metav1.ObjectMeta `json:"metadata,omitempty"`

	Spec   ExampleResSpec   `json:"spec"`
	Status ExampleResStatus `json:"status"`
}

type ExampleResSpec struct {
	DeploymentName string `json:"deploymentName"`
	Replicas       *int32 `json:"replicas"`
	App            string `json:"app"`
	Cluster        string `json:"cluster"`
	Image          string `json:"image"`
}

   

这里记录开发k8s控制器的一般方式,controller开发主要使用k8s提供的client-go库进行。

k8s自定义controller三部曲之三:编写controller代码 在这个部分总结了2019年到目前为止Java常见面试问题,取其面试核心编写成这份文档笔记,从中分析面试官的心理,摸清面试官的“套路”,可以说搞定90%以上的Java中高级面试没一点难度。本节总结的内容涵盖了:消息队列、Redis缓存、分库分表、读写分离、设计高并发系统、分布式系统、高可用系统、SpringCloud微服务架构等一系列互联网主流高级技术的知识点。(上述只是一个整体目录大纲,每个点里面都有如下所示的详细内容,从面试问题——分析面试官心理——剖析面试题——完美解答的一个过程) 阅读详情

相关推荐

【k8s】——自定义的k8s controller

一、前言 在 K8s 中当我们需要监控某个资源的变化并作一系列操作时,使用 K8s 提供的 controller 机制来实现,同时 K8s 官方提供了一个通用库client-go,通过它可以很容易实现自定义controller.Custom Resource是扩展Kubernetes的一种方式(另外一种就是通过聚合层APIapiserver-aggregation),而controller对指定的resource进行监听和执行对应的动作(watch,diff,action)。这里引申一点,我们一般来说..

汤庆 4518

K8S中编写自己的CRD及Controller简明指南

Table of Contents 一、背景 二、环境准备及基本开发流程 1、Golang 环境搭建 1.1 Golang 语言版本 1.2 Golang 环境配置 2、CRD Controller 开发环境搭建 2.1、使用时的一些注意事项 3、CRD Controller的开发逻辑 4、CRD controller的测试与部署 三、演示 3.1 构架代码生成 3.1.1 采用 GOPATH 来生成 3.1.2 采用 go mod 来生成 3.2 验证生成的代码 3.2.1

qianggezhishen的专栏 1万+

K8S学习指南(68)-开发自定义控制器

使用以下命令创建一个名为Todo这将生成文件,其中包含了Todo对象的定义。使用 KubeBuilder 开发自定义 Controller 是一种高效且规范的方式,它遵循约定优于配置的原则,使得开发者能够更专注于业务逻辑的实现。通过代码生成和模板化的设计,大大简化了控制器和 CRD 的开发流程。希望本文的示例和步骤能够帮助你更好地理解和使用 KubeBuilder 这一工具集。在实际项目中,可以根据业务需求扩展和定制生成的代码,以满足更复杂的场景。

俞兆鹏的博客 1384

K8S控制器

被控制对象的定义,则来自于一个"模板".比如,Deployment里的template字段.可以看到,Deployment这个template字段里的内容,跟一个标准的Pod对象的API定义,丝毫不差.而所有被这个Deployment管理的Pod实例,其实都是根据这个template字段的内容创建出来的.控制器是个好东西,要学会选择适合的控制器,以达到生产需求httpshttpshttpshttpshttps。...

L2111533547的博客 2184

Go Operator开发:Kubernetes自定义控制器

operator-sdk脚手架生成Operator项目骨架。核心是CRD定义,用Go结构体描述自定义资源的spec和status。package v1import (// RedisClusterSpec 定义Redis集群的期望状态// 节点数量// Redis镜像版本// 每个节点的存储大小// Redis密码// RedisClusterStatus 记录集群的当前状态// 已就绪的节点数// 集群阶段: Creating, Running, Scaling, Failed。

白话机器学习 109

关于图像傅里叶变换得到的频谱图的通俗理解

傅里叶变换过程: 经过傅里叶变化且频谱居中化处理的频谱图: 1.如果将图像某一行上的灰度变化看作是一个离散信号,那么整张图像可以看作是一个分布在二维平面上的信号,因此图像可看作是空间域信号。傅里叶变换则是将图像灰度分布(空间域信号)变换到了频域上,给我们提供了观察图像的另一个视角。 2.图像的频谱图(频谱居中后)的中心点是频率最低点,以该点为圆心,不同半径的上的点表示不同的频率。这里的图像频率是指对应原图像中的某灰度曲线变化的快慢(这么说不严谨,但是按照上面第1点的角度,似乎也可以这么理解

daimashiren的博客 2万+

Kubernetes 1.29 自定义资源(CRD)开发:开源云原生项目扩展 K8s 功能(自定义控制器)实战

自定义资源(CRD)是扩展 Kubernetes API 的核心机制,允许用户定义自己的资源类型。CRD 定义:声明资源类型(如MyAppCR 实例:具体资源配置(如。

2501_93877768的博客 549

RPCA模型及GoDec算法

一、基础知识 在线性代数中,秩的物理意义是矩阵中最大的不相关的向量个数,因此秩可以用来度量相关性;而在图像处理中,秩就可以理解为图像中所包含的信息的丰富程度。图片中比较突兀的成分,会增加图像矩阵的秩,一幅清晰的自然图像其数据矩阵往往是低秩或者近似低秩的,这是因为其中的图像信息有很大的相关性,但如果图像中引入噪声,那么存在随机幅值任意大但是分布稀疏的误差破坏了原有数据的低秩性。 低秩矩阵:如果AAA是一个m×nm×nm×n的矩阵,rank(A)rank(A)rank(A)是矩阵AAA的秩,如果rank(A)

小席的学习日志 7687

K3s自定义控制器开发终极指南:如何扩展Kubernetes功能

K3s作为轻量级的Kubernetes发行版,在资源受限环境和物联网设备中广受欢迎。对于想要深入定制Kubernetes功能的开发者来说,掌握K3s自定义控制器开发技巧至关重要。本文将详细介绍如何在K3s中开发自定义控制器,扩展Kubernetes功能,实现业务逻辑的自动化管理。 ## 📦 什么是K3s自定义控制器? 自定义控制器是Kubernetes扩展机制的核心组件,它允许开发者监听集群

gitblog_00289的博客 1735

告别配置噩梦:用Vcpkg三行命令为Easy3D自动安装Boost、CGAL和Qt(VS2022实测)

本文详细介绍了如何使用Vcpkg工具在VS2022环境下为Easy3D项目一键安装Boost、CGAL和Qt等依赖库,解决传统手动配置的复杂性问题。通过三行简单命令即可自动完成下载、编译和路径配置,大幅提升开发效率,特别适合C++开发者快速搭建3D图形开发环境。

weixin_42525582的博客 210

HITS算法详解及代码实现

占坑

蓁蓁尔的博客 7461

Kubernetes 自定义控制器开发:从 Informer 机制到 CRD 状态调和

metadata:spec:names:versions:schema:spec:modelName:replicas:minimum: 1default: 1image:status:phase:items:type:status:message:status: {}Kubernetes 自定义控制器的开发核心,是理解 Informer 机制的缓存模型和 Reconcile 循环的幂等性要求。

m0_50889382的博客 1423

异构图中的注意力机制网络:节点级别和语义级别的注意力(Python实现)

在本文中,我们介绍了如何使用Python实现异构图中的节点级别注意力和语义级别注意力。通过语义级别注意力,我们可以根据节点的语义信息对节点进行加权聚合。在本文中,我们将介绍如何使用Python实现异构图中的注意力机制网络,包括节点级别的注意力和语义级别的注意力。最后,我们使用注意力权重对节点特征进行加权聚合,得到聚合后的节点表示。然后,将聚合后的节点表示传递给语义级别注意力模型,根据节点的语义信息进行加权聚合,得到最终的表示。函数中,首先使用节点级别注意力模型对节点特征进行聚合,得到聚合后的节点表示。

HackNebulaZ的博客 485

Kubernetes自定义资源终极指南:MicroK8s中的CRD创建与控制器开发

想要在Kubernetes中扩展API功能?自定义资源定义(CRD)就是你的答案!MicroK8s作为轻量级Kubernetes发行版,为开发者提供了完整的CRD创建和控制器开发环境。无论你是Kubernetes新手还是经验丰富的开发者,这份完整指南都将带你掌握CRD的核心概念和实战技巧。🚀 ## 什么是Kubernetes自定义资源(CRD)? 自定义资源定义(CRD)是Kubernete

gitblog_00773的博客 677

996引擎 - 读写变量性能测试

单轮100万次读写,取3轮平均耗时(毫秒),有效读取率均为100%,数值越小性能越优。

灵台方寸山斜月三星洞 244

Apollo Planning2.0决策规划算法代码详细解析 (1):环境搭建

1、官方提供连接:git clone https://github.com/ApolloAuto/application-pnc.git。此外,也更新了dreamview对pnc的支持,使得调试更加方便。apollo开源团队近期更新了planning版本,对代码进行了一定程度上的重构。(2)进入docker,并编译整个工程:./apollo.sh build_dbg。下载项目环境后使用aem进行环境配置;2、有一定基础建议直接拉取最新代码,自己手动进行编译。(1)环境安装: ./dev_start.sh。

自动驾驶Player的博客 1840

Kubernetes CRD 开发:自定义资源与 Operator 控制器的实现

Kubernetes 的 CRD(Custom Resource Definition)允许您扩展 Kubernetes API,定义自定义资源(如数据库实例或应用配置),而 Operator 是一种自动化模式,通过自定义控制器(Controller)来管理这些资源的状态。Operator 控制器监视自定义资源的变化,并执行调和(Reconciliation)逻辑,确保实际状态与期望状态一致。下面我将逐步解释开发过程,包括 CRD 定义和 Operator 控制器实现。

2501_93894240的博客 569

控制算法研发工程师(博士)职位深度解析与面试指南

摘要:广东万和新电气股份有限公司招聘控制算法研发工程师(博士),工作地点佛山顺德。职位要求2026届博士学历,电子信息工程或控制科学与工程专业。主要职责包括:1)燃气热水、热泵等系统的电控软件设计与优化;2)开发PID、模糊控制、ADRC、MPC等智能算法,应用于恒温控制、变频调节等场景。重点考察算法研发能力、系统稳定性优化及嵌入式实现经验。该职位提供三年资深工程师培养计划,需具备扎实的控制理论基础和工程实践能力,能够处理非线性系统、多工况自适应等复杂控制问题。

郑伟强dev的专栏 139

Kubernetes自定义控制器实战:从CRD定义到Operator开发全解析

在云原生架构中,声明式API和控制器模式是实现自动化运维的核心机制。其原理是通过定义资源的期望状态,由控制器持续调和实际状态,最终达到声明的一致性。这一模式的技术价值在于将领域知识编码为可复用的自动化逻辑,极大提升了复杂应用的生命周期管理效率。典型的应用场景包括数据库实例的自动化部署、中间件的配置管理以及自定义工作流的编排。本文聚焦于Kubernetes平台,深入探讨如何通过CustomResourceDefinition(CRD)定义自定义资源,并结合控制器开发框架构建生产级Operator,实现从“资源

weixin_30781775的博客 325

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

终极指南:ElasticJob K8s Operator开发 - 自定义资源与控制器实战

ElasticJob是一款功能强大的分布式调度任务框架,它能够帮助开发者在Kubernetes环境中实现任务的弹性调度、分片执行和高可用管理。本指南将带您深入了解如何开发ElasticJob K8s Operator,通过自定义资源和控制器实现任务的自动化管理与运维,让分布式任务调度变得简单高效。 ## ElasticJob核心架构与K8s集成优势 ElasticJob的Lite架构采用无中心

gitblog_01172的博客 922

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

直击 OpenShift 与 Kubernetes (K8s) 的核心差异

对比维度Kubernetes (原生)OpenShift (企业版 K8s)定位核心编排引擎 (Kernel)完整的应用平台 (Distribution/OS)开发者体验需要开发者精通 Dockerfile 和 CI/CD 工具提供 S2I、Web IDE、CI/CD 流水线,对开发者友好安全性默认宽松,需要管理员手动加固默认安全,内置 SCC、OAuth,租户隔离强网络提供 Ingress 规范,需自备 Controller内置 Route 和 Ingress Controller,开箱即用。

u011091936的博客 866

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Kubernetes开发指南:如何使用client-go和operator-sdk构建自定义控制器

Kubernetes作为云原生时代的操作系统,其强大的可扩展性让开发者能够构建自定义控制器来管理复杂应用。本文将详细介绍如何使用client-go和operator-sdk这两个核心工具,从零开始构建功能完备的Kubernetes自定义控制器和Operator。无论你是想要扩展Kubernetes功能,还是希望将运维知识代码化,这篇完整指南都将为你提供清晰的路径和实用技巧。 ## 为什么需要自定

gitblog_02903的博客 729

Kubernetes Python Client控制器管理器:自定义资源控制器

在Kubernetes(简称K8s)生态中,自定义资源(Custom Resource, CR)和自定义资源定义(Custom Resource Definition, CRD)为用户提供了扩展K8s API的能力。而自定义资源控制器(Custom Resource Controller)则是实现CR业务逻辑的核心组件,它通过监听CR的变化并协调系统状态,确保实际状态与期望状态一致。本文将介绍如何...

gitblog_00804的博客 705

Kubernetes自定义资源与控制器开发:从CRD定义到Operator实践

在云原生技术体系中,声明式API和控制器模式是实现自动化运维与系统自愈的核心机制。其原理在于通过定义资源的期望状态,并由控制器持续观测实际状态,通过调谐循环驱动两者最终一致,从而构建出具备高度弹性和自管理能力的分布式系统。这一模式的技术价值在于将基础设施的运维逻辑代码化、自动化,极大提升了复杂应用的生命周期管理效率。在Kubernetes生态中,这一理念被广泛应用于服务部署、配置管理、网络策略等场景。本文聚焦于Kubernetes的扩展性基石——自定义资源定义(CRD)与控制器,深入解析如何通过定义CRD来

weixin_30832405的博客 356

Kubernetes 客户端 Go 库:k8s-client-go

Kubernetes 客户端 Go 库:k8s-client-go 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 k8s-client-go 是一个轻量级的开源项目,专为开发者提供了一组实用的 Go 语言示例,演示了如何使用 Kubernetes 的官方客户端库 client-go 与 Kubernetes 集群进行交互。这个项目不仅涵盖了基本的连接和操作,还深入到了...

gitblog_00049的博客 641
上一篇: Linux内核-tasklet微任务
下一篇: Golang运行时垃圾收集原理及调优
IT回忆录
博客等级 码龄16年 42粉丝 100原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值