騷操作,K8s 叢集外的 Endpoint 也能動態變化

語言: CN / TW / HK

在實際使用場景中,兩個 K8s 叢集之間經常有互相訪問的需求,或者 K8s 叢集有訪問叢集外部某些服務的需求,常規的解決方案是手動維護固定的 Services 和 Endpoints,或者直接在業務配置中寫死 IP。但這些方案都沒有對外部服務的探活功能,無法實現高可用。如果引入外部高可用負載均衡,又會增加複雜度,且很多公司不具備引入外部負載均衡的條件,所以這個方案不是最優解。

眾所周知,kube-proxy 的主要功能是維護叢集內的 Services 和 Endpoints,並在對應主機上建立對應的 IPVS 規則,因此 Pod 之間可以通過 ClusterIP 相互訪問。

受 kube-proxy 啟發,新的想法誕生了: 編寫一個 Controller,維護一個 CRD 來自動建立需要訪問的外部服務所對應的 Service 和 Endpoint,並對建立的 Endpoint 中的外部服務資料(IP:Port 列表)進行探活,探活失敗則移除對應的外部服務資料。

於是 endpoints-operator [1] 專案隆重登場!

endpoints-operator 介紹

endpoints-operator 是一個雲原生、高可靠性、高效能、面向 K8s 內部服務訪問外部服務的具備探活功能的 4 層 LB。

特性

  • 更加貼近雲原生

  • 宣告式 API:探活的定義方式與 Kubelet 保持一致,還是熟悉的語法、熟悉的味道

  • 高可靠性:原生 Service、Endpoint 資源,拒絕重複造輪子

  • 高效能、高穩定:原生 IPVS 高效能 4 層負載均衡

核心優勢

  • 完全使用 K8s 原生的 Service、Endpoint 資源,無自定義 IPVS 策略,依託 K8s 的 Service 能力,高可靠。

  • 通過 controller 管理一個 CRD 資源 ClusterEndpoint(縮寫 cep)即可,無需手動管理 Service 和 Endpoint 兩個資源

  • 完全相容已有的自定義 Service、Endpoint 資源,可無縫切換至 endpoints-operator 管理。

  • 原生的 IPVS 4 層負載,未引入 Nginx、HAProxy 等 LB,降低了複雜度,滿足高效能和高穩定性的需求

使用場景

主要使用在叢集內部的 Pod 需要訪問外部服務的場景,比如資料庫、中介軟體等,通過 endpoints-operator 的探活能力,可及時將有問題的後端服務剔除,避免受單個宕機副本影響,並可檢視 status 獲取後端服務健康狀態和探活失敗的服務。

使用介紹

安裝

$ git clone https://github.com/sealyun/endpoints-operator.git
$ cd endpoints-operator
$ checkout v0.1.0
$ helm install -n kube-system endpoints-operator config/charts/endpoints-operator

建立一個健康的 ClusterEndpoint 資料

apiVersion: sealyun.com/v1beta1
kind: ClusterEndpoint
metadata:
name: wordpress
namespace: default
spec:
hosts:
- 172.18.191.215
periodSeconds: 10
ports:
- failureThreshold: 3
name: https
port: 38082
protocol: TCP
successThreshold: 1
targetPort: 80
tcpSocket:
enable: true
timeoutSeconds: 1
- httpGet:
path: /
scheme: http
name: http
port: 38081
protocol: TCP
targetPort: 80

經過 Controller 處理後發現

apiVersion: sealyun.com/v1beta1
kind: ClusterEndpoint
metadata:
creationTimestamp: "2022-01-18T13:44:08Z"
generation: 1
name: wordpress
namespace: default
resourceVersion: "610358"
uid: 41303de7-9706-487a-8204-79a3a358730f
spec:
hosts:
- 172.18.191.215
periodSeconds: 10
ports:
- failureThreshold: 3
name: https
port: 38082
protocol: TCP
successThreshold: 1
targetPort: 80
tcpSocket:
enable: true
timeoutSeconds: 1
- httpGet:
path: /
scheme: http
name: http
port: 38081
protocol: TCP
targetPort: 80
status:
conditions:
- lastHeartbeatTime: "2022-01-18T13:44:08Z"
lastTransitionTime: "2022-01-18T13:44:08Z"
message: cluster endpoints has been initialized
reason: Initialized
status: "True"
type: Initialized
- lastHeartbeatTime: "2022-01-18T13:44:08Z"
lastTransitionTime: "2022-01-18T13:44:08Z"
message: sync service successfully
reason: SyncServiceReady
status: "True"
type: SyncServiceReady
- lastHeartbeatTime: "2022-01-18T13:44:08Z"
lastTransitionTime: "2022-01-18T13:44:08Z"
message: sync endpoint successfully
reason: SyncEndpointReady
status: "True"
type: SyncEndpointReady
- lastHeartbeatTime: "2022-01-18T13:44:08Z"
lastTransitionTime: "2022-01-18T13:44:08Z"
message: ClusterEndpoint is available now
reason: Ready
status: "True"
type: Ready
phase: Healthy

驗證 Service 和 Endpoint 資料

$ kubectl get cep wordpress
NAME AGE STATUS
wordpress 108m Healthy

$ kubectl get svc wordpress
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
wordpress ClusterIP 10.104.2.110 <none> 38082/TCP,38081/TCP 108m

$ kubectl get ep wordpress
NAME ENDPOINTS AGE
wordpress 172.18.191.215:80,172.18.191.215:80 108m

ClusterEndpoint 資料 status 變更

將其中一個埠立即關掉則 cep 的狀態已經變為 UnHealthy

$ kubectl get cep wordpress
NAME AGE STATUS
wordpress 115m UnHealthy

$ kubectl get svc wordpress
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
wordpress ClusterIP 10.104.2.110 <none> 38083/TCP,38081/TCP 115m

$ kubectl get ep wordpress
NAME ENDPOINTS AGE
wordpress 172.18.191.215:80 115m

總結

endpoint-operator 從開發的角度更優雅地解決了叢集內訪問外部服務的問題,實現方式更加雲原生,對產品無任何侵入。後續將會支援更多的探活協議,比如 UDP/gRPC 等。還會支援監控以及 Webhook 校驗等功能。

有興趣歡迎到 GitHub 貢獻程式碼 : https://github.com/sealyun/endpoints-operator

引用連結

[1]

endpoints-operator: https://github.com/sealyun/endpoints-operator

你可能還喜歡

點選下方圖片即可閱讀

Kubernetes 叢集檔案描述符測漏了...

雲原生是一種信仰 

關注公眾號

後臺回覆◉k8s◉獲取史上最方便快捷的 Kubernetes 高可用部署工具,只需一條命令,連 ssh 都不需要!

點選  "閱讀原文"  獲取 更好的閱讀體驗!

發現朋友圈變“安靜”了嗎?