kubebuilder 实战之八:知识点小记,java 面试具体场景的解决方案
但是,在启用了 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 分钟内可以完成镜像上传;
如果您没有阿里云帐号,或者对阿里云的速度也不满意,也可以自己搭建镜像仓库,自己的内网中速度当然没的说了,细节不在此展开,这里有两篇参考文章:
本地运行 controller 时跳过 webhook
controller 有两种部署方式:部署在 kubernetes 环境内,或者在 kubernetes 环境外独立运行
在编码阶段,我们通常选择在自己电脑上运行 controller,这样省去了镜像相关的操作,省时又省事儿;
但是,如果使用了 webhook,由于其特殊的鉴权方式,需要将 kubernetes 签发的证书放置在本地(/tmp/k8s-webhook-server/serving-certs/目录),这就让我们两难了:
选择部署在 kubernetes 环境,要制作镜像和上传镜像;
选择运行在 kubernetes 环境之外,要签发证书放置在指定目录;
面对上述两难的纠结,官方给出了一个建议,如果在开发阶段暂时用不上 webhook(注意这个前提),那么在本地运行 controller 时可以用一点小手段屏蔽掉 webhook 功能,具体操作由以下两步组成:
首先是修改 main.go 代码,如下图,红框中是新增的代码,其实就是增加了一个判断,如果环境变量 ENABLE_WEBHOOKS 等于 false,就不会执行 webhook 相关逻辑:
其次,本地启动 controller 的命令,以前是 make run,现在改成如下命令,即增加了一个参数:
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**参数指定容器,完整命令如下:
kubectl logs -f \
elasticweb-controller-manager-58576f4cb-hzchl \
-c manager \
-n elasticweb-system
常用操作命令整理
最后把常用的操作命令整理出来,便于日常使用:
创建 operator 项目:
kubebuilder init --domain com.bolingcavalry
创建 API
kubebuilder create api \
--group webapp \
--version v1 \
--kind Guestbook
创建 webhook
kubebuilder create webhook \
--group elasticweb \
--version v1 \
--kind ElasticWeb \
--defaulting \
--programmatic-validation
构建和部署 CRD
make install
本地运行 controller
make run
构建镜像并推送到仓库
make docker-build docker-push IMG=registry.cn-hangzhou.aliyuncs.com/bolingcavalry/elasticweb:001
controller 部署到 kubernetes
make deploy IMG=registry.cn-hangzhou.aliyuncs.com/bolingcavalry/elasticweb:001
创建 elasticweb 资源对象
kubectl apply -f config/samples/elasticweb_v1_elasticweb.yaml
删除 elasticweb 资源对象
kubectl delete -f config/samples/elasticweb_v1_elasticweb.yaml
删除 controller
评论