KubernetesAPI設(shè)計(jì)中Conditions怎么用

這篇文章主要介紹了Kubernetes API設(shè)計(jì)中Conditions怎么用的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇Kubernetes API設(shè)計(jì)中Conditions怎么用文章都會(huì)有所收獲,下面我們一起來看看吧。

網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)建站!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、微信平臺(tái)小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了云浮免費(fèi)建站歡迎大家使用!

導(dǎo)讀

絕大部分Kubernetes資源對(duì)象都包含status.conditions字段,用來表示資源狀態(tài),比如deployment資源中的status.conditions如下所示:

  conditions:
  - lastTransitionTime: "2020-12-15T01:52:53Z"
    lastUpdateTime: "2020-12-15T01:52:53Z"
    message: Deployment has minimum availability.
    reason: MinimumReplicasAvailable
    status: "True"
    type: Available
  - lastTransitionTime: "2020-12-15T01:52:39Z"
    lastUpdateTime: "2020-12-15T01:52:53Z"
    message: ReplicaSet "nginx-deployment-85b45874d9" has successfully progressed.
    reason: NewReplicaSetAvailable
    status: "True"
    type: Progressing

以上conditions的信息是很容易讀懂的(后面還會(huì)詳細(xì)解釋),然而有個(gè)問題曾經(jīng)令筆者非常困惑,那就是:

  • conditionsstatus到底有什么區(qū)別?

  • conditions的設(shè)計(jì)原則是什么?在設(shè)計(jì)API擴(kuò)展時(shí),該如何定義conditions?

本節(jié)會(huì)先從conditions的設(shè)計(jì)原則講起,再介紹一些設(shè)計(jì)conditions時(shí)的一些經(jīng)驗(yàn)總結(jié)。

conditions設(shè)計(jì)原則

conditions寄居于資源對(duì)象的status字段中,與status其他字段值一樣都用來表示資源的狀態(tài)。不過conditions的設(shè)計(jì)初衷是提供一種通用的數(shù)據(jù)結(jié)構(gòu)表示資源的狀態(tài),它通常能夠提供比status其他字段更詳細(xì)的信息(比如狀態(tài)切換時(shí)間、更新時(shí)間),conditions實(shí)際上是一種擴(kuò)展機(jī)制,外部監(jiān)控程序可以根據(jù)conditions無差別地監(jiān)控各種資源的狀態(tài),而不必過分關(guān)注資源對(duì)象status中的其他信息。

通常status.conditions字段類型為切片,切片中的每個(gè)元素表示資源的某個(gè)狀態(tài),該狀態(tài)由特定的控制器更新,比如Deployment控制器會(huì)更新deployment對(duì)象的status.conditions信息。conditions作為擴(kuò)展機(jī)制,它還支持第三方控制器增加新的狀態(tài)。通常status.conditions中的信息由控制器根據(jù)資源的status其他字段計(jì)算出來。

condition字段內(nèi)容

通常一個(gè)condition必須包含type(狀態(tài)類型)和status(狀態(tài)值)兩個(gè)信息。在Kubernetes v1.19版之前,關(guān)于condition并沒有統(tǒng)一的標(biāo)準(zhǔn),導(dǎo)致眾多API都自行定義了condition。比如:

  • Deployment使用的Condition為type DeploymentCondition struct;

  • Pod使用的Condition為type PodCondition struct;

慶幸的是,在Kubernetesv1.19版本社區(qū)提供了一個(gè)標(biāo)準(zhǔn)的condition類型定義,由于兼容性考慮,Kubernetes既有的API不一定能采用這一標(biāo)準(zhǔn)類型,但對(duì)于后續(xù)新增的API將會(huì)使用這一標(biāo)準(zhǔn)類型,并且筆者建議用戶設(shè)計(jì)的CRD擴(kuò)展也應(yīng)使用這一標(biāo)準(zhǔn)類型。

標(biāo)準(zhǔn)的condition類型定義如下所示:

type ConditionStatus string

const (
	ConditionTrue    ConditionStatus = "True"
	ConditionFalse   ConditionStatus = "False"
	ConditionUnknown ConditionStatus = "Unknown"
)

type Condition struct {
	// 類型(使用駝峰風(fēng)格),如”Available“。
	Type string
	// 狀態(tài)(枚舉值:”True“、”False“和”Unknown“)。
	Status ConditionStatus
	// 觀察到的generation。
	// 如果ObservedGeneration 比metada.generation小,說明不是最新狀態(tài)。
	// +optional
	ObservedGeneration int64
	// 上次變化時(shí)間
	LastTransitionTime Time
	// 狀態(tài)變化原因(使用駝峰風(fēng)格),如”NewReplicaSetAvailable“
	Reason string
	// 描述信息,如”Deployment has minimum availability“
	Message string `json:"message" protobuf:"bytes,6,opt,name=message"`
}

標(biāo)準(zhǔn)的condition類型定義對(duì)condition的各個(gè)字段做了進(jìn)一步約定。除了ObservedGeneration是可選的以外,其他字段都是必填的。

condition設(shè)計(jì)約定

為了讓condition起到最大的作用,需要遵守一定的設(shè)計(jì)約定:

約定一:condition定義要有明確的信息

每個(gè)condition需要傳遞一個(gè)用戶關(guān)心的明確信息,用戶讀取到該信息不需要再根據(jù)資源的其他狀態(tài)來揣測和計(jì)算。

約定二:condition需要保持兼容

condition一旦被定義,它就成了API中的一部分,需要跟API一樣提供穩(wěn)定性保證。如果需要新的condition仍然可以增加(沒有破壞兼容性),但既有的condition是否能夠改變就需要根據(jù)API成熟度來決定,比如stable的API不可以改變,alpha的API可以改變。

約定三:condition需要控制器第一次處理資源時(shí)更新

控制器需要盡快地更新condition狀態(tài)值(condition.status),即便該狀態(tài)值為Unknown,這么做的好處是可以讓其他組件了解到控制器正在調(diào)諧這個(gè)資源。

然而,并不是所有的控制器都能遵守這個(gè)約定,即控制器并不會(huì)報(bào)告特定的condition(此時(shí)該condition狀態(tài)值可能為Unknown),可能該condition還無法確定,需要在下一次調(diào)諧時(shí)決定。此種情況下,外部組件無法讀取到特定的condition,可以假設(shè)該conditionUnknown。

約定四:condition類型名需要確??勺x性

condition類型名要使用人類可讀的名稱,而且盡量避免出現(xiàn)雙重否定的語境。例如,類型名Ready比使用Failed要好,因?yàn)?code>condition狀態(tài)為False時(shí),Failed = False將出現(xiàn)雙重否定,不如Ready = False容易理解。

約定五:condition不要定義成狀態(tài)機(jī)

condition需要描述當(dāng)前資源的確定狀態(tài),而不是當(dāng)前資源狀態(tài)機(jī)中的狀態(tài)。通俗地講,condition類型需要使用形容詞(如Ready)或過去動(dòng)詞(Succeeded),而不是使用當(dāng)前運(yùn)行時(shí)(如Deploying)。

關(guān)于“Kubernetes API設(shè)計(jì)中Conditions怎么用”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“Kubernetes API設(shè)計(jì)中Conditions怎么用”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

名稱欄目:KubernetesAPI設(shè)計(jì)中Conditions怎么用
網(wǎng)站鏈接:http://bm7419.com/article2/igcpic.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司手機(jī)網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、網(wǎng)站策劃營銷型網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司