原生Kubernetes Service的後端端點扁平分布在叢集中任意節點。因此,跨越不同分組節點的Service流量,會大機率出現訪問不可達、或者訪問效率低下的問題。Service流量拓撲支援邊緣節點應用只能由相同節點池的節點訪問,或者只能由本節點訪問。本文介紹Service流量拓撲管理功能以及如何配置Service流量拓撲。
背景資訊
在邊緣計算情境下,邊緣節點通常具備很強的地區性、地區性或者其他邏輯上的分組特性(比如具有相同的CPU架構、電訊廠商或雲供應商),不同分組的節點間往往存在網路不互連、資源不共用、資源異構、應用獨立等明顯的隔離屬性。
Service流量拓撲管理實現原理
為瞭解決上述問題,Container Service Edge 版基於原生的Service,增加了Endpoint的拓撲管理功能,即通過簡單配置來限制Service後端Endpoint的存取範圍。例如,邊緣節點應用只能由相同節點池的節點訪問,或者只能由本節點訪問。具體實現原理如下圖所示。
Service1關聯後端Pod2和Pod3兩個執行個體,且Service1通過
annotation:"openyurt.io/topologyKeys: kubernetes.io/zone"
配置了其拓撲節點池範圍。Pod2所在的節點2和Pod3所在的節點4分別屬於兩個不同的節點池A和節點池B。
因為Pod3和Pod1不在一個節點池,當Pod1訪問Service1時,流量只會轉寄到Pod2上,訪問Pod3的流量被限制。
注意事項
v1.26.3-aliyun.1以下版本:建立Service時,需要同步配置Service的流量拓撲註解,流量拓撲功能才會生效。如果Service建立完成後,再增加註解配置,流量拓撲功能無法生效,此時需要刪除該Service,重新建立。
v1.26.3-aliyun.1及以上版本:Service拓撲註解支援建立後修改,修改後Service拓撲功能會立即生效。
註解說明
通過在原生的Service上添加Annotation實現流量的拓撲配置,相關參數如下所示。
annotation Key | annotation Value | 說明 |
openyurt.io/topologyKeys | kubernetes.io/hostname | 限制Service只能被本節點訪問。 |
openyurt.io/topologyKeys | kubernetes.io/zone或openyurt.io/nodepool | 限制Service只能被本節點池的節點訪問。ACK Edge叢集版本如果大於等於1.18,推薦您使用openyurt.io/nodepool。 |
- | - | Service不做任何拓撲限制。 |
配置Service流量拓撲
您可以通過控制台或命令列兩種方式進行Service流量拓撲配置。
方式一:通過控制台配置Service流量拓撲
若您需要建立一個限制在本節點池內被訪問的Service,只需要給Service添加註解即可。例如將名稱配置為openyurt.io/topologyKeys
,值配置為kubernetes.io/zone
。關於建立服務的更多資訊,請參見Service快速入門。
方式二:通過命令列配置Service流量拓撲
建立一個使用節點池拓撲域的Service,YAML範例如下。
apiVersion: v1
kind: Service
metadata:
annotations:
openyurt.io/topologyKeys: kubernetes.io/zone
name: my-service-nodepool
namespace: default
spec:
ports:
- port: 80
protocol: TCP
targetPort: 8080
selector:
app: nginx
sessionAffinity: None
type: ClusterIP