前情提要
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