租約

分散式系統通常需要**租約**,它提供了一種機制來鎖定共享資源並協調一組成員之間的活動。在 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-managerkube-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 名稱的雜湊)來避免租約的名稱衝突。

只要能達到相同的效果:不同的軟體產品不會相互衝突,您就可以使用其他方法。

上次修改時間為太平洋標準時間 2025 年 1 月 17 日下午 3:54:修復:leases.md 中的錯字 (5381a2eeb6)