Kubernetes 拓撲感知提示

2022-05-06 14:35 更新

拓撲感知提示

FEATURE STATE: Kubernetes v1.23 [beta]

拓撲感知提示 包含客戶怎么使用服務(wù)端點的建議,從而實現(xiàn)了拓撲感知的路由功能。 這種方法添加了元數(shù)據(jù),以啟用 EndpointSlice 和/或 Endpoints 對象的調(diào)用者, 這樣,訪問這些網(wǎng)絡(luò)端點的請求流量就可以在它的發(fā)起點附近就近路由。

例如,你可以在一個地域內(nèi)路由流量,以降低通信成本,或提高網(wǎng)絡(luò)性能。

“拓撲感知提示”特性處于 Beta 階段,并且默認情況下未啟用。 要試用此特性,你必須啟用 ?TopologyAwareHints ?特性門控。

動機

Kubernetes 集群越來越多的部署到多區(qū)域環(huán)境中。 拓撲感知提示 提供了一種把流量限制在它的發(fā)起區(qū)域之內(nèi)的機制。 這個概念一般被稱之為 “拓撲感知路由”。 在計算 服務(wù)(Service) 的端點時, EndpointSlice 控制器會評估每一個端點的拓撲(地域和區(qū)域),填充提示字段,并將其分配到某個區(qū)域。 集群組件,例如kube-proxy 就可以使用這些提示信息,并用他們來影響流量的路由(傾向于拓撲上相鄰的端點)。

使用拓撲感知提示

你可以通過把注解 ?service.kubernetes.io/topology-aware-hints? 的值設(shè)置為 ?auto?, 來激活服務(wù)的拓撲感知提示功能。 這告訴 EndpointSlice 控制器在它認為安全的時候來設(shè)置拓撲提示。 重要的是,這并不能保證總會設(shè)置提示(hints)。

工作原理 

此特性啟用的功能分為兩個組件:EndpointSlice 控制器和 kube-proxy。 本節(jié)概述每個組件如何實現(xiàn)此特性。

EndpointSlice 控制器

此特性開啟后,EndpointSlice 控制器負責在 EndpointSlice 上設(shè)置提示信息。 控制器按比例給每個區(qū)域分配一定比例數(shù)量的端點。 這個比例來源于此區(qū)域中運行節(jié)點的 可分配 CPU 核心數(shù)。 例如,如果一個區(qū)域擁有 2 CPU 核心,而另一個區(qū)域只有 1 CPU 核心, 那控制器將給那個有 2 CPU 的區(qū)域分配兩倍數(shù)量的端點。

以下示例展示了提供提示信息后 EndpointSlice 的樣子:

apiVersion: discovery.k8s.io/v1
kind: EndpointSlice
metadata:
  name: example-hints
  labels:
    kubernetes.io/service-name: example-svc
addressType: IPv4
ports:
  - name: http
    protocol: TCP
    port: 80
endpoints:
  - addresses:
      - "10.1.2.3"
    conditions:
      ready: true
    hostname: pod-1
    zone: zone-a
    hints:
      forZones:
        - name: "zone-a"

kube-proxy

kube-proxy 組件依據(jù) EndpointSlice 控制器設(shè)置的提示,過濾由它負責路由的端點。 在大多數(shù)場合,這意味著 kube-proxy 可以把流量路由到同一個區(qū)域的端點。 有時,控制器從某個不同的區(qū)域分配端點,以確保在多個區(qū)域之間更平均的分配端點。 這會導(dǎo)致部分流量被路由到其他區(qū)域。

保護措施

Kubernetes 控制平面和每個節(jié)點上的 kube-proxy,在使用拓撲感知提示功能前,會應(yīng)用一些保護措施規(guī)則。 如果沒有檢出,kube-proxy 將無視區(qū)域限制,從集群中的任意節(jié)點上選擇端點。

  1. 端點數(shù)量不足: 如果一個集群中,端點數(shù)量少于區(qū)域數(shù)量,控制器不創(chuàng)建任何提示。
  2. 不可能實現(xiàn)均衡分配: 在一些場合中,不可能實現(xiàn)端點在區(qū)域中的平衡分配。 例如,假設(shè) zone-a 比 zone-b 大兩倍,但只有 2 個端點, 那分配到 zone-a 的端點可能收到比 zone-b多兩倍的流量。 如果控制器不能確定此“期望的過載”值低于每一個區(qū)域可接受的閾值,控制器將不指派提示信息。 重要的是,這不是基于實時反饋。所以對于單獨的端點仍有可能超載。
  3. 一個或多個節(jié)點信息不足: 如果任一節(jié)點沒有設(shè)置標簽 ?topology.kubernetes.io/zone?, 或沒有上報可分配的 CPU 數(shù)據(jù),控制平面將不會設(shè)置任何拓撲感知提示, 繼而 kube-proxy 也就不能通過區(qū)域過濾端點。
  4. 一個或多個端點沒有設(shè)置區(qū)域提示: 當這類事情發(fā)生時, kube-proxy 會假設(shè)這是正在執(zhí)行一個從/到拓撲感知提示的轉(zhuǎn)移。 在這種場合下過濾Service 的端點是有風(fēng)險的,所以 kube-proxy 回撤為使用所有的端點。
  5. 不在提示中的區(qū)域: 如果 kube-proxy 不能根據(jù)一個指示在它所在的區(qū)域中發(fā)現(xiàn)一個端點, 它回撤為使用所有節(jié)點的端點。當你的集群新增一個新的區(qū)域時,這種情況發(fā)生概率很高。

限制

  • 當 Service 的 ?externalTrafficPolicy ?或 ?internalTrafficPolicy ?設(shè)置值為 ?Local ?時, 拓撲感知提示功能不可用。 你可以在一個集群的不同服務(wù)中使用這兩個特性,但不能在同一個服務(wù)中這么做。
  • 這種方法不適用于大部分流量來自于一部分區(qū)域的服務(wù)。 相反的,這里假設(shè)入站流量將根據(jù)每個區(qū)域中節(jié)點的服務(wù)能力按比例的分配。
  • EndpointSlice 控制器在計算每一個區(qū)域的容量比例時,會忽略未就緒的節(jié)點。 在大量節(jié)點未就緒的場景下,這樣做會帶來非預(yù)期的結(jié)果。
  • EndpointSlice 控制器在計算每一個區(qū)域的部署比例時,并不會考慮 容忍度。 如果服務(wù)后臺的 Pod 被限制只能運行在集群節(jié)點的一個子集上,這些信息并不會被使用。
  • 這種方法和自動擴展機制之間不能很好的協(xié)同工作。例如,如果大量流量來源于一個區(qū)域, 那只有分配到該區(qū)域的端點才可用來處理流量。這會導(dǎo)致 Pod 自動水平擴展 要么不能拾取此事件,要么新增 Pod 被啟動到其他區(qū)域。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號