在 Kubernetes Cluster 中,管理應用服務的外部存取是一個重要且常見的需求。Ingress 是一種專門用來處理這類需求的 Kubernetes 資源,能夠靈活地設定基於 HTTP 和 HTTPS 的路由規則,並提供負載平衡、SSL 支援等多樣化功能。本文將深入探討 Ingress 的運作原理、設定步驟,以及如何利用它來提升 Kubernetes Cluster 的流量管理能力。
Ingress 是一個 Kubernetes API 對象,用於定義外部如何存取 Kubernetes Cluster 內的服務。它允許 Cluster 管理者設定統一的入口點,並根據 URL 路徑或域名來設定流量轉發規則,這讓多個應用服務可以共用同一個 IP 地址而進行靈活管理。
Ingress 本身只是描述流量應該如何路由的規則,但實際處理流量的任務是由 Ingress Controller 來完成。Ingress Controller 是運行在 Kubernetes Cluster 中的應用,它負責監控 Ingress 資源的變化,並根據設定自動調整負載平衡器的行為。常見的 Ingress Controller 包括 NGINX、Traefik 和 HAProxy 等。
讓我們透過官方提供的一個簡單的圖示來了解 Ingress 的工作流程:
透過這些步驟,Ingress 在提供統一入口的同時,實現了靈活且可擴展的流量管理。
Ingress 不僅僅是簡單的路由工具,它還具備以下關鍵功能:
要在 Kubernetes 中使用 Ingress,主要分為以下幾個步驟:
首先,需要部署 Ingress Controller。這裡以 NGINX Ingress Controller 為例:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml
這段指令將在你的 Kubernetes Cluster中部署 NGINX Ingress Controller,為後續的 Ingress 設定提供基礎。
以下是一個基本的 Ingress 設定範例,展示了如何將不同路徑的流量轉發至相應的服務:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
spec:
rules:
- host: example.com
http:
paths:
- path: /foo
pathType: Prefix
backend:
service:
name: foo-service
port:
number: 80
- path: /bar
pathType: Prefix
backend:
service:
name: bar-service
port:
number: 80
在這個範例中,/foo
路徑的請求將被轉發到 foo-service
,而 /bar
路徑的請求則會被轉發到 bar-service
。
如果你需要處理 HTTPS 加密,則可以在 Ingress 中設定 TLS/SSL。以下是具體範例:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: tls-example-ingress
spec:
tls:
- hosts:
- example.com
secretName: tls-secret
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: foo-service
port:
number: 80
這裡的 tls-secret
包含了 SSL 憑證,Ingress Controller 將使用該憑證來支援 HTTPS 連接。
kubectl get ingress
kubectl describe ingress <ingress-name>
kubectl delete ingress <ingress-name>
在 Kubernetes Ingress 中,DefaultBackend
是一個重要但常被忽略的概念,它主要用來處理未匹配到任何路由規則的流量。當請求不符合 Ingress 中設定的規則時,這些請求將會被導向到 DefaultBackend
,以避免產生 404 錯誤。
DefaultBackend
是一個後備機制,用來處理所有沒有被明確定義的路徑或主機名。這對於在正式環境中保證系統的強健性(Robustness)至關重要,尤其當你希望所有未匹配的請求都能得到適當處理,而不是直接返回錯誤訊息。
可以在 Ingress 資源中指定 defaultBackend
,如下範例所示:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
spec:
defaultBackend:
service:
name: default-backend-service
port:
number: 80
rules:
- host: example.com
http:
paths:
- path: /foo
pathType: Prefix
backend:
service:
name: foo-service
port:
number: 80
- path: /bar
pathType: Prefix
backend:
service:
name: bar-service
port:
number: 80
在這個範例中,當請求不匹配 /foo
或 /bar
路徑時,流量將被導向 default-backend-service
。
通常,DefaultBackend
是一個簡單的 Kubernetes Service 和對應的 Deployment,它只需處理基礎的 HTTP 請求,如返回自訂的訊息或頁面。以下是一個常見的 DefaultBackend 設定:
apiVersion: apps/v1
kind: Deployment
metadata:
name: default-backend
spec:
replicas: 1
selector:
matchLabels:
app: default-backend
template:
metadata:
labels:
app: default-backend
spec:
containers:
- name: default-backend
image: gcr.io/google_containers/defaultbackend:1.5
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: default-backend-service
spec:
ports:
- port: 80
targetPort: 8080
selector:
app: default-backend
這個設定使用了一個輕量級的容器來提供基本的 404 頁面。
Ingress 是 Kubernetes 中不可或缺的組件,透過靈活的路由規則和負載平衡策略,它能夠高效地管理 Cluster 內部應用的外部存取。選擇合適的 Ingress Controller 並進行正確設定,是運營 Kubernetes Cluster 時的重要課題。在未來的課程中,我們將進一步探討 Kubernetes 中的命名空間和資源隔離技術,幫助你更好地組織和管理 Cluster 內部資源。