在云计算技术日新月异的时代,云原生概念逐渐从幕后走到台前,成为推动数字化转型的重要力量。今天,我们将一起深入探讨云原生中的一个核心组件——控制器(Controller) ,特别是它在Kubernetes中的应用与实现。同时,我们还将揭秘如何开发自己的Operator,以应对日益复杂的业务需求。
一、什么是云原生
云原生开发是一种利用云平台优势,通过微服务、容器、服务网格、不可变基础设施等技术手段,构建弹性、可靠、自动化的云原生应用的开发模式。这种开发模式极大地提升了应用的弹性、可扩展性、自动化和敏捷性,是现代软件开发的重要趋势。
二、控制器:Kubernetes的幕后英雄
在Kubernetes的世界里,控制器扮演着至关重要的角色。它是负责管理应用程序在Kubernetes集群中运行状态的“大脑”。通过不断监视集群中的对象,并根据用户定义的期望状态与实际状态之间的差异进行调整,控制器确保了应用程序能够按照预期稳定运行。
1、控制器模型
控制器模型通过控制循环(Control Loop)将Kubernetes内部的资源调整为声明式API对象期望的样子,通过不断地监控和调整集群的状态,确保实际状态(Current State)接近期望状态(Desired State)。控制器模型分为两部分。
控制器定义
控制器实际上都是由上半部分的控制器定义(包括期望状态),加上下半部分的被控制对象的模板组成的。如下图所示:
图1-1 控制器定义
控制循环
控制器是控制循环的一部分,持续观察 Kubernetes 集群的状态,并采取行动使实际状态向期望状态靠拢。控制器通过与 Kubernetes API 服务器交互,创建、更新或删除资源,间接管理集群状态。
用一段Go语言风格的伪代码,描述这个控制循环:
for {
actualState := GetResourceActualState(rsvc)
// 控制器模板定义
expectState := GetResourceExpectState(rsvc)
if actualState == expectState {
// do nothing
} else {
// 编排逻辑,调谐的最终结果一般是对被控制对象的某种写操作,比如增/删/改 Pod
Reconcile(rsvc)
}
}
2、控制器List/Watch原理
图2-1 控制器List/Informer机制(图片来源于网络)
如上图所示,控制器Informer List/Informer工作原理如下:
-
Informer通过Reflector包,与APIServer建立连接,使用ListAndWatch方法监控特定资源对象实例的变化;
-
APIServer的资源对象实例发生变化(Add,Update,Delete),Reflector会收到“事件通知”,放入Delta FIFO Queue队列中;
-
Informer(执行processLoop方法)会不断从Delta FIFO Queue里读取增量。每拿到一个增量,Informer就会判断增量里的事件类型,然后创建/更新/删除本地对象的缓存(local store);
-
缓存更新之后,Delta FIFO Queue会pop事件到Controller,Controller会调用预先注册的ResourceEventHandler回调函数进行处理;
-
Controller从工作队列中取出API对象(<namespace>/<name>),并启动一个worker执行相应的调协逻辑。
三、Kubernetes内置控制器概览
Kubernetes内置了多种类型的控制器,每一种都承担着特定的职责:
Node Controller :负责监控节点的状态,处理节点故障,并在必要时进行清理。
Namespace Controller :管理命名空间资源的生命周期,包括创建、删除和更新。
ResourceQuota Controller :控制资源配额,防止资源过度使用。
Deployment Controller :提供应用的声明式更新能力,确保Pod副本的数量和状态符合预期。
StatefulSet Controller :管理有状态应用的部署,提供稳定的持久化存储和唯一网络标识符。
DaemonSet Controller :确保所有(或某些)节点上运行指定数量的Pod副本,常用于集群守护进程。
ReplicaSet Controller :确保Pod副本数量始终符合预期,是Deployment控制器的底层实现。
Service Controller和 Endpoint Controller :维护后端Pods与Service之间的连接,提供负载均衡功能。
四、自定义Operator:云原生的扩展利器
随着大数据、人工智能等领域的发展,原生Kubernetes内置资源在某些复杂场景下显得力不从心。因此,开发特定的资源和控制器成为了必然选择。Operator正是由Kubernetes自定义资源(CRD)和控制器构成的云原生扩展服务,它允许开发者根据业务需求自定义资源和控制器,实现面向领域知识的业务逻辑控制。
开发 Operator 是一项高级技能,它要求开发者不仅要熟悉 Kubernetes,还要能够编写复杂的业务逻辑,工具的选择至关重要。目前,比较流行的工具有Operator-SDK和Kubebuilder。它们都是基于ControllerRuntime的封装,但Kubebuilder由Kubernetes SIG官方团队打造,因此更受推荐。以下是开发 Operator 的基本步骤:
1、安装 Kubebuilder:从官方 release页面下载或使用自动化脚本安装。
curl -Lo ./kubebuilder https://github.com/kubernetes-sigs/kubebuilder/releases/download/v4.1.0/kubebuilder_linux_amd64
chmod +x ./kubebuilder
sudo mv kubebuilder /usr/local/bin
2、创建项目:使用 kubebuilder init 初始化项目结构。
mkdir demo
go mod init demo
kubebuilder init --domain com.ebcloud --skip-go-version-check
3、定义 CRD:通过 kubebuilder create api 创建 CRD,并定义资源结构。
kubebuilder create api --group ebcloud --version v1 --kind demo
4、编写业务逻辑:在控制器代码中实现自定义的业务逻辑。
5、测试和部署:在本地集群或云环境中测试 Operator,确保其按预期工作。
6、持续迭代:根据反馈持续优化 Operator,提升应用的稳定性和性能。
结语
希望这篇文章能帮助您更好地理解云原生控制器和Operator的概念,以及如何开发自己的Operator。控制器作为Kubernetes的核心组件,是确保应用稳定运行的关键。而自定义Operator,则为云原生应用提供了更为灵活的扩展能力。掌握这些技术,将帮助你更好地应对复杂的业务需求,推动业务的快速发展。通过 Kubernetes 控制器和 Operator,我们能够构建出更加智能、自动化的云应用。现在,就让我们一起踏上云原生的旅程,探索无限可能!
文章作者:李光耀
原文始发于微信公众号(EBCloud):云原生控制器解析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论