在 Kubernetes (K8s) 中,Ingress、Endpoints 和 Service 是三個重要的概念,它們協作實現了叢集內部和外部應用程式的訪問和服務發現。
Ingress:
- Ingress 用於提供叢集外部到叢集內部服務的 HTTP/HTTPS 路由。
- Ingress 定義了訪問叢集內部服務的規則,如路徑對映、虛擬主機等。
- Ingress 通常需要搭配 Ingress Controller 來實現實際的流量轉發和負載均衡。
- Ingress 位於應用程式的前端,處理七層(HTTP/HTTPS)流量。
Endpoints:
- Endpoints 用於記錄提供某個 Service 的 Pod 的 IP 地址和埠資訊。
- Endpoints 由 Kubernetes 根據 Pod 的變化自動建立和管理,生命週期與 Pod 相關。
- Endpoints 位於應用程式的後端,主要用於服務發現,記錄提供服務的 Pod 資訊。
- Endpoints 透過 Pod 的 IP 地址和容器埠直接提供訪問。
Service:
- Service 用於對外暴露應用程式的訪問入口,提供四層(TCP/UDP)的負載均衡功能。
- Service 由使用者透過 YAML 檔案進行配置,生命週期獨立於 Pod。
- Service 位於應用程式的前端,處理四層(TCP/UDP)流量。
- Service 透過 ClusterIP、NodePort 或 LoadBalancer 方式提供訪問。
Ingress、Endpoints 和 Service 的關係:
- Ingress 定義了從叢集外部到叢集內部服務的 HTTP/HTTPS 路由規則。
- Service 根據 Endpoints 資訊提供四層負載均衡,Endpoints 記錄了提供服務的 Pod或 IP資訊。
- Ingress 將流量轉發到對應的 Service,Service 再根據 Endpoints 資訊進行負載均衡和流量分發。
總的來說,Ingress、Endpoints 和 Service 在 K8s 中協作完成了應用程式的訪問和服務發現。Ingress 負責處理叢集外部到叢集內部的 HTTP/HTTPS 流量路由,Service 提供了應用程式的訪問入口和四層負載均衡功能,Endpoints 則記錄了提供服務的 Pod或 IP資訊。它們共同實現了 K8s 中應用程式的訪問和部署。
以下是給多個外部靜態IP作負載均衡、反向代理,先建立 Service+Endpoints:
apiVersion: v1
kind: Service
metadata:
name: zl-lb
namespace: wetwin
spec:
#type: ExternalName # 可用於單IP
#externalName: "10.254.18.46"
type: ClusterIP
ports:
- port: 80
protocol: TCP
targetPort: 80
---
apiVersion: v1
kind: Endpoints
metadata:
name: zl-lb
namespace: wetwin
subsets:
- addresses: #單機IP時不需要
- ip: 10.254.18.46
- ip: 10.254.18.47
ports:
- port: 80
protocol: TCP
再建立 Ingress:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/proxy-body-size: 500M
nginx.ingress.kubernetes.io/rewrite-target: /$1
nginx.ingress.kubernetes.io/server-snippet: | #防爬
if ($http_user_agent ~* (Scrapy|Go-http-client|HttpClient|curl)) {
return 403;
}
name: xxx.your-domain.com
namespace: wetwin #自定義
spec:
ingressClassName: nginx
rules:
- host: xxx.your-domain.com #自定義
http:
paths:
- backend:
service:
name: zl-lb
port:
number: 80
path: /lb/(zl/.*) #自定義
pathType: Prefix
tls: #可選
- hosts:
- xxx.your-domain.com
secretName: xxx.com
status:
loadBalancer:
ingress:
- ip: 10.254.18.55 #出口IP
在這個示例中:
nginx.ingress.kubernetes.io/rewrite-target: /$1
註解告訴 Ingress 控制器將匹配到的 URL 路徑中的捕獲組$1
重寫到後端服務的實際路徑。path: /xxx/(.*)
定義了一個字首匹配路徑/xxx/
,並使用一個捕獲組(.*)
來捕獲後面的任意路徑。- 當使用者訪問
/xxx/anything
時,Ingress 控制器會將請求重寫為/anything
,並轉發到後端的服務。
透過這種方式,您可以靈活地將傳入的 URL 路徑對映到後端服務的正確路徑,而無需在後端服務中硬編碼這些路徑。這對於遷移或重構現有應用程式非常有用。
除了 rewrite-target
註解,Ingress 還支援其他一些路徑重寫相關的註解,如 nginx.ingress.kubernetes.io/app-root
、nginx.ingress.kubernetes.io/use-regex
等,您可以根據需求進行配置。
效果如下 :