写点什么

kubebuilder 实战之八:知识点小记,java 面试具体场景的解决方案

作者:Java高工P7
  • 2021 年 11 月 10 日
  • 本文字数:1938 字

    阅读完需:约 6 分钟

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


zhaoqin@zhaoqindeMBP-2 elasticweb % kubectl apply -f config/samples/elasticweb_v1_elasticweb.yaml


namespace/dev created


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 之后创建资源对象会失败;

选择合适的镜像仓库

  • 看过之前文章的您,应该还记得构建镜像的命令:


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 可以修改登录密码:



  • 使用了阿里云的镜像服务后,操作命令改成了如下内容:


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,现在改成如下命令,即增加了一个参数:


make run ENABLE_WEBHOOKS=false


  • 现在 controller 可以正常启动了,功能


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


也正常,只是 webhook 相关的功能全部都不生效了;

controller 的 pod 有两个容器

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

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



  • 一个 pod 中有两个容器,对咱们的日常操作略有影响,简单来说就是使用 kubectl logs 命令查看 controller 日志的时候,要用**-c**参数指定容器,完整命令如下:


kubectl logs -f \


elasticweb-controller-manager-58576f4cb-hzchl \


-c manager \


-n elasticweb-system

常用操作命令整理

  • 最后把常用的操作命令整理出来,便于日常使用:


  1. 创建 operator 项目:


kubebuilder init --domain com.bolingcavalry


  1. 创建 API


kubebuilder create api \


--group webapp \


--version v1 \


--kind Guestbook


  1. 创建 webhook


kubebuilder create webhook \


--group elasticweb \


--version v1 \


--kind ElasticWeb \


--defaulting \


--programmatic-validation


  1. 构建和部署 CRD


make install


  1. 本地运行 controller


make run


  1. 构建镜像并推送到仓库


make docker-build docker-push IMG=registry.cn-hangzhou.aliyuncs.com/bolingcavalry/elasticweb:001


  1. controller 部署到 kubernetes


make deploy IMG=registry.cn-hangzhou.aliyuncs.com/bolingcavalry/elasticweb:001


  1. 创建 elasticweb 资源对象


kubectl apply -f config/samples/elasticweb_v1_elasticweb.yaml


  1. 删除 elasticweb 资源对象


kubectl delete -f config/samples/elasticweb_v1_elasticweb.yaml


  1. 删除 controller

用户头像

Java高工P7

关注

还未添加个人签名 2021.11.08 加入

还未添加个人简介

评论

发布
暂无评论
kubebuilder实战之八:知识点小记,java面试具体场景的解决方案