本文由 發(fā)布,轉(zhuǎn)載請(qǐng)注明出處,如有問(wèn)題請(qǐng)聯(lián)系我們! 發(fā)布時(shí)間: 2021-08-28kubebuilder實(shí)戰(zhàn)之四:operator需求說(shuō)明和設(shè)計(jì)
加載中熱烈歡迎瀏覽我的GitHub
https://github.com/zq2599/blog_demos
內(nèi)容:全部原創(chuàng)文章內(nèi)容篩選及配套設(shè)施源代碼,涉及到Java、Docker、Kubernetes、DevOPS等;
系列產(chǎn)品文章內(nèi)容連接
- kubebuilder實(shí)戰(zhàn)演練之一:準(zhǔn)備工作
- kubebuilder實(shí)戰(zhàn)演練之二:第一次感受kubebuilder
- kubebuilder實(shí)戰(zhàn)演練之三:基本知識(shí)快評(píng)
- kubebuilder實(shí)戰(zhàn)演練之四:operator要求表明和設(shè)計(jì)方案
- kubebuilder實(shí)戰(zhàn)演練之五:operator編號(hào)
- kubebuilder實(shí)戰(zhàn)演練之六:搭建布署運(yùn)作
- kubebuilder實(shí)戰(zhàn)演練之七:webhook
- kubebuilder實(shí)戰(zhàn)演練之八:知識(shí)要點(diǎn)隨記
這篇概述
- 做為《kubebuilder實(shí)戰(zhàn)》系列產(chǎn)品的第四篇,經(jīng)歷了之前的準(zhǔn)備工作,從本文逐漸,我們來(lái)開(kāi)發(fā)設(shè)計(jì)一個(gè)有具體功效的operator,該operator名叫elasticweb,既延展性web服務(wù);
- 這將是一次詳細(xì)的operator開(kāi)發(fā)設(shè)計(jì)實(shí)戰(zhàn)演練,設(shè)計(jì)方案、編號(hào)、布署等階段都是會(huì)加入到,與《kubebuilder實(shí)戰(zhàn)之二:初次體驗(yàn)kubebuilder》的不同點(diǎn)取決于,elasticweb從CRD設(shè)計(jì)方案再到controller作用都是確定的業(yè)務(wù)流程含意,能實(shí)行領(lǐng)域模型,而《kubebuilder實(shí)戰(zhàn)之二》只是是一次開(kāi)發(fā)流程感受;
- 為了更好地搞好這一operator,這篇不急切編號(hào),只是用心的加強(qiáng)制定工作中,我們的operator有哪些作用,解決了什么問(wèn)題,有什么具體內(nèi)容,都將在這篇梳理清晰,擁有如此的提前準(zhǔn)備,才可以在下一章寫下符合規(guī)定的編碼;
- 下面我們來(lái)聊一些情況專業(yè)知識(shí),便于更快的步入主題;
要求情況
- QPS:Queries-per-second,既每秒鐘查看率,就是網(wǎng)絡(luò)服務(wù)器在一秒的時(shí)間內(nèi)解決了多少個(gè)要求;
- 情況:做了網(wǎng)站建設(shè)的同學(xué)們對(duì)橫著擴(kuò)充應(yīng)當(dāng)都掌握,簡(jiǎn)易的說(shuō),假定一個(gè)tomcat的QPS限制為500,假如外界瀏覽的QPS做到了600,為了更好地確保全部網(wǎng)址服務(wù)水平,務(wù)必重新啟動(dòng)一個(gè)一樣的tomcat來(lái)一同平攤要求,如下圖所顯示(簡(jiǎn)易考慮,假定我們的后臺(tái)管理服務(wù)項(xiàng)目是無(wú)狀態(tài)的,換句話說(shuō)不依靠宿主機(jī)的IP、本地磁盤這類):
- 之上是橫著擴(kuò)充基本作法,在kubernetes自然環(huán)境,假如外界要求超出了單獨(dú)pod的處置極限,我們可以提升pod總數(shù)來(lái)做到橫著擴(kuò)充的目地,如下圖:
- 之上便是情況信息內(nèi)容,下面我們聊一聊elasticweb這一operator的主要作用;
要求表明
- 為了更好地說(shuō)清晰要求,這兒編造一個(gè)情景:小琪是個(gè)java開(kāi)發(fā)人員,便是下面這一妹紙:
- 如今小琪要將SpringBoot運(yùn)用布署到kubernetes上,她的狀況和面對(duì)的情況以下:
- springboot運(yùn)用已制成docker鏡像系統(tǒng);
- 根據(jù)壓測(cè)得到單獨(dú)pod的QPS為500;
- 估計(jì)得到發(fā)布后的總QPS會(huì)在800上下;
- 伴隨著運(yùn)營(yíng)策略轉(zhuǎn)變 ,QPS還會(huì)繼續(xù)有調(diào)節(jié);
- 總體來(lái)說(shuō),小琪手上僅有三個(gè)數(shù)據(jù)信息:docker鏡像系統(tǒng)、單獨(dú)pod的QPS、總QPS,她對(duì)kubernetes不了解,必須 有一個(gè)計(jì)劃方案來(lái)幫她將服務(wù)項(xiàng)目布署好,而且在運(yùn)轉(zhuǎn)期內(nèi)能支撐點(diǎn)外界的分布式系統(tǒng)瀏覽;
之上便是小琪的要求了,我們來(lái)總結(jié)一下:
- 我們?yōu)樾$鏖_(kāi)發(fā)設(shè)計(jì)一個(gè)operator(名叫elasticweb),對(duì)小琪而言,她只需將手上的三個(gè)主要參數(shù)(docker鏡像系統(tǒng)、單獨(dú)pod的QPS、總QPS)告知elasticweb就完事情了;
- elasticweb在kubernetes建立pod,對(duì)于pod總數(shù)自然是全自動(dòng)算出來(lái)的,要保障能達(dá)到QPS規(guī)定,以之前的具體情況為例子,必須2個(gè)pod才可以達(dá)到800的QPS;
- 單獨(dú)pod的QPS和總QPS都隨時(shí)隨地有可能轉(zhuǎn)變 ,一旦發(fā)生變化,elasticweb也需要全自動(dòng)調(diào)節(jié)pod總數(shù),以保證 服務(wù)水平;
- 為了更好地保證 服務(wù)項(xiàng)目能夠被外界啟用,我們?cè)夙槑托$鹘⒑胹ervice(她對(duì)kubernetes掌握很少,這事情我們就隨手干了吧);
自我保護(hù)申明
-
看了以上要求后,聰慧的您一定會(huì)對(duì)于我投來(lái)瞧不起的目光,實(shí)際上kubernetes早已有已有的QPS調(diào)整計(jì)劃方案了,比如改動(dòng)deployment的團(tuán)本數(shù)、單獨(dú)pod豎向擴(kuò)充、autoscale等都能夠,此次應(yīng)用operator來(lái)完成只是是為了更好地展現(xiàn)operator的研發(fā)全過(guò)程,并不是說(shuō)自定operator是唯一的解決方法;
-
因此,假如您認(rèn)為我這類用operator完成擴(kuò)充的方法很low,請(qǐng)不要將我罵得太慘,我這也就是為了更好地展現(xiàn)operator開(kāi)發(fā)設(shè)計(jì)全過(guò)程罷了,更何況咱這一operator也不是一無(wú)是處,用了這一operator,您就無(wú)需關(guān)心pod總數(shù)了,只需對(duì)焦單案例QPS和總QPS就可以,這兩個(gè)主要參數(shù)更接近業(yè)務(wù)流程;
-
為了更好地不把事兒弄繁雜,假定每一個(gè)pod需要的CPU和運(yùn)行內(nèi)存是確定的,立即在operator編碼中寫死,實(shí)際上您還可以自身改編碼,改為能夠在外界配備,如同鏡像系統(tǒng)名字主要參數(shù)那般;
-
把要求都交待明白了,下面進(jìn)到設(shè)計(jì)方案階段,先把CRD設(shè)計(jì)方案出去,這但是關(guān)鍵的算法設(shè)計(jì);
CRD設(shè)計(jì)方案之Spec一部分
Spec是用于儲(chǔ)存客戶的期望的,也就是小琪手上的三個(gè)主要參數(shù)(docker鏡像系統(tǒng)、單獨(dú)pod的QPS、總QPS),再再加上端口:
- image:業(yè)務(wù)流程服務(wù)項(xiàng)目相應(yīng)的鏡像系統(tǒng)
- port:service占有的宿主機(jī)端口號(hào),外界要求根據(jù)此端口號(hào)瀏覽pod的服務(wù)項(xiàng)目
- singlePodQPS:?jiǎn)为?dú)pod的QPS限制
- totalQPS:當(dāng)今全部項(xiàng)目的總QPS
- 對(duì)小琪而言,鍵入這四個(gè)主要參數(shù)就完事情了;
CRD設(shè)計(jì)方案之Status一部分
- Status用于儲(chǔ)存具體值,這兒設(shè)計(jì)方案成只有一個(gè)字段名realQPS,表明當(dāng)今全部operator具體能適用的QPS,那樣不論什么時(shí)候,只需小琪用kubectl describe指令就能了解當(dāng)今系統(tǒng)軟件事實(shí)上能適用是多少Q(mào)PS;
CRD源代碼
- 把算法設(shè)計(jì)說(shuō)清楚的較好辦法便是看編碼:
package v1
import (
"fmt"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"strconv"
)
// 期待情況
type ElasticWebSpec struct {
// 業(yè)務(wù)流程服務(wù)項(xiàng)目相應(yīng)的鏡像系統(tǒng),包含名字:tag
Image string `json:"image"`
// service占有的宿主機(jī)端口號(hào),外界要求根據(jù)此端口號(hào)瀏覽pod的服務(wù)項(xiàng)目
Port *int32 `json:"port"`
// 單獨(dú)pod的QPS限制
SinglePodQPS *int32 `json:"singlePodQPS"`
// 當(dāng)今全部業(yè)務(wù)的總QPS
TotalQPS *int32 `json:"totalQPS"`
}
// 具體情況,該算法設(shè)計(jì)中的值全是業(yè)務(wù)流程編碼推算出來(lái)的
type ElasticWebStatus struct {
// 當(dāng)今kubernetes中具體適用的總QPS
RealQPS *int32 `json:"realQPS"`
}
// kubebuilder:object:root=true
// ElasticWeb is the Schema for the elasticwebs API
type ElasticWeb struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`
Spec ElasticWebSpec `json:"spec,omitempty"`
Status ElasticWebStatus `json:"status,omitempty"`
}
func (in *ElasticWeb) String() string {
var realQPS string
if nil == in.Status.RealQPS {
realQPS = "nil"
} else {
realQPS = strconv.Itoa(int(*(in.Status.RealQPS)))
}
return fmt.Sprintf("Image [%s], Port [%d], SinglePodQPS [%d], TotalQPS [%d], RealQPS [%s]",
in.Spec.Image,
*(in.Spec.Port),
*(in.Spec.SinglePodQPS),
*(in.Spec.TotalQPS),
realQPS)
}
// kubebuilder:object:root=true
// ElasticWebList contains a list of ElasticWeb
type ElasticWebList struct {
metav1.TypeMeta `json:",inline"`
metav1.ListMeta `json:"metadata,omitempty"`
Items []ElasticWeb `json:"items"`
}
func init() {
SchemeBuilder.Register(&ElasticWeb{}, &ElasticWebList{})
}
業(yè)務(wù)流程數(shù)字邏輯
-
CRD的進(jìn)行意味著關(guān)鍵算法設(shè)計(jì)早已明確,下面是領(lǐng)域模型的設(shè)計(jì)方案,主要是理清晰controller的Reconcile方式里邊做些啥,實(shí)際上關(guān)鍵邏輯性或是比較簡(jiǎn)單的:算出必須多少個(gè)pod,隨后根據(jù)升級(jí)deployment讓pod總數(shù)做到規(guī)定,在這里關(guān)鍵的根基上再把建立deployment和service、更新status這種零碎的事兒搞好,就完事情了;
-
這兒將全部領(lǐng)域模型的流程表給出去以下所顯示,用以具體指導(dǎo)開(kāi)發(fā)設(shè)計(jì):
- 到此,我們完成了全部elasticweb的需要和設(shè)計(jì)方案,聰慧的您毫無(wú)疑問(wèn)早已成竹在胸,并且急不可耐的想運(yùn)行開(kāi)發(fā)設(shè)計(jì)了,好的,下一篇我們正式開(kāi)始編號(hào)!
參考文獻(xiàn)
- 您也許會(huì)怪異,小琪對(duì)kubernetes不了解,為什么會(huì)了解docker鏡像系統(tǒng)的制做,也有單獨(dú)pod的QPS她是怎么測(cè)的呢?
- 實(shí)際上她是程序猿欣宸的粉絲,早已閱讀文章過(guò)下列blog:
- 《SpringBoot-2.3鏡像方案為什么要做多個(gè)layer》
- 《體驗(yàn)SpringBoot(2.3)應(yīng)用制作Docker鏡像(官方方案)》
- 《詳解SpringBoot(2.3)應(yīng)用制作Docker鏡像(官方方案)》
- 《Kubernetes下web服務(wù)的性能測(cè)試三部曲之一:準(zhǔn)備工作》
- 《Kubernetes下web服務(wù)的性能測(cè)試三部曲之二:縱向擴(kuò)容》
- 《Kubernetes下web服務(wù)的性能測(cè)試三部曲之三:橫向擴(kuò)容》
你并不孤單,欣宸原創(chuàng)一路相伴
- Java系列
- Spring系列
- Docker系列產(chǎn)品
- kubernetes系列
- 數(shù)據(jù)庫(kù)查詢 分布式數(shù)據(jù)庫(kù)系列產(chǎn)品
- DevOps系列
熱烈歡迎掃碼關(guān)注:程序猿欣宸
搜索微信「程序猿欣宸」,我是欣宸,希望與您一同遨游Java世界...
https://github.com/zq2599/blog_demos