租約
分散式系統通常需要**租約**,它提供了一種機制來鎖定共享資源並協調一組成員之間的活動。在 Kubernetes 中,租約概念由 coordination.k8s.io
API 組中的 Lease 物件表示,用於節點心跳和元件級領導者選舉等系統關鍵功能。
節點心跳
Kubernetes 使用 Lease API 將 kubelet 節點心跳傳送到 Kubernetes API 伺服器。對於每個 Node
,在 kube-node-lease
名稱空間中都有一個同名的 Lease
物件。在底層,每個 kubelet 心跳都是對該 Lease
物件的**更新**請求,更新 Lease 的 spec.renewTime
欄位。Kubernetes 控制平面使用此欄位的時間戳來確定該 Node
的可用性。
有關更多詳細資訊,請參閱節點租約物件。
領導者選舉
Kubernetes 還使用租約來確保元件在任何給定時間只有一個例項執行。這被 kube-controller-manager
和 kube-scheduler
等控制平面元件在 HA 配置中使用,其中元件只有一個例項應處於活動執行狀態,而其他例項處於備用狀態。
閱讀協調領導者選舉以瞭解 Kubernetes 如何基於 Lease API 選擇哪個元件例項充當領導者。
API 伺服器身份
Kubernetes v1.26 [beta]
(預設啟用:true)從 Kubernetes v1.26 開始,每個 kube-apiserver
都使用 Lease API 將其身份釋出到系統的其餘部分。雖然這本身並沒有特別大的用處,但它為客戶端提供了一種機制來發現有多少 kube-apiserver
例項在操作 Kubernetes 控制平面。kube-apiserver 租約的存在使未來的功能得以實現,這些功能可能需要每個 kube-apiserver 之間的協調。
您可以透過檢查 kube-system
名稱空間中名為 apiserver-<sha256-hash>
的租約物件來檢查每個 kube-apiserver 擁有的租約。或者,您可以使用標籤選擇器 apiserver.kubernetes.io/identity=kube-apiserver
kubectl -n kube-system get lease -l apiserver.kubernetes.io/identity=kube-apiserver
NAME HOLDER AGE
apiserver-07a5ea9b9b072c4a5f3d1c3702 apiserver-07a5ea9b9b072c4a5f3d1c3702_0c8914f7-0f35-440e-8676-7844977d3a05 5m33s
apiserver-7be9e061c59d368b3ddaf1376e apiserver-7be9e061c59d368b3ddaf1376e_84f2a85d-37c1-4b14-b6b9-603e62e4896f 4m23s
apiserver-1dfef752bcb36637d2763d1868 apiserver-1dfef752bcb36637d2763d1868_c5ffa286-8a9a-45d4-91e7-61118ed58d2e 4m43s
租約名稱中使用的 SHA256 雜湊基於該 API 伺服器所看到的作業系統主機名。每個 kube-apiserver 都應配置為使用在叢集中唯一的主機名。使用相同主機名的新 kube-apiserver 例項將使用新的持有者身份接管現有租約,而不是例項化新的 Lease 物件。您可以透過檢查 kubernetes.io/hostname
標籤的值來檢查 kube-apisever 使用的主機名
kubectl -n kube-system get lease apiserver-07a5ea9b9b072c4a5f3d1c3702 -o yaml
apiVersion: coordination.k8s.io/v1
kind: Lease
metadata:
creationTimestamp: "2023-07-02T13:16:48Z"
labels:
apiserver.kubernetes.io/identity: kube-apiserver
kubernetes.io/hostname: master-1
name: apiserver-07a5ea9b9b072c4a5f3d1c3702
namespace: kube-system
resourceVersion: "334899"
uid: 90870ab5-1ba9-4523-b215-e4d4e662acb1
spec:
holderIdentity: apiserver-07a5ea9b9b072c4a5f3d1c3702_0c8914f7-0f35-440e-8676-7844977d3a05
leaseDurationSeconds: 3600
renewTime: "2023-07-04T21:58:48.065888Z"
不再存在的 kube-apiserver 的過期租約將在 1 小時後由新的 kube-apiserver 垃圾回收。
您可以透過停用 APIServerIdentity
功能門控來停用 API 伺服器身份租約。
工作負載
您自己的工作負載可以定義自己對租約的使用。例如,您可能執行一個自定義控制器,其中主成員或領導者成員執行其對等方不執行的操作。您定義一個租約,以便控制器副本可以使用 Kubernetes API 進行協調,以選擇或選舉領導者。如果您確實使用租約,最好為租約定義一個與產品或元件明顯相關的名稱。例如,如果您的元件名為 Example Foo,請使用名為 example-foo
的租約。
如果叢集操作員或其他終端使用者可以部署元件的多個例項,請選擇一個名稱字首並選擇一種機制(例如 Deployment 名稱的雜湊)來避免租約的名稱衝突。
只要能達到相同的效果:不同的軟體產品不會相互衝突,您就可以使用其他方法。