欢迎访问我的GitHub

https://github.com/zq2599/blog_demos

内容:所有原创文章分类汇总及配套源码,涉及Java、Docker、Kubernetes、DevOPS等;

系列文章链接

  1. kubebuilder实战之一:准备工作
  2. kubebuilder实战之二:初次体验kubebuilder
  3. kubebuilder实战之三:基础知识速览
  4. kubebuilder实战之四:operator需求说明和设计
  5. kubebuilder实战之五:operator编码
  6. kubebuilder实战之六:构建部署运行
  7. kubebuilder实战之七:webhook
  8. kubebuilder实战之八:知识点小记

本篇概览

《kubebuilder实战》系列已经写了七篇,前面曾遇到不少问题,磕磕碰碰解决后,打算在本篇集中小结作为备忘,主要有以下几部分组成:

  1. CRD的Status字段;
  2. 选择合适的镜像仓库
  3. 本地运行controller时跳过webhook
  4. controller的pod有两个容器
  5. 常用操作命令整理
  • 接下来挨个整理,今天的内容不写代码,咱们来一次轻松愉快的阅读;

CRD的Status字段

  • 这个坑算是自己挖的,希望您能提前避开;
  • 回顾elasticweb的CRD,其数据结构代码如下图:

  • 该CRD的Status数据结构只有一个字段RealQPS,该字段的Tag(也就是上图红框),里面的omitempty属性非常重要!!!

  • 如果RealQPS的Tag中没有omitempty属性,会发生什么事情呢?

  • 实际上,在开发webhook之前,我一时大意漏掉了RealQPS的omitempty属性,但是整个controller可以正常工作,elasticweb的功能也达到了咱们的预期,也就是说status的字段如果没有omitempty属性,不影响operator的功能;

  • 但是,在启用了webhook之后,创建资源对象时就报错了:

  1. zhaoqin@zhaoqindeMBP-2 elasticweb % kubectl apply -f config/samples/elasticweb_v1_elasticweb.yaml
  2. namespace/dev created
  3. The ElasticWeb "elasticweb-sample" is invalid: status.realQPS: Invalid value: "null": status.realQPS in body must be of type integer: "null"
  • 也就是说,Status数据结构的字段中,如果json tag没有omitempty属性,在启用了webhook之后创建资源对象会失败;

选择合适的镜像仓库

  • 看过之前文章的您,应该还记得构建镜像的命令:
  1. make docker-build docker-push IMG=bolingcavalry/elasticweb:001
  • 因为我在hub.docker.com上注册的帐号是bolingcavalry,因此上述命令可以将做好的本地镜像推送到hub.docker.com的仓库中(记得提前用docker login命令登录);

  • 只要镜像上传到了hub.docker.com,能访问外网的kubernetes就都可以直接使用这个operator了,非常方便;

  • 但是上传到hub.docker.com的过程是痛苦的,动辄半小时的等待,还伴随着超时退出(镜像加速在下载的时候效果明显,但是上传的时候,我这看似乎没啥效果,可能是我不会用,如果您知道还请指点);

  • 还好,我在阿里云注册过,可以使用上面的镜像仓库,入口如下图:

  • 如下图,新建公开类型的镜像仓库,点击红框2,可以看到详细的登录、上传、拉取命令,点击红框3可以修改登录密码:

  • 使用了阿里云的镜像服务后,操作命令改成了如下内容:
  1. make docker-build docker-push IMG=registry.cn-hangzhou.aliyuncs.com/bolingcavalry/elasticweb:001
  • 整个上传速度也提升了很多,基本上3分钟内可以完成镜像上传;

  • 如果您没有阿里云帐号,或者对阿里云的速度也不满意,也可以自己搭建镜像仓库,自己的内网中速度当然没的说了,细节不在此展开,这里有两篇参考文章:

  1. CentOS部署Harbor镜像仓库
  2. 群晖DS218+部署Harbor(1.10.3)

本地运行controller时跳过webhook

  • controller有两种部署方式:部署在kubernetes环境内,或者在kubernetes环境外独立运行

  • 在编码阶段,我们通常选择在自己电脑上运行controller,这样省去了镜像相关的操作,省时又省事儿;

  • 但是,如果使用了webhook,由于其特殊的鉴权方式,需要将kubernetes签发的证书放置在本地(/tmp/k8s-webhook-server/serving-certs/目录),这就让我们两难了:

  1. 选择部署在kubernetes环境,要制作镜像和上传镜像;
  2. 选择运行在kubernetes环境之外,要签发证书放置在指定目录;
  • 面对上述两难的纠结,官方给出了一个建议,如果在开发阶段暂时用不上webhook(注意这个前提),那么在本地运行controller时可以用一点小手段屏蔽掉webhook功能,具体操作由以下两步组成:

  • 首先是修改main.go代码,如下图,红框中是新增的代码,其实就是增加了一个判断,如果环境变量ENABLE_WEBHOOKS等于false,就不会执行webhook相关逻辑:

  • 其次,本地启动controller的命令,以前是make run,现在改成如下命令,即增加了一个参数:

  1. make run ENABLE_WEBHOOKS=false
  • 现在controller可以正常启动了,功能也正常,只是webhook相关的功能全部都不生效了;

controller的pod有两个容器

  • 如果controller部署在kubernetes环境内,其是以pod的形态存在的,也就是说咱们写的webhook、reconcile代码都是在这个pod中运行的;

  • 上述pod内实际上有两个容器,用kubectl describe命令看看这个pod,如下图,可见名为manager的容器才是controller代码运行的地方:

  • 一个pod中有两个容器,对咱们的日常操作略有影响,简单来说就是使用kubectl logs命令查看controller日志的时候,要用-c参数指定容器,完整命令如下:
  1. kubectl logs -f \
  2. elasticweb-controller-manager-58576f4cb-hzchl \
  3. -c manager \
  4. -n elasticweb-system

常用操作命令整理

  • 最后把常用的操作命令整理出来,便于日常使用:
  1. 创建operator项目:
  1. kubebuilder init --domain com.bolingcavalry
  1. 创建API
  1. kubebuilder create api \
  2. --group webapp \
  3. --version v1 \
  4. --kind Guestbook
  1. 创建webhook
  1. kubebuilder create webhook \
  2. --group elasticweb \
  3. --version v1 \
  4. --kind ElasticWeb \
  5. --defaulting \
  6. --programmatic-validation
  1. 构建和部署CRD
  1. make install
  1. 本地运行controller
  1. make run
  1. 构建镜像并推送到仓库
  1. make docker-build docker-push IMG=registry.cn-hangzhou.aliyuncs.com/bolingcavalry/elasticweb:001
  1. controller部署到kubernetes
  1. make deploy IMG=registry.cn-hangzhou.aliyuncs.com/bolingcavalry/elasticweb:001
  1. 创建elasticweb资源对象
  1. kubectl apply -f config/samples/elasticweb_v1_elasticweb.yaml
  1. 删除elasticweb资源对象
  1. kubectl delete -f config/samples/elasticweb_v1_elasticweb.yaml
  1. 删除controller
  1. kustomize build config/default | kubectl delete -f -
  1. 删除CRD
  1. make uninstall
  1. 查看日志
  1. kubectl logs -f \
  2. elasticweb-controller-manager-58576f4cb-hzchl \
  3. -c manager \
  4. -n elasticweb-system
  • 至此,kubebuilder实战期间的知识点小结就完成了,若您正在学习和开发operator,希望本篇的小结能给您一些参考;

你不孤单,欣宸原创一路相伴

  1. Java系列
  2. Spring系列
  3. Docker系列
  4. kubernetes系列
  5. 数据库+中间件系列
  6. DevOps系列

欢迎关注公众号:程序员欣宸

微信搜索「程序员欣宸」,我是欣宸,期待与您一同畅游Java世界...

https://github.com/zq2599/blog_demos

kubebuilder实战之八:知识点小记的更多相关文章

  1. kubebuilder实战之一:准备工作kubebuilder实战之一:准备工作

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  2. kubebuilder实战之二:初次体验kubebuilder

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  3. kubebuilder实战之三:基础知识速览

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  4. kubebuilder实战之四:operator需求说明和设计

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  5. kubebuilder实战之五:operator编码

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  6. kubebuilder实战之六:构建部署运行

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  7. kubebuilder实战之七:webhook

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  8. [原创].NET 业务框架开发实战之八 业务层Mapping的选择策略

    原文:[原创].NET 业务框架开发实战之八 业务层Mapping的选择策略 .NET 业务框架开发实战之八 业务层Mapping的选择策略 前言:在上一篇文章中提到了mapping,感觉很像在重新实 ...

  9. Sass 主要知识点小记

    Sass 主要知识点小记 以前写样式的时候,每个元素的颜色,背景色都需要重新写一遍,然后就想CSS难道没有变量么?最后就查到Sass.但当时没有静下心来好好的看一下,今天正好有时间,就在这里边看边整理 ...

随机推荐

  1. 第二十九篇 -- PY程序返回值问题

    今天兴之所至,来写一写关于程序返回值的问题.普通的py程序就不用多说了,sys.exit(result),result就是你想返回的返回值啦.我们今天来讲讲用PyQt5写的带界面的程序如何设置返回值的 ...

  2. C++第三十七篇 -- 调试驱动程序

    上一篇写的KMDF程序是通过串口进行配置的,那么我们在VS中Attach to process外,可以直接用Winbdg进行调试,winbdg.exe所在路径为C:\Program Files (x8 ...

  3. Pycharm关联gitlab(http方式)

    Pycharm支持关联gitlab仓库,关联后对远端项目的克隆和提交都很方便.当初笔者在关联时遇到了很多坑,网上也没找到相关解决办法,所以在这里分享下完整的关联过程. 一.安装git 下载地址http ...

  4. Volitle

    缓存一致性协议 最出名的是Intel的MESI协议,该协议保证了每个缓存中使用的共享变量的副本是一致的.其思想是:当CPU写数据时,如果发现操作的变量是共享变量,即在其他CPU中也存在该变量的副本,会 ...

  5. PHP-CGI远程代码执行漏洞(CVE-2012-1823)

    影响版本 php < 5.3.12 or php < 5.4.2 访问http://p:8080/index.php?-s即爆出源码,说明漏洞存在 POST /index.php?-d+a ...

  6. switch-case例题

    根据订单的状态码打印对应的汉字状态(使用switch-case)1-等待付款 2-等待发货 3-运输中 4-已签收 5-已取消 其它-无法追踪 var n='2' switch(n){ case 1: ...

  7. Hadoop 3.1.1 - Yarn 服务 - 总览

    YARN 服务 总览 Yarn 服务框架为在 Yarn 原生环境里长时间运行的服务,提供了一流的支持和接口.简言之,它扮演了容器编排系统的角色,统一管理 Yarn 上运行的容器化服务.它同时支持 Do ...

  8. Java数组04——多维数组

    多维数组  package array; ​ public class ArrayDemon06 {     public static void main(String[] args) {      ...

  9. (2)用 if语句 区间判断

    1 /*此例子只作为演示*/ 2 3 #include <stdio.h> 4 int main() 5 { 6 printf("请问贵公司给出的薪资是:\n"); 7 ...

  10. 我是如何在一晚上拿到阿里巴巴Android研发offer的?

    图文无关 开篇 我找工作时是2018年. 那一年,BAT大量缩招,就业形势严峻,互联网寒冬消息蔓延. 最终我经过激烈角逐拼下了几个大厂offer,回顾往事,觉得分享出来,也许对你能有所借鉴. 简历 这 ...