基於 k8s/k3s 的 endpoints 概念&應用梳理


前情提要

k8s/k3s 訪問集群外獨立的服務最好的方式是采用Endpoint方式,Endpoint 是什么呢?
Endpoint是可被訪問的服務端點,即一個狀態為running的pod,它是service訪問的落點,只有service關聯的pod才可能成為endpoint。
Endpoint、service和pod的
業務邏輯架構如下圖:

關系架構關系如下圖:

endpoints 概念詳解

1 Endpoints

Endpoints表示一個Service對應的所有Pod副本的訪問地址。

Node上的Kube-proxy進程獲取每個Service的Endpoints,實現Service的負載均衡功能。

2 Endpoints Controller

Endpoints Controller就是負責生成和維護所有Endpoints對象的控制器,它負責監聽Service和對應的Pod副本的變化。

如果檢測到Service被刪除,則刪除和該Service同名的Endpoints對象。

如果檢測到新的Service被創建或者修改則根據該Service信息獲得相關的Pod列表,然后創建或者更新Service對應的Endpoints對象。

3 檢查系統的 Endpoints

kubectl get endpoints

4 訪問集群外部的服務

對於一個集群內部的 pod 來說,如果他想訪問一個集群外部的服務該怎么辦呢?例如一個網站的公共 api,或者是一個雲數據庫。我們就沒辦法使用svc+標簽選擇器的方式來獲取這些服務了,因為標簽選擇器只能監測集群內部的 pod 。而無法放眼外部。那么我們應該怎么做呢?
當然可以通過自定義一個endpoint資源,用它指定外部服務的 ip 及端口,然后綁定到一個svc上,這樣內部的 pod 不就通過完全一樣的方式訪問外部服務了么?

你可以把這張圖拿去和"service 對 pod 的動態綁定"小節中的圖做對比,你會發現最根本的service > endpoint > 服務提供者的傳遞流程是沒有變的。ok,現在我們來動手操作一下,首先新建一個webhook 的 svc,僅有一個端口9443可以提供訪問:

svc.yaml 如下:

apiVersion: v1
kind: Service
metadata:
  name: webhook-service
  namespace: system
spec:
  ports:
    - port: 443
      targetPort: 9443
  selector:
    control-plane: controller-manager

endpoint.yaml 如下:

---
apiVersion: v1
kind: Endpoints
metadata:
  name: webhook-service
  namespace: system
subsets:
  - addresses:
      - ip: <k8s-master-ip>
    ports:
      - port: 9443

查看部署情況:

# 查詢獲取所有的 endpoint
kubectl get ep -A

拓展閱讀

ep 操作詳解: https://www.jianshu.com/p/9fae09876eb7

Windows 安裝 ssh服務: https://blog.csdn.net/boonya/article/details/102811966
ssh 啟動配置: https://blog.csdn.net/shimadear/article/details/93773054


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM