Kubernetes 实战 二 CRD 自定义控制器
简介:
之前介绍过 Kubernetes 实战 一 CRD 自定义资源 。
但是CRD只能实现资源的定义,kubernetes operator = crd + controller。 那如何实现自定义的控制呢? 接下来教你10分钟快速实现自定义controller。(可以合理上网的前提下。。。。)
环境
- mac os 10.13.6
- kubernetes 1.14.0 --> Centos 7 快速搭建kubernetes 集群
- kubebuilder 2.0.0-alpha.4
- kustomize 3.1.0
- golang 1.12.7
创建 operator 操作步骤
0. 写在前面
接下来的来的过程有一些小坑,很多步骤都需要翻墙、希望能够合理的翻墙 否则不用多说了吧 。。。。。
建议使用我的github代码,熟悉流程后在自行搭建,可以直接跳过 2、3 两个步骤。第8步 就是编译镜像然后通过yml部署到kubernetes集群 不想尝试的可以跳过。
代码下载:
git clone https://github.com/xiliangMa/vm-crd.git
1. kubebuilder 安装
kubebuilder 基于 client go 能帮我们节省大量工作,让开发CRD和adminsion webhook变得异常简单。go 语言开发的首选,如果你是 java 开发的话可以使用 Fabric8。
二进制安装:
os=$(go env GOOS) arch=$(go env GOARCH) # download kubebuilder and extract it to tmp curl -sL https://go.kubebuilder.io/dl/2.0.0-rc.0/${os}/${arch} | tar -xz -C /tmp/ # move to a long-term location and put it on your path # (you'll need to set the KUBEBUILDER_ASSETS env var if you put it somewhere else) sudo mv /tmp/kubebuilder_2.0.0-rc.0_${os}_${arch} /usr/local/kubebuilder export PATH=$PATH:/usr/local/kubebuilder/bin
2. kustomize 安装
go install sigs.k8s.io/kustomize/v3/cmd/kustomize
3. 创建 operator project
需要翻墙。。。。
kubebuilder init --domain xiliangma.com --license apache2 --owner "xiliangMa"
4. 创建 api
需要翻墙。。。。
kubebuilder create api --group mscloud --version v1 --kind VM
5. 部署 CRD 到集群
需要翻墙。。。。
部署 crd:
make install
查看 crd:
crd git:(master) kubectl get crd | grep vm vms.mscloud.xiliangam.com 2019-08-19T08:00:31Z
6. 本地启动 controller
crd git:(master) make run go get sigs.k8s.io/controller-tools/cmd/controller-gen@v0.2.0-beta.2 /Users/maxiliang/go/bin/controller-gen object:headerFile=./hack/boilerplate.go.txt paths=./api/... go fmt ./... go vet ./... go run ./main.go 2019-08-19T16:44:26.614+0800 INFO controller-runtime.controller Starting EventSource {"controller": "vm", "source": "kind source: /, Kind="} 2019-08-19T16:44:26.615+0800 INFO setup starting manager 2019-08-19T16:44:26.718+0800 INFO controller-runtime.controller Starting Controller {"controller": "vm"} 2019-08-19T16:44:26.819+0800 INFO controller-runtime.controller Starting workers {"controller": "vm", "worker count": 1} Get vm spec info success, vm1 Centos 7.2 1 1024 true 2019-08-19T16:44:26.827+0800 DEBUG controller-runtime.controller Successfully Reconciled {"controller": "vm", "request": "default/vm-sample2"} Get vm spec info success, vm1 Centos 7.2 1 1024 true 2019-08-19T16:44:26.834+0800 DEBUG controller-runtime.controller Successfully Reconciled {"controller": "vm", "request": "default/vm-sample2"}
7. 创建 vm
创建:
kubectl apply -f config/samples/mscloud_v1_vm.yaml
查看:
crd git:(master) kubectl get vm NAME AGE vm-sample2 35m
8. build 镜像部署
需要翻墙。。。。此步骤可以不做,本地启动controller 也可以
make docker-build docker-push IMG=xiliangma/vmcontroller make deploy
好了已经成功发布controller 到集群了。好了 到这里是不是就完事了,散伙回家。。。
crd git:(master) docker images | grep xiliangma/vmcontroller xiliangma/vmcontroller latest a1d7fa46abbf 8 days ago 815MB
哈哈 接下来才是自定义controller部分,很简单其实就是对 vm 资源的增删改查。。。。
自定义 controller 开发
下面可以看到spec中只有foo 属性,那如何像 deployment 一样实现多参数配置呢?请看下面的操作步骤。
crd git:(master) cat config/samples/mscloud_v1_vm.yaml apiVersion: mscloud.xiliangam.com/v1 kind: VM metadata: name: vm-sample spec: # Add fields here foo: bar
1. 自定义 vm
- 1.1 修改 VMSpec
- 1.2 创建 vm
- 1.3 添加控制逻辑
1.1 修改 VMSpec 添加属性
添加 Name 、 类型、HA 等。。 type VMSpec struct { // INSERT ADDITIONAL SPEC FIELDS - desired state of cluster // Important: Run "make" to regenerate code after modifying this file // xiliangma test vm crd controller Name string `json:"name"` Type string `json:"type"` CPU int `json:"cpu"` Memory int `json:"memory"` HA bool `json:"ha"` }
1.3 创建 vm
mscloud_v2_vm.yaml:
apiVersion: mscloud.xiliangam.com/v1 kind: VM metadata: name: vm-sample2 spec: # Add fields here foo: bar name: "vm1" type: "Centos 7.2" cpu: 1 memory: 1024 ha: true
创建:
kubectl apply -f config/samples/mscloud_v2_vm.yaml
好了添加的属性已经成功配置:
crd git:(master) kubectl describe vms Name: vm-sample2 Namespace: default Labels: <none> Annotations: kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"mscloud.xiliangam.com/v1","kind":"VM","metadata":{"annotations":{},"name":"vm-sample2","namespace":"default"},"spec":{"cpu"... API Version: mscloud.xiliangam.com/v1 Kind: VM Metadata: Creation Timestamp: 2019-08-19T08:40:59Z Generation: 1 Resource Version: 261536 Self Link: /apis/mscloud.xiliangam.com/v1/namespaces/default/vms/vm-sample2 UID: 11803e5e-c25d-11e9-970d-025000000001 --------- 成功添加vm 属性 Spec: Cpu: 1 Foo: bar Ha: true Memory: 1024 Name: vm1 Type: Centos 7.2 Events: <none>
1.4 添加获取逻辑
通过 kubebuilder 初始化的项目结构比较简单,控制逻辑都在controller 里实即可。
Reconcile 里添加获取逻辑:
ctx := context.Background() log := r.Log.WithValues("vm", req.NamespacedName) // 1. xiliangma 获取vm 信息 var vm mscloudv1.VM if err := r.Get(ctx, req.NamespacedName, &vm); err != nil { log.Error(err, "unable to get vm") } else { fmt.Println("Get vm spec info success, ", vm.Spec.Name, vm.Spec.Type, vm.Spec.CPU, vm.Spec.Memory, vm.Spec.HA) }
测试 make && make install && make run 日志中能看到打印出的信息
2. 更新
- 2.1 修改 VMStatus
- 2.2 添加修改逻辑
1.2 修改 VMStatus
添加 UpdateLastTime 、 Status type VMStatus struct { // INSERT ADDITIONAL STATUS FIELD - define observed state of cluster // Important: Run "make" to regenerate code after modifying this file // xiliangma test vm crd controller UpdateLastTime metav1.Time `json:"update_last_time"` Status string `json:"status"` }
2.2 添加修改逻辑
// 2. 更新虚拟机状态 vm.Status.UpdateLastTime = metav1.Now() vm.Status.Status = "Running" if err := r.Status().Update(ctx, &vm); err != nil { log.Error(err, "not update vm status.") }
重新执行: make && make install && make run
如果出现:the server could not find the requested resource 这个错误,那么在CRD结构体上需要加个注释 // +kubebuilder:subresource:status
// +kubebuilder:subresource:status // +kubebuilder:object:root=true // VM is the Schema for the vms API type VM struct { metav1.TypeMeta `json:",inline"` metav1.ObjectMeta `json:"metadata,omitempty"` Spec VMSpec `json:"spec,omitempty"` Status VMStatus `json:"status,omitempty"` }
看到下面结果 修改成功:
crd git:(master) kubectl describe vms Name: vm-sample2 Namespace: default Labels: <none> Annotations: kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"mscloud.xiliangam.com/v1","kind":"VM","metadata":{"annotations":{},"name":"vm-sample2","namespace":"default"},"spec":{"cpu"... API Version: mscloud.xiliangam.com/v1 Kind: VM Metadata: Creation Timestamp: 2019-08-19T08:40:59Z Generation: 1 Resource Version: 261536 Self Link: /apis/mscloud.xiliangam.com/v1/namespaces/default/vms/vm-sample2 UID: 11803e5e-c25d-11e9-970d-025000000001 Spec: Cpu: 1 Foo: bar Ha: true Memory: 1024 Name: vm1 Type: Centos 7.2 Status: ---- 修改成功 Status: Running Update Last Time: 2019-08-19T08:44:26Z Events: <none>
3. 删除 vm
添加删除逻辑:
// 3. 删除虚拟机 time.Sleep(time.Second * 5) if err := r.Delete(ctx, &vm); err != nil { log.Error(err, "unable to delete vm ", "vm", vm) }
重新执行: make && make install && make run
5s 后vm 被删除。
好了,到此你已经实现了基础的控制器是不是很简单。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
数据迁移工具DataX部署与使用
概述 DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 MySQL、Oracle、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore(OTS)、MaxCompute(ODPS)、DRDS 等各种异构数据源之间高效的数据同步功能。阿里云已经开源此工具,目前版本是datax3.0。 下载安装 下载 Githup地址:https://github.com/alibaba/DataX 若是有能力就直接在服务器上Git clone 或者直接点击【Clone or download】下载datax的源码包,需要自己手动去编译 所以我选择将该网页往下拉一点,点击 直接下载编译好的安装包 服务器配置 我使用的是阿里云上的ECS-centos部署datax,总的来说要满足以下几点: JDK(1.8以上,推荐1.8) Python(推荐Python2.6.X) Apache Maven 3.x (Compile DataX) 1、我先安装JDK使用yum安装 # yum search java|grep jdk # yum instal...
- 下一篇
JAVA是否过于复杂,不符合未来编程发展
Java 作为一门长青的编程语言,在比较长的发展时间里,时常会有唱衰的声音。但 Java 一直在不断向前发展,受欢迎程度也一直很高,TIOBE 榜单常年保持在 Top 2,未来 Java 将如何发展呢?本文搜集了一些国外开发者和相关从业人员的看法。最 Hot 的 Java 应用场景在纷繁复杂的编程语言中,Java 一直是深受开发者和企业欢迎的编程语言。从 2001 年起,Java 在 TIOBE 榜单中几乎排在首位,偶尔排在第二位。受欢迎程度如此高、使用广泛的编程语言肯定会有一些需要掌握的特定技能。CV Compiler 从 AngelList,StackOverflow,LinkedIn 等网站收集了 300 个 Java 招聘需求,并从这 300 个招聘需求中统计出了企业想要 Java 程序员掌握的技能。我觉得这些语言太难用了,太精细,太复杂,太冗长。而且这些缺点似乎在与日俱增,”Pike说,“它们被过度接受,被用得太广了。” Pike详细说明了此类语言的缺点,以此展开描述了他和其它谷歌工程师对所开发的名叫Go的新编程语言所持的期望。 为了证实此类语言的复杂性,Pike展示了一些C...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS8编译安装MySQL8.0.19
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Windows10,CentOS7,CentOS8安装Nodejs环境