使用 EndpointSlice 擴(kuò)展 Kubernetes 網(wǎng)絡(luò)
EndpointSlice 是一個(gè)新 API,它提供了 Endpoint API 可伸縮和可拓展的替代方案。EndpointSlice 會(huì)跟蹤 Service Pod 的 IP 地址、端口、readiness 和拓?fù)湫畔ⅰ?/span>
在 Kubernetes v1.19 中,此功能將默認(rèn)啟用:從 EndpointSlice (不是 Endpoint)中讀取 kube-proxy。盡管這個(gè)更改看起來并不起眼,但實(shí)際上它能讓大型集群的可伸縮性得到顯著提高。另外,它還與 Kubernetes 未來版本中的重要新功能有關(guān),例如 Topology Aware Routing。
Endpoint API 可伸縮性限制
如果使用 Endpoint API,Service 只有一個(gè) Endpoint 資源。這意味著它需要為 Service 的每個(gè) Pod 都存儲(chǔ)好 IP 地址和端口(網(wǎng)絡(luò)端點(diǎn)),這需要大量的 API 資源。另外,kube-proxy 會(huì)在每個(gè)節(jié)點(diǎn)上運(yùn)行,并監(jiān)控 Endpoint 資源的任何更新。如果 Endpoint 資源中有一個(gè)端口發(fā)生更改,那么整個(gè)對(duì)象都會(huì)分發(fā)到 kube-proxy 的每個(gè)實(shí)例。
EndpointSlice API 拆分 Endpoint
EndpointSlice API 旨在通過類似于分片的方法來解決該問題。我們不跟蹤 Service Pod IP 的單個(gè) Endpoint 資源,而是將它們拆分為多個(gè)較小的 EndpointSlice。

默認(rèn)情況下,EndpointSlice 每個(gè)存儲(chǔ)能多達(dá) 100 個(gè)端點(diǎn),我們可以使用 kube-controller-manager 的 --max-endpoints-per-slice 標(biāo)簽進(jìn)行配置。
EndpointSlice 提升 10 倍可伸縮性
EndpointSlice API 大大提高了網(wǎng)絡(luò)的可伸縮性,因?yàn)楝F(xiàn)在添加或刪除 Pod 時(shí),只需更新 1 個(gè)小的 EndpointSlice。尤其是成百上千個(gè) Pod 支持單個(gè) Service 時(shí),差異將非常明顯。
EndpointSlice 有關(guān)新功能
作為 Kubernetes v1.16 中的 alpha 功能引入的 EndpointSlice 在 Kubernetes 未來版本中,會(huì)和一些令人興奮的新功能有關(guān),例如 dual-stack Service、topology aware routing 和 endpoint subsetting。
Topology aware routing 會(huì)更新 kube-proxy 以 prefer 同一區(qū)域或區(qū)域內(nèi)的路由請(qǐng)求。這使用了為 EndpointSlice 端點(diǎn)存儲(chǔ)的拓?fù)渥侄巍A硗猓壳斑€在探索 endpoint subsetting 的潛力,未來 kube-proxy 將只允許觀察 EndpointSlice 的子集。這可以與 topology aware routing 結(jié)合使用,這樣 kube-proxy 只需要監(jiān)控包含同一區(qū)域內(nèi)端點(diǎn)的 EndpointSlice,這將提供另一個(gè)非常顯著的可伸縮性改進(jìn)。
這對(duì) Endpoint API 意味著什么?
盡管 EndpointSlice API 為 Endpoint API 提供了更強(qiáng)伸縮性的替代方案,但是 Endpoint API 目前還被認(rèn)為是普遍可用且穩(wěn)定的選擇。Endpoint API 最重要的更改計(jì)劃需要包括 truncate Endpoint,否則肯定會(huì)遇到可伸縮性問題。
K8S 進(jìn)階訓(xùn)練營(yíng)
點(diǎn)擊屏末 | 閱讀原文 | 即刻學(xué)習(xí)

掃描二維碼獲取
更多云原生知識(shí)
k8s 技術(shù)圈

