网站首页 > 精选教程 正文
k8s的deployment 和 statefulset 只能满足常规的业务部署,但如果是一些负责的资源管理,就需要用户自定义CRD,并且配合operator 完成资源的管理,本篇文章从零开始构建一个k8s 的operator。
创建项目
首先我们需要安装operator-sdk,它是编写operator的脚手架。然后我们初始化项目
# mkdir demo-operator
# cd demo-operator
# operator-sdk init --domain youdomain.com --repo github.com/xxx/demo-operator
上面的domain是crd 里面资源的版本用的,后面会看到。
创建API
# operator-sdk create api --group apps --version v1 --kind HelloApp --resource --controller
执行完成后 operator-sdk 会为我们自动生成很多代码
# ls
api bin config controllers Dockerfile go.mod go.sum hack main.go Makefile PROJECT
上面的api 定义了我们的model;bin 存放二进制工具controller-gen;controller 是核心控制器代码;Dockerfile 用于将operator构建成docker镜像;main.go 是项目启动文件。
实现控制逻辑
本例中,我们通过定义一个helloapp 的对象,它有两个参数分别是image 和size,其中image代表镜像,size 代表副本数。我们通过将helloapp 映射到到一个deployment (可以分别对应到deployment spec 里面image 和replicas )帮我完成资源管理。我们先修改 api/v1/helloapp_types.go 文件,定义我们model
type HelloAppSpec struct {
Image string `json:"image,omitempty"`
Size int32 `json:"size"`
}
修改完成后别忘了执行”make generate“重新生成版本转化代码。
然后修改 controllers/helloapp_controller.go 定义我们的控制逻辑,核心就是通过reconcile方法不停地对比状态,执行对应的资源操作,对齐目标状态和期望状态。关于控制器逻辑请参见之前关于k8s 核心原理的文章。
func (r *HelloAppReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
//获取helloapp对象
err := r.Client.Get(ctx, req.NamespacedName, helloApp)
// 获取helloapp 对应的deployment是否存在
err = r.Client.Get(ctx, types.NamespacedName{Name: helloApp.Name, Namespace: helloApp.Namespace}, found)
//如果不存在就依据image 和 size 创建一个deployment
if err != nil && errors.IsNotFound(err) {
dep := r.deployHelloApp(helloApp)
}
//如果存在,则检查副本数是否一致
size := helloApp.Spec.Size
if *found.Spec.Replicas != size {
//如果不一致,则更新deployment副本数
found.Spec.Replicas = &size
err = r.Client.Update(ctx, found)
}
部署CRD
我们需要先通过 make 命令帮我们生成 crd yaml
# make manifests
之后便可以通过install 安装crd。
# make install
当然你可以直接进入 config/crd/bases 目录手动安装
# kubectl apply -f .
部署operator
operator的部署有两种方式,一种是本地部署,直接go run即可
# go run main.go
它需要依赖本地 ~/.kube/config 文件。
第二种方法是集群内部署,我们需要先构建镜像
# make docker-build IMG=xxx/demo-operator:latest
然后执行config/rbac 目录的rbac 授权 operator。之后就可以通过deployment部署operator。
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-operator-deployment
namespace: demo-operator-system
spec:
replicas: 1
selector:
matchLabels:
app: demo-operator-controller
template:
metadata:
labels:
app: demo-operator-controller
spec:
containers:
- name: demo-operator-controller
image: xxx/demo-operator:latest
imagePullPolicy: Always
serviceAccountName: demo-operator-svc
最后就可以通helloapp 操作操作资源了
apiVersion: youdomain.com/v1
kind: HelloApp
metadata:
name: helloapp-sample
spec:
image: "nginx"
size: 1
猜你喜欢
- 2024-10-15 硬核干货!采访100个测试猿,我们总结了docker 入门到精通的秘密
- 2024-10-15 Zabbix从入门到精通,你只需要这159页的课程文档
- 2024-10-15 Kubernetes从零到精通(05-Pod) kubernetes podman
- 2024-10-15 Linux 入门到精通企业实战300页学习笔记精华
- 2024-10-15 k8s从入门到精通(一):kubeadm安装k8s集群
- 2024-10-15 springcloud从基础到入门到精通(nacos集群和持久化配置)
- 2024-10-15 阿里架构师的一份文档,带着你从入门到精通Docker 技术
- 2024-10-15 kubernetes从入门到精通系列04-入门命令
- 2024-10-15 深入理解 Docker Run 命令:从入门到精通
- 2024-10-15 Rancher入门到精通-2.0 总目录订阅免费技术支持
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)