k8s給多個外部靜態IP作負載均衡、反向代理

sunsky303發表於2024-08-27

在 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

在這個示例中:

  1. nginx.ingress.kubernetes.io/rewrite-target: /$1 註解告訴 Ingress 控制器將匹配到的 URL 路徑中的捕獲組 $1 重寫到後端服務的實際路徑。
  2. path: /xxx/(.*) 定義了一個字首匹配路徑 /xxx/,並使用一個捕獲組 (.*) 來捕獲後面的任意路徑。
  3. 當使用者訪問 /xxx/anything 時,Ingress 控制器會將請求重寫為 /anything,並轉發到後端的服務。

透過這種方式,您可以靈活地將傳入的 URL 路徑對映到後端服務的正確路徑,而無需在後端服務中硬編碼這些路徑。這對於遷移或重構現有應用程式非常有用。

除了 rewrite-target 註解,Ingress 還支援其他一些路徑重寫相關的註解,如 nginx.ingress.kubernetes.io/app-rootnginx.ingress.kubernetes.io/use-regex 等,您可以根據需求進行配置。

效果如下 :

k8s給多個外部靜態IP作負載均衡、反向代理

相關文章