歡迎訪問我的GitHub
https://github.com/zq2599/blog_demos
內容:所有原創文章分類匯總及配套源碼,涉及Java、Docker、Kubernetes、DevOPS等;
系列文章鏈接
- kubebuilder實戰之一:准備工作
- kubebuilder實戰之二:初次體驗kubebuilder
- kubebuilder實戰之三:基礎知識速覽
- kubebuilder實戰之四:operator需求說明和設計
- kubebuilder實戰之五:operator編碼
- kubebuilder實戰之六:構建部署運行
- kubebuilder實戰之七:webhook
- kubebuilder實戰之八:知識點小記
本篇概覽
《kubebuilder實戰》系列已經寫了七篇,前面曾遇到不少問題,磕磕碰碰解決后,打算在本篇集中小結作為備忘,主要有以下幾部分組成:
- CRD的Status字段;
- 選擇合適的鏡像倉庫
- 本地運行controller時跳過webhook
- controller的pod有兩個容器
- 常用操作命令整理
- 接下來挨個整理,今天的內容不寫代碼,咱們來一次輕松愉快的閱讀;
CRD的Status字段
- 這個坑算是自己挖的,希望您能提前避開;
- 回顧elasticweb的CRD,其數據結構代碼如下圖:
-
該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"
- 也就是說,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
kustomize build config/default | kubectl delete -f -
- 刪除CRD
make uninstall
- 查看日志
kubectl logs -f \
elasticweb-controller-manager-58576f4cb-hzchl \
-c manager \
-n elasticweb-system
- 至此,kubebuilder實戰期間的知識點小結就完成了,若您正在學習和開發operator,希望本篇的小結能給您一些參考;
你不孤單,欣宸原創一路相伴
歡迎關注公眾號:程序員欣宸
微信搜索「程序員欣宸」,我是欣宸,期待與您一同暢游Java世界...
https://github.com/zq2599/blog_demos