這篇文章主要介紹了Kubernetes API設(shè)計中Conditions怎么用的相關(guān)知識,內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Kubernetes API設(shè)計中Conditions怎么用文章都會有所收獲,下面我們一起來看看吧。
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)建站!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、微信平臺小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了云浮免費建站歡迎大家使用!
絕大部分Kubernetes
資源對象都包含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
的信息是很容易讀懂的(后面還會詳細(xì)解釋),然而有個問題曾經(jīng)令筆者非常困惑,那就是:
conditions
和status
到底有什么區(qū)別?
conditions
的設(shè)計原則是什么?在設(shè)計API擴(kuò)展時,該如何定義conditions
?
本節(jié)會先從conditions
的設(shè)計原則講起,再介紹一些設(shè)計conditions
時的一些經(jīng)驗總結(jié)。
conditions
寄居于資源對象的status
字段中,與status
其他字段值一樣都用來表示資源的狀態(tài)。不過conditions
的設(shè)計初衷是提供一種通用的數(shù)據(jù)結(jié)構(gòu)表示資源的狀態(tài),它通常能夠提供比status
其他字段更詳細(xì)的信息(比如狀態(tài)切換時間、更新時間),conditions
實際上是一種擴(kuò)展機(jī)制,外部監(jiān)控程序可以根據(jù)conditions
無差別地監(jiān)控各種資源的狀態(tài),而不必過分關(guān)注資源對象status
中的其他信息。
通常status.conditions
字段類型為切片,切片中的每個元素表示資源的某個狀態(tài),該狀態(tài)由特定的控制器更新,比如Deployment
控制器會更新deployment
對象的status.conditions
信息。conditions
作為擴(kuò)展機(jī)制,它還支持第三方控制器增加新的狀態(tài)。通常status.conditions
中的信息由控制器根據(jù)資源的status
其他字段計算出來。
通常一個condition
必須包含type
(狀態(tài)類型)和status
(狀態(tài)值)兩個信息。在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
;
慶幸的是,在Kubernetes
v1.19版本社區(qū)提供了一個標(biāo)準(zhǔn)的condition
類型定義,由于兼容性考慮,Kubernetes
既有的API不一定能采用這一標(biāo)準(zhǔn)類型,但對于后續(xù)新增的API將會使用這一標(biāo)準(zhǔn)類型,并且筆者建議用戶設(shè)計的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 // 上次變化時間 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
類型定義對condition
的各個字段做了進(jìn)一步約定。除了ObservedGeneration
是可選的以外,其他字段都是必填的。
為了讓condition
起到最大的作用,需要遵守一定的設(shè)計約定:
每個condition
需要傳遞一個用戶關(guān)心的明確信息,用戶讀取到該信息不需要再根據(jù)資源的其他狀態(tài)來揣測和計算。
condition
一旦被定義,它就成了API中的一部分,需要跟API一樣提供穩(wěn)定性保證。如果需要新的condition
仍然可以增加(沒有破壞兼容性),但既有的condition
是否能夠改變就需要根據(jù)API成熟度來決定,比如stable
的API不可以改變,alpha
的API可以改變。
控制器需要盡快地更新condition
狀態(tài)值(condition.status
),即便該狀態(tài)值為Unknown
,這么做的好處是可以讓其他組件了解到控制器正在調(diào)諧
這個資源。
然而,并不是所有的控制器都能遵守這個約定,即控制器并不會報告特定的condition
(此時該condition
狀態(tài)值可能為Unknown
),可能該condition
還無法確定,需要在下一次調(diào)諧
時決定。此種情況下,外部組件無法讀取到特定的condition
,可以假設(shè)該condition
為Unknown
。
condition
類型名要使用人類可讀的名稱,而且盡量避免出現(xiàn)雙重否定的語境。例如,類型名Ready
比使用Failed
要好,因為condition
狀態(tài)為False
時,Failed = False
將出現(xiàn)雙重否定,不如Ready = False
容易理解。
condition
需要描述當(dāng)前資源的確定狀態(tài),而不是當(dāng)前資源狀態(tài)機(jī)中的狀態(tài)。通俗地講,condition
類型需要使用形容詞(如Ready
)或過去動詞(Succeeded
),而不是使用當(dāng)前運行時(如Deploying
)。
關(guān)于“Kubernetes API設(shè)計中Conditions怎么用”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“Kubernetes API設(shè)計中Conditions怎么用”知識都有一定的了解,大家如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。