https://github.com/zq2599/blog_demos
内容:所有原创文章分类汇总及配套源码,涉及Java、Docker、Kubernetes、DevOPS等;
《kubebuilder实战》系列已经写了七篇,前面曾遇到不少问题,磕磕碰碰解决后,打算在本篇集中小结作为备忘,主要有以下几部分组成:
该CRD的Status数据结构只有一个字段RealQPS,该字段的Tag(也就是上图红框),里面的omitempty属性非常重要!!!
如果RealQPS的Tag中没有omitempty属性,会发生什么事情呢?
实际上,在开发webhook之前,我一时大意漏掉了RealQPS的omitempty属性,但是整个controller可以正常工作,elasticweb的功能也达到了咱们的预期,也就是说status的字段如果没有omitempty属性,不影响operator的功能;
但是,在启用了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"
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的过程是痛苦的,动辄半小时的等待,还伴随着超时退出(镜像加速在下载的时候效果明显,但是上传的时候,我这看似乎没啥效果,可能是我不会用,如果您知道还请指点);
还好,我在阿里云注册过,可以使用上面的镜像仓库,入口如下图:
make docker-build docker-push IMG=registry.cn-hangzhou.aliyuncs.com/bolingcavalry/elasticweb:001
整个上传速度也提升了很多,基本上3分钟内可以完成镜像上传;
如果您没有阿里云帐号,或者对阿里云的速度也不满意,也可以自己搭建镜像仓库,自己的内网中速度当然没的说了,细节不在此展开,这里有两篇参考文章:
controller有两种部署方式:部署在kubernetes环境内,或者在kubernetes环境外独立运行
在编码阶段,我们通常选择在自己电脑上运行controller,这样省去了镜像相关的操作,省时又省事儿;
但是,如果使用了webhook,由于其特殊的鉴权方式,需要将kubernetes签发的证书放置在本地(/tmp/k8s-webhook-server/serving-certs/目录),这就让我们两难了:
面对上述两难的纠结,官方给出了一个建议,如果在开发阶段暂时用不上webhook(注意这个前提),那么在本地运行controller时可以用一点小手段屏蔽掉webhook功能,具体操作由以下两步组成:
首先是修改main.go代码,如下图,红框中是新增的代码,其实就是增加了一个判断,如果环境变量ENABLE_WEBHOOKS等于false,就不会执行webhook相关逻辑:
其次,本地启动controller的命令,以前是make run,现在改成如下命令,即增加了一个参数:
make run ENABLE_WEBHOOKS=false
如果controller部署在kubernetes环境内,其是以pod的形态存在的,也就是说咱们写的webhook、reconcile代码都是在这个pod中运行的;
上述pod内实际上有两个容器,用kubectl describe命令看看这个pod,如下图,可见名为manager的容器才是controller代码运行的地方:
kubectl logs -f elasticweb-controller-manager-58576f4cb-hzchl -c manager -n elasticweb-system
kubebuilder init --domain com.bolingcavalry
kubebuilder create api --group webapp --version v1 --kind Guestbook
kubebuilder create webhook --group elasticweb --version v1 --kind ElasticWeb --defaulting --programmatic-validation
make install
make run
make docker-build docker-push IMG=registry.cn-hangzhou.aliyuncs.com/bolingcavalry/elasticweb:001
make deploy IMG=registry.cn-hangzhou.aliyuncs.com/bolingcavalry/elasticweb:001
kubectl apply -f config/samples/elasticweb_v1_elasticweb.yaml
kubectl delete -f config/samples/elasticweb_v1_elasticweb.yaml
kustomize build config/default | kubectl delete -f -
make uninstall
kubectl logs -f elasticweb-controller-manager-58576f4cb-hzchl -c manager -n elasticweb-system
微信搜索「程序员欣宸」,我是欣宸,期待与您一同畅游Java世界...
https://github.com/zq2599/blog_demos
原文:https://www.cnblogs.com/bolingcavalry/p/15221520.html