Kubernetes 使用拓撲鍵實現(xiàn)拓撲感知的流量路由

2022-05-06 10:01 更新

使用拓撲鍵實現(xiàn)拓撲感知的流量路由

FEATURE STATE: Kubernetes v1.21 [deprecated]

此功能特性,尤其是 Alpha 階段的 ?topologyKeys ?API,在 Kubernetes v1.21 版本中已被廢棄。Kubernetes v1.21 版本中引入的 拓撲感知的提示, 提供類似的功能。

服務拓撲(Service Topology)可以讓一個服務基于集群的 Node 拓撲進行流量路由。 例如,一個服務可以指定流量是被優(yōu)先路由到一個和客戶端在同一個 Node 或者在同一可用區(qū)域的端點。

拓撲感知的流量路由

默認情況下,發(fā)往 ?ClusterIP ?或者 ?NodePort ?服務的流量可能會被路由到 服務的任一后端的地址。Kubernetes 1.7 允許將“外部”流量路由到接收到流量的 節(jié)點上的 Pod。對于 ?ClusterIP ?服務,無法完成同節(jié)點優(yōu)先的路由,你也無法 配置集群優(yōu)選路由到同一可用區(qū)中的端點。 通過在 Service 上配置 ?topologyKeys?,你可以基于來源節(jié)點和目標節(jié)點的 標簽來定義流量路由策略。

通過對源和目的之間的標簽匹配,作為集群操作者的你可以根據(jù)節(jié)點間彼此“較近”和“較遠” 來定義節(jié)點集合。你可以基于符合自身需求的任何度量值來定義標簽。 例如,在公有云上,你可能更偏向于把流量控制在同一區(qū)內,因為區(qū)間流量是有費用成本的, 而區(qū)內流量則沒有。 其它常見需求還包括把流量路由到由 ?DaemonSet ?管理的本地 Pod 上,或者 把將流量轉發(fā)到連接在同一機架交換機的節(jié)點上,以獲得低延時。

使用服務拓撲

如果集群啟用了 ?ServiceTopology ?特性門控, 你就可以在 Service 規(guī)約中設定 ?topologyKeys ?字段,從而控制其流量路由。 此字段是 ?Node ?標簽的優(yōu)先順序字段,將用于在訪問這個 ?Service ?時對端點進行排序。 流量會被定向到第一個標簽值和源 ?Node ?標簽值相匹配的 ?Node?。 如果這個 ?Service ?沒有匹配的后端 ?Node?,那么第二個標簽會被使用做匹配, 以此類推,直到?jīng)]有標簽。

如果沒有匹配到,流量會被拒絕,就如同這個 ?Service ?根本沒有后端。 換言之,系統(tǒng)根據(jù)可用后端的第一個拓撲鍵來選擇端點。 如果這個字段被配置了而沒有后端可以匹配客戶端拓撲,那么這個 ?Service ?對那個客戶端是沒有后端的,鏈接應該是失敗的。 這個字段配置為 ?"*"? 意味著任意拓撲。 這個通配符值如果使用了,那么只有作為配置值列表中的最后一個才有用。

如果 ?topologyKeys ?沒有指定或者為空,就沒有啟用這個拓撲約束。

一個集群中,其 ?Node ?的標簽被打為其主機名,區(qū)域名和地區(qū)名。 那么就可以設置 ?Service ?的 ?topologyKeys ?的值,像下面的做法一樣定向流量了。

  • 只定向到同一個 ?Node ?上的端點,?Node ?上沒有端點存在時就失?。?nbsp;配置 [?"kubernetes.io/hostname"?]。
  • 偏向定向到同一個 ?Node ?上的端點,回退同一區(qū)域的端點上,然后是同一地區(qū), 其它情況下就失?。号渲?nbsp;[??"kubernetes.io/hostname"?, "topology.kubernetes.io/zone", "topology.kubernetes.io/region"?]。 這或許很有用,例如,數(shù)據(jù)局部性很重要的情況下。
  • 偏向于同一區(qū)域,但如果此區(qū)域中沒有可用的終結點,則回退到任何可用的終結點: 配置 [?"topology.kubernetes.io/zone", "*"?]。

約束條件

  • 服務拓撲和 ?externalTrafficPolicy=Local? 是不兼容的,所以 ?Service ?不能同時使用這兩種特性。 但是在同一個集群的不同 ?Service ?上是可以分別使用這兩種特性的,只要不在同一個 ?Service ?上就可以。
  • 有效的拓撲鍵目前只有:?kubernetes.io/hostname?、?topology.kubernetes.io/zone? 和 ?topology.kubernetes.io/region?,但是未來會推廣到其它的 ?Node ?標簽。
  • 拓撲鍵必須是有效的標簽,并且最多指定16個。
  • 通配符:?"*"?,如果要用,則必須是拓撲鍵值的最后一個值。

示例

以下是使用服務拓撲功能的常見示例。

僅節(jié)點本地端點 

僅路由到節(jié)點本地端點的一種服務。如果節(jié)點上不存在端點,流量則被丟棄:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376
  topologyKeys:
    - "kubernetes.io/hostname"

首選節(jié)點本地端點

首選節(jié)點本地端點,如果節(jié)點本地端點不存在,則回退到集群范圍端點的一種服務:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376
  topologyKeys:
    - "kubernetes.io/hostname"
    - "*"

僅地域或區(qū)域端點

首選地域端點而不是區(qū)域端點的一種服務。 如果以上兩種范圍內均不存在端點, 流量則被丟棄。

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376
  topologyKeys:
    - "topology.kubernetes.io/zone"
    - "topology.kubernetes.io/region"

優(yōu)先選擇節(jié)點本地端點、地域端點,然后是區(qū)域端點

優(yōu)先選擇節(jié)點本地端點,地域端點,然后是區(qū)域端點,最后才是集群范圍端點的 一種服務。

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376
  topologyKeys:
    - "kubernetes.io/hostname"
    - "topology.kubernetes.io/zone"
    - "topology.kubernetes.io/region"
    - "*"


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號