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 資源保持更好的可觀察性和控制力。