Kubernetes Ingress 最佳實踐教學

Kubernetes Ingress 是一種管理集群外部訪問服務的資源,它為集群內服務提供了反向代理、負載平衡和 TLS 終止等功能。在生產環境中使用 Ingress 時,有一些最佳實踐需要遵循,以確保安全性、可靠性和可維護性。

1. 使用 Ingress Controller

Ingress 本身只定義了路由規則,需要 Ingress Controller 來實現實際的流量管理。推薦使用像 Nginx Ingress Controller、Contour 或 Istio 這樣穩定且廣受支持的 Ingress Controller。

2. 配置 TLS/SSL 終止

為了保護客戶端與服務之間的通信安全,應該在 Ingress 上配置 TLS/SSL 終止。你可以從可信賴的證書頒發機構獲取證書,或使用 Let’s Encrypt 自動獲取免費的證書。

以下是一個使用 TLS 的 Ingress 範例:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
  tls:
  - hosts:
    - example.com
    secretName: example-tls
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: example-service
            port:
              number: 80

在這個例子中,我們配置了 TLS 並使用了 example-tls Secret 來存儲證書和密鑰。同時,我們還設置了強制重定向到 HTTPS。

3. 使用路徑路由

通過路徑路由,你可以將不同路徑的流量導向不同的服務,從而在同一個 IP 地址和端口上暴露多個服務。

apiVersion: networking.k8s.io/v1
kind: Ingress  
metadata:
  name: example-ingress
spec:
  rules:
  - http:
      paths:
      - path: /api
        pathType: Prefix
        backend:
          service:
            name: api-service
            port: 
              number: 80
      - path: /web
        pathType: Prefix
        backend:
          service:
            name: web-service
            port:
              number: 80

在這個例子中,/api 路徑將被路由到 api-service,而 /web 路徑將被路由到 web-service

4. 使用主機路由

如果你有多個域名或子域名,可以使用主機路由根據請求的主機頭將流量路由到不同的服務。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
spec:
  rules:
  - host: api.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: api-service
            port:
              number: 80
  - host: web.example.com  
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: web-service
            port:
              number: 80

在這個例子中,對 api.example.com 的請求將被路由到 api-service,而對 web.example.com 的請求將被路由到 web-service

5. 使用 Ingress Annotations

Ingress Controller 通常支持通過 Annotations 來配置更多的功能,如負載均衡、身份驗證、率限制等。不同的 Ingress Controller 支持不同的 Annotations,請參考對應控制器的文檔。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/auth-type: basic
    nginx.ingress.kubernetes.io/auth-secret: basic-auth
    nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required'
spec:
  # ...

在這個例子中,我們使用了 Nginx Ingress Controller 的 Annotations 來配置基本身份驗證。

6. 監控和記錄 Ingress 事件

為了更好地檢測和排查問題,應該對 Ingress Controller 及其相關資源進行監控和記錄。可以配置中央化日誌收集,並監視關鍵指標,如請求率、延遲、錯誤率等。

7. 其他最佳實踐

  • 使用 Ingress Classes 區分控制器:如果你有多個 Ingress Controller,可以通過 Ingress Classes 指定哪個控制器應該處理特定的 Ingress 資源。
  • 配置健康檢查:為 Ingress Controller 配置主動健康檢查,確保僅將流量路由到健康的後端服務。
  • 使用默認後端:配置默認後端服務來處理不匹配任何 Ingress 規則的請求。
  • 利用命名空間隔離:如果你有多個團隊或環境,可以使用命名空間來隔離 Ingress 資源和服務。
  • 自動化 Ingress 配置:instead of manually configuring Ingress resources, consider using tools like Kubernetes Ingress-NGINX or Istio to automatically generate Ingress resources based on service annotations or configuration files.
  • 保護 Ingress Controller:確保 Ingress Controller 本身的安全,通過最小特權原則運行、配置網絡策略、啟用身份驗證和授權等措施。

通過遵循這些最佳實踐,你可以有效地管理集群外部對服務的訪問,提高安全性,並對 Ingress 資源保持更好的可觀察性和控制力。