首页 > 编程语言 >28-面向 K8 编程:如何通过 Operator 扩展 Kubernete API?

28-面向 K8 编程:如何通过 Operator 扩展 Kubernete API?

时间:2024-01-11 13:55:50浏览次数:37  
标签:控制器 Kubernetes 28 API CRD Operator kubebuilder

你好,我是正范。在上一讲,我们学习了如何通过一个 YAML 文件来定义一个 CRD,即扩展 API。这种扩展 API 跟 Kubernetes 内置的其他 API 同等地位,都可以通过 kubectl 或者 REST 接口访问,在使用过程中不会有任何差异。

但只是定义一个 CRD 并没有什么作用。虽说 kube-apiserver 会将其数据存放到 etcd 中,并暴露出相应的 REST 接口,然而并不涉及该对象的核心处理逻辑。

如何对这些 CRD 定义的对象进行一些逻辑处理,需要由用户自己来定义和实现,也就是通过控制器来实现。对此,我们有个专门的名字:Operator。

什么是 Kubernetes Operator

你可能对 Operator 这个名字比较陌生。这个名字最早由 CoreOS 在 2016 年提出来,我们来看看他们给出的定义:

An operator is a method of packaging, deploying and managing a Kubernetes application. A Kubernetes application is an application that is both deployed on Kubernetes and managed using the Kubernetes APIs and kubectl tooling.

To be able to make the most of Kubernetes, you need a set of cohensive APIs to extend in order to service and manage your applications that run on Kubernetes. You can think of Operators as the runtime that manages this type of application on Kubernetes.

总结一下,所谓的 Kubernetes Operator 其实就是借助 Kubernetes 的控制器模式,配合一些自定义的 API,完成对某一类应用的操作,比如资源创建、资源删除。

这里对 Kubernetes 的控制器模式做个简要说明。Kubernetes 通过声明式 API 来定义对象,各个控制器负责实时查看对应对象的状态,确保达到定义的期望状态。这就是 Kubernetes 的控制器模式。

Drawing 0.png

kube-controller-manager 就是由这样一组控制器组成的。我们以 StatefulSet 为例来简单说明下控制器的具体逻辑。

假设你声明了一个 StatefulSet,并将其副本数设置为 2。kube-controller-manager 中以 goroutine 方式运行的 StatefulSet 控制器在观察 kube-apiserver 的时候,发现了这个新创建的对象,它会先创建一个 index 为 0 的 Pod ,并实时观察这个 Pod 的状态,待其状态变为 Running 后,再创建 index 为 1 的 Pod。后续该控制器会一直观察并维护这些 Pod 的状态,保证 StatefulSet 的有效副本数始终为 2。

所以我们在声明完成 CRD 之后,也需要创建一个控制器,即 Operator,来完成对应的控制逻辑。

了解了 Operator 的概念和控制器模式后,我们来看看 Operator 是如何工作的。

Kubernetes Operator 是如何工作的

Operator 工作的时候采用上述的控制器模式,会持续地观察 Kubernetes 中的自定义对象,即 CR(Custom Resource)。我们通过 CRD 来定义一个对象,CR 则是 CRD 实例化的对象。

Drawing 1.png

Operator 会持续跟踪这些 CR 的变化事件,比如 ADD、UPDATE、DELETE,然后采取一系列操作,使其达到期望的状态。

那么具体的代码层面,整个逻辑又如何实现呢?

下面就是 Operator 代码层面的工作流程图:

image.png

如上图所示,上半部分是一个 Informer,它的机制就是不断地 list/watch kube-apiserver 中特定的资源,比如你只关心 Pod,那么就只 list/watch Pod。Informer 主要有两个方法:一个是 ListFunc,一个是 WatchFunc。

  • ListFunc 可以把某类资源的所有资源都列出来,当然你可以指定某个命名空间。

  • WatchFunc 则会和 apiserver 建立一个长链接,一旦有一个对象更新或者新对象创建,apiserver 就会反向推送回来,告诉 Informer 有一个新的对象创建或者更新等操作。

当 Informer 接收到了这些操作,就会调用对应的函数(比如 AddFunc、UpdateFunc 和 DeleteFunc),并将其按照 key 值的格式放到一个先入先出的队列中。

key 值的命名规则就是 “namespace/name”,name 是对应的资源的名字,比如在 default 的 namespace 中创建一个 foo 类型的资源 example-foo,那么它的 key 值就是 “default/example-foo”。

我们一般会给 Operator 设置多个 Worker,并行地从上面的队列中拿到对象去操作处理。工作完成之后,就把这个 key 丢掉,表示已经处理完成。但如果处理过程中有错误,则可以把这个 key 重新放回到队列中,后续再重新处理。

看得出来,上述的流程其实还是有些复杂的,尤其是对初学者有一定的门槛。幸好社区提供了一些脚手架,方便我们快速地构建自己的 Operator。

构建一个自己的 Kubernetes Operator

目前社区有一些可以用于创建 Kubernetes Operator 的开源项目,例如:Operator SDKKubebuilderKUDO

有了这些脚手架,我们就可以快速创建出 Operator 的框架。这里我以 kubebuilder 为例。

我们可以先通过如下命令安装 kustomize:

curl -s "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh" | bash
mv kustomize /usr/local/bin/

再安装 kubebuilder。你可以选择通过源码安装:

git clone https://github.com/kubernetes-sigs/kubebuilder
cd kubebuilder
git checkout v2.3.1
make build
cp bin/kubebuilder $GOPATH/bin

如果你本地有些代码拉不下来,可以用 proxy:

export GOPROXY=https://goproxy.cn

也可以直接下载二进制文件:

os=$(go env GOOS)
arch=$(go env GOARCH)
# download kubebuilder and extract it to tmp
curl -sL https://go.kubebuilder.io/dl/2.3.1/${os}/${arch} | tar -xz -C /tmp/
sudo mv /tmp/kubebuilder_2.3.1_${os}_${arch} /usr/local/bin/kubebuilder

安装好以后,我们就可以通过 kubebuilder 来创建 Operator 了:

cd $GOPATH/src
mkdir -p github.com/zhangsan/operator-demo
cd github.com/zhangsan/operator-demo
kubebuilder init --domain abc.com --license apache2 --owner "zhangsan"
kubebuilder create api --group foo --version v1 --kind Bar

通过上面 kubebuilder 的命令,我们会在当前目录创建一个 Operator 的框架,并声明了一个 Bar 类型的 API。

你通过 make manifests 即可生成所需要的 yaml 文件,包括 CRD、RBAC等。

通过如下的命令即可安装 CRD、RBAC等对象:

make install # 安装CRD

然后我们就可以看到创建的CRD了:

# kubectl get crd
NAME               AGE
bars.foo.abc.com   2m

再来创建一个 Bar 类型的对象:

# kubectl apply -f config/samples/
# kubectl get bar 
NAME         AGE
bar-sample   25s

在本地开发阶段,我们可以通过 make run 命令,在本地运行。运行起来以后,你可以从输出日志中看到我们刚创建的 default 命名空间下的 bar-sample,即 key 为 “default/bar-sample”。

我们在开发的时候,只需要修改 “api/v1/bar_types.go”和“controllers/bar_controller.go”这两个文件即可。这两个文件中有注释,会告诉你新增的对象定义和具体逻辑写哪里。这里你也可以参考 kubebuilder 的文档。

你开发完成之后,就可以构建一个镜像出来,方便部署:

make docker-build docker-push IMG=zhangsan/operator-demo
make deploy

写在最后

到这里,你就完成了对扩展 Kubernetes API 的学习。这一讲的难点不在于 Operator 本身,而是要学会理解它的行为。

如果你对本节课有什么想法或者疑问,欢迎你在留言区留言,我们一起讨论。


标签:控制器,Kubernetes,28,API,CRD,Operator,kubebuilder
From: https://www.cnblogs.com/huangjiale/p/17958432

相关文章

  • P6286
    P6286Cezar题解题意求一个密钥,使加密后的单词按给定顺序排列。转化不妨设密钥为\(k_i\),其中\(i\in[1,26]\)。\(k_i\),表示字母\(i\)要替换为字母\(k_i\)。转化一下,密钥就等于,钦定字母\(i\)是字典中的第\(k_i\)大(重定义字典序)。然后就不用考虑替换了。问题等价......
  • P2862
    P2862题解写数据结构的时候碰到的,最后发现和ds没啥关系。数据范围很小,可以接受大约\(O(n^2\cdot\logn)\)的复杂度。以下\(v\)表示值域(本题为\(10^4\))。先考虑暴力枚举正方形位置。那么需要枚举左上角顶点位置和边长,\(O(v^3)\);判断合法性可以二维前缀和,\(O(1)\)......
  • 想要数据去伪存真?不知道数据的真假?企查查开放平台的API来告诉你
    企查查开放平台使用说明:数据接入与应用实践在数字化时代,企业信息的透明度和可获取性对于商业决策至关重要。企查查开放平台作为一个提供企业数据服务的平台,为用户提供了便捷的数据接入方式和丰富的信息查询功能。本文将详细介绍如何使用企查查开放平台,以及如何将其应用于实际业务......
  • 【OpenVINO】 使用 OpenVINO CSharp API 部署 PaddleOCR 项目介绍
    前言: 在之前的项目中,我们已经使用OpenVINOTMCSharpAPI部署PaddleOCR全系列模型,但随着PaddleOCRv4版本发布以及OpenVINOCSharpAPI版本迭代,上一版本的项目已经不再适用。因此在推出的最新项目中,已经完成了对PaddleOCRv4的匹配,并且采用了最新版本的OpenVINOTMCSha......
  • 2024 年的 API 管理新动向
    本文译自:WhatWillBetheAPIManagementTrendsfor2024?原文链接:https://thenewstack.io/what-will-be-the-api-management-trends-for-2024/原文作者:KennHussey预计到2030年末,API管理 市场的规模将增长六倍,这一增长主要受到一个核心理念的推动:API完全控制了数字世界。随......
  • 28、Flutter Key详解
    在Flutter中,Key是不能重复使用的,所以Key一般用来做唯一标识。组件在更新的时候,其状态的保存主要是通过判断组件的类型或者key值是否一致。因此,当各组件的类型不同的时候,类型已经足够用来区分不同的组件了,此时我们可以不必使用key。但是如果同时存在多个同一类型的控件的时候,此......
  • Gateway API 实践之(一)FSM Gateway 中的故障注入策略
    在之前的文章中,我们快速体验了FSMGateway-一个开源的K8sGatewayAPI的实现。在即将发布的FSM1.2中,FSMGateway将会带来更多的功能:故障注入策略限流策略会话保持策略负载均衡算法熔断策略访问控制策略健康检查策略TLS上游策略...后面我们会推出系列的文章来介绍这些功......
  • mit6.828 - lab5笔记(上)
    文件系统结构unix的文件系统相关知识unix将可用的磁盘空间划分为两种主要类型的区域:inode区域和数据区域。unix为每个文件分配一个inode,其中保存文件的关键元数据,如文件的stat属性和指向文件数据块的指针。数据区域中的空间会被分成大小相同的数据块(就像内存管理中的分页)。数......
  • API调试怎么做?Apipost快速上手
    前言Apipost是一款支持RESTfulAPI、SOAPAPI、GraphQLAPI等多种API类型,支持HTTPS、WebSocket、gRPC多种通信协议的API调试工具。除此之外,Apipost还提供了自动化测试、团队协作、等多种功能。这些丰富的功能简化了工作流程,提高了研发效率,这也让Apipost成为开发人员首选的API......
  • 免费IDEA插件推荐:Apipost-Helper
    IDEA插件市场中的API调试插件不是收费(FastRequest)就是不好用(apidoc、apidocx等等)今天给大家介绍一款国产的API调试插件:Apipost-Helper,完全免费且好看好用!这款插件由Apipost团队开发的,其官方介绍是:用于IDEA项目快速生成API文档,快速查询接口、接口代码功能,并支持在IDEA中进行API调......