K8S⼆次开发04-⾃定义operator(operator-sdk调试)
Operator 是 Kubernetes 的扩展软件,它利⽤ 定制资源 管理应⽤及其组件。 Operator 遵循 Kubernetes 的理念,特别是在控制器 ⽅⾯。
Operator操作那些有状态的基础设施服务,包括:组件升级、节点恢复、调整集规模。⼀个理想化的运维平台必须是Operator⾃⼰维护有状态应⽤,并将⼈⼯⼲预降低到最低限度
什么是Operator?
为了理解什么是Operator,让我们先复习⼀下Kubernetes。Kubernetes实际是期望状态管理器。先在Kubernetes中指定应⽤程序期望状态(实例数,磁盘空间,镜像等),然后它会尝试把应⽤维持在这种状态。Kubernetes的控制平⾯运⾏在Master节点上,它包含数个controller以调和应⽤达到期望状态:
检查当前的实际状态(Pod、Deployment等)
将实际状态与spec期望状态进⾏⽐较
如果实际状态与期望状态不⼀致,controller将会尝试协调实际状态以达到⼀致
⽐如,通过RS定义Pod拥有3个副本。当其中⼀个Pod down掉时,Kubernetes controller通过wacth API发现期望运⾏3个副本,⽽实际只有2个副本在运⾏。于是它新创建出⼀个Pod实例。
controller作⽤
如图所⽰,controller在Kubernetes中发挥的作⽤。
通过Kubectl命令发送对象spec定义(Pod,Deployment等)到Kubernetes Master节点的API服务
Master节点调度对象运⾏
⼀旦对象运⾏,controller会持续检查对象并根据spec协调实际情况
通过这种⽅式,Kubernetes⾮常适合维护⽆状态应⽤。但它本⾝的资源类型
(Pod,Deployments,Namespaces,Services,DaemonSets等)⽐较有限。虽然每种资源类型都预定了⾏为及协调⽅式,但它们的处理⽅式没有多⼤差别。
现在,如果您的应⽤更复杂并需要执⾏⾃定义操作以达到期望的运⾏状态,应该怎么办?
举⼀个有状态应⽤的例⼦。假如⼀个数据库应⽤运⾏在多个节点上。如果超过半数的节点出现故障,则需要按照特定步骤从特定快照中加载数据。使⽤原⽣Kubernetes对象类型和controller则难以实现。或者为有状态应⽤程序扩展节点,升级到新版本或灾难恢复。这些类型的操作通常需要⾮常具体的步骤,并且通常需要⼿动⼲预。
controller系统结构
使⽤ CRD 定制资源后,仅仅是让 Kubernetes 能够识别定制资源的⾝份。创建定制资源实例后,Kubernetes 只会将创建的实例存储到数据库中,并不会触发任何业务逻辑。在 数据库保存定制资源实例是没有意义的,如果需要进⾏业务逻辑控制,就需要创建控制器。
Controller 的作⽤就是监听指定对象的新增、删除、修改等变化,并针对这些变化做出相应的响应,关于 Controller 的详细设计,可以参考 Harry (Lei) Zhang ⽼师在 twitter 上的分享,基本架构图如下:
图中可看出,定制资源实例的变化会通过 Informer 存⼊ WorkQueue,之后 Controller 会消费 WorkQueue,并对其中的数据做出业务响应。
Operator 其实就是图中除了 API Server 和 etcd 的剩余部分。由于 Client、Informer 和 WorkQueue 是⾼度相似的,所以有很多项⽬可以⾃动化⽣成 Controller 之外的业务逻辑(如 Client、Informer、Lister),因此⽤户只需要专注于 Controller 中的业务逻辑即可。
Operator⾃定义controller
Operator通过扩展Kubernetes定义Custom Controller,观察应⽤并根据实际状态执⾏⾃定义任务。应⽤被定义为Kubernetes对象:Custom Resource (CR),它包含yaml spec和被API服务接受对象类型(K8s kind)。这样,您可以在⾃定义规范中定义要观察的任何特定条件,并在实例与规范不匹配时协调实例。虽然Operator controller主要使⽤⾃定义组件,但它与原⽣Kubernetes controller协调⽅式⾮常类似。
Operator通过Custom Controller协调应⽤spec。虽然API服务知道Custom Controller,但Operator可以独⽴运⾏在集内部或外部。
sdk构建Operator
为了创建⾃定义Operator,我们需要如下资源:
1. Custom Resource(CR)spec,定义我们要观测的应⽤对象,以及为CR定义的API
2. Custom Controller,⽤来观测CR
3. Custom code,决定Custom Controller如何协调CR
4. Operator,管理Custom Controller
5. Deployment,定义Operator和⾃定义资源
所有上述内容都可以通过⼿⼯编写Go代码和spec,或通过kubebuilder等⼯具⽣成Kubernetes API。但最简单的⽅式(也是我们在这⾥使⽤的⽅法)是使⽤CoreOS operator-sdk为这些组件⽣成模版。它允许您通过CLI命令⽣成spec、controller以及Operator框架。⼀旦⽣成后,您可以在spec中定义⾃定义字段并编写协调的⾃定义代码。我们将在本教程的下⼀部分中展开介绍。
编写你⾃⼰的 Operator
如果⽣态系统中没可以实现你⽬标的 Operator,你可以⾃⼰编写代码。
你还可以使⽤任何⽀持 Kubernetes API 客户端 的语⾔或运⾏时来实现 Operator(即控制器)。
以下是⼀些库和⼯具,你可⽤于编写⾃⼰的云原⽣ Operator。
说明: 本部分链接到提供 Kubernetes 所需功能的第三⽅项⽬。Kubernetes 项⽬作者不负责这些项⽬。此页⾯遵循CNCF ⽹站指南,按字母顺序列出项⽬。要将项⽬添加到此列表中,请在提交更改之前阅读内容指南。
使⽤operator sdk编写
operator sdk项⽬是Operator Framework的⼀个组件,这是⼀个开源⼯具包,以有效,⾃动化和可扩展的⽅式管理Kubernetes原⽣应⽤程序,称为Operators。更多介绍内容,请阅读博客。
Operators 可以在Kubernetes之上轻松地管理复杂有状态的应⽤程序。然⽽,由于诸如使⽤低级API,编写样板以及缺乏模块导致重复性⼯作等挑战,导致⽬前编写Operator可能很困难。
Operator SDK是⼀个框架,旨在简化Operator的编写,它提供如下功能:
⾼级API和抽象,更直观地编写操作逻辑
⽤于脚⼿架和代码⽣成的⼯具,可以快速引导新项⽬
扩展以涵盖常见的操作员⽤例
⼯作流程
SDK提供以下⼯作流程来开发新的Operator:
使⽤SDK命令⾏界⾯(CLI)创建新的Operator项⽬
通过添加⾃定义资源定义(CRD)定义新资源API
使⽤SDK API监控指定的资源
在指定的处理程序中定义Operator协调逻辑(对⽐期望状态与实际状态),并使⽤SDK API与资源进⾏交互
使⽤SDK CLI构建并⽣成Operator部署manifests
Operator使⽤SDK在⽤户⾃定义的处理程序中以⾼级API处理监视资源的事件,并采取措施来reconcile(对⽐期望状态与实际状态)应⽤程序的状态。
快速开始
先给出我的环境,注意operator-sdk⽀持通过代码安装,在window上通过idea等⼯具搭配golang开发,有环境的可直接使⽤macos。
开发操作系统:window
k8s:1.23.3
k8s部署:debian|dockerdesktop⾃带的k8s
前置安装
安装gcc和make。
安装golang1.17以上版本。
⼀个可进⼊的公共的docker registry服务,并且准备⼀个域名作为registry服务的域名。
安装gcc和make
apt-get install gcc automake autoconf libtool make
golang
安装 golang 17以上版本
wget studygolang/dl/golang/go1.17.
tar zxvf go1.17.l
我这直接解压在/root下,/etc/profile添加环境变量
export GOPATH=/root/go
export GOROOT=${GOPATH}
export GOARCH=386
export GOOS=linux
export GOTOOLS=$GOROOT/pkg/tool
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
让配置⽣效 并修改golang的私服
source /etc/profile && go env -w GOPROXY=mirrors.aliyun/goproxy/
检测是否安装成功
root@liaok8s:~/go# go version
go version go1.17 linux/amd64
root@liaok8s:~/go# go env | grep GOPROXY
GOPROXY="mirrors.aliyun/goproxy/"
安装docker
开发本机需安装docker,operator的controller需要⽣成docker镜像
linux机器使⽤ yum或者apt-get安装 docker-ce即可
window安装docker desktop即可。
安装docker registry
这⾥为了简单,就不设置账号密码权限了。
docker run -d -p 5000:5000--name registry --restart=always -v /opt/registry/data:/var/lib/registry docker.io/registry
检测存在的镜像
curl 127.0.0.1:5000/v2/_catalog
在开发的window和k8s的worker节点 linux(/etc/docker/daemon.json)设置,改后重启;
"insecure-registries":[
"jiaozi:5000"
],
在开发的本地机器和k8s的worker节点绑定hosts
正在 Ping jiaozi [10.10.0.115]具有32字节的数据:
来⾃10.10.0.115的回复:字节=32时间<1ms TTL=63
来⾃10.10.0.115的回复:字节=32时间<1ms TTL=63
来⾃10.10.0.115的回复:字节=32时间<1ms TTL=63
10.10.0.115的 Ping 统计信息:
数据包:已发送=3,已接收=3,丢失=0(0%丢失),
往返⾏程的估计时间(以毫秒为单位):
最短=0ms,最长=0ms,平均=0ms
测试上传⼀个镜像
docker pull nginx && docker tag nginx jiaozi:5000/nginx && docker push jiaozi:5000/nginx  && curl jiaozi/5000/v2/_catalog {"repositories":["nginx"]}
安装kubectl
让开发的机器可以通过kubectl访问集,⼀般⽤window开发的 话,新版的docker desktop都带上内置的k8s,⾃然⾃带kubectl命令,可将远程k8s集的初始化时⽣成的config⽂件拷贝到出来
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/f $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively,if you are the root user, you can run:
export KUBECONFIG=/etc/f
⼀般就是/etc/f,放到window的 %USERPROFILE%/.kube/config⽂件即可
C:\Users\liaomin>echo %USERPROFILE%
C:\Users\liaomin mkdir %USERPROFILE%\.kube
将f重命名为config⽂件即可
测试

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。