Kubernetes Ingress 是一種用于管理外部訪問 Kubernetes 集群中服務的 API 對象。它充當了集群的入口點,允許你將外部流量路由到集群內部的服務。與傳統的 LoadBalancer 或 NodePort 服務不同,Ingress 提供了更高級的路由功能,如基于主機名或路徑的路由、TLS 終止等。
Ingress 資源是 Kubernetes 中的一種 API 對象,用于定義如何將外部流量路由到集群內部的服務。Ingress 資源通常包含以下信息:
Ingress Controller 是實際處理 Ingress 資源的組件。它負責監聽 Ingress 資源的變化,并根據配置的路由規則將流量轉發到相應的后端服務。常見的 Ingress Controller 包括:
Ingress Class 是 Kubernetes 1.18 引入的一個新概念,用于區分不同的 Ingress Controller。通過 Ingress Class,你可以在同一個集群中運行多個 Ingress Controller,并將不同的 Ingress 資源分配給不同的 Ingress Controller。
在開始使用 Ingress 之前,你需要先部署一個 Ingress Controller。以下以 NGINX Ingress Controller 為例,介紹如何部署 Ingress Controller。
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install ingress-nginx ingress-nginx/ingress-nginx
kubectl get pods -n default -l app.kubernetes.io/name=ingress-nginx
如果看到類似以下的輸出,說明 NGINX Ingress Controller 已經成功部署:
NAME READY STATUS RESTARTS AGE
ingress-nginx-controller-7c6d8f5b5c-9q8q9 1/1 Running 0 1m
如果你在集群中運行了多個 Ingress Controller,可以通過 Ingress Class 來區分它們。以下是一個簡單的 Ingress Class 配置示例:
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: nginx
spec:
controller: k8s.io/ingress-nginx
在 Ingress 資源中,你可以通過 ingressClassName
字段指定使用哪個 Ingress Class:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
spec:
ingressClassName: nginx
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: example-service
port:
number: 80
在部署了 Ingress Controller 之后,你可以通過創建 Ingress 資源來定義路由規則。以下是一個簡單的 Ingress 資源示例:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: example-service
port:
number: 80
nginx.ingress.kubernetes.io/rewrite-target
用于重寫請求路徑。將上述 YAML 文件保存為 example-ingress.yaml
,然后使用 kubectl
命令應用該資源:
kubectl apply -f example-ingress.yaml
你可以使用以下命令查看 Ingress 資源的狀態:
kubectl get ingress
如果看到類似以下的輸出,說明 Ingress 資源已經成功創建:
NAME CLASS HOSTS ADDRESS PORTS AGE
example-ingress nginx example.com 80 1m
Ingress 還支持配置 TLS 終止,以便處理 HTTPS 請求。以下是一個配置 TLS 的 Ingress 資源示例:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-tls-ingress
spec:
tls:
- hosts:
- example.com
secretName: example-tls-secret
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: example-service
port:
number: 80
在配置 TLS 之前,你需要創建一個包含 TLS 證書和密鑰的 Kubernetes Secret。以下是一個創建 TLS Secret 的示例:
kubectl create secret tls example-tls-secret --cert=path/to/tls.crt --key=path/to/tls.key
將上述 YAML 文件保存為 example-tls-ingress.yaml
,然后使用 kubectl
命令應用該資源:
kubectl apply -f example-tls-ingress.yaml
你可以使用以下命令查看 Ingress 資源的狀態:
kubectl get ingress
如果看到類似以下的輸出,說明 TLS 配置已經成功應用:
NAME CLASS HOSTS ADDRESS PORTS AGE
example-tls-ingress nginx example.com 80, 443 1m
Ingress 還支持更高級的路由配置,如基于路徑的重寫、請求頭修改等。以下是一些常見的配置示例。
路徑重寫允許你將請求路徑重寫為不同的路徑。以下是一個路徑重寫的示例:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-rewrite-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /new-path
spec:
rules:
- host: example.com
http:
paths:
- path: /old-path
pathType: Prefix
backend:
service:
name: example-service
port:
number: 80
在這個示例中,所有訪問 /old-path
的請求都會被重寫為 /new-path
。
你可以通過 Ingress 修改請求頭,以便在后端服務中使用。以下是一個請求頭修改的示例:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-header-ingress
annotations:
nginx.ingress.kubernetes.io/configuration-snippet: |
proxy_set_header X-Custom-Header "custom-value";
spec:
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: example-service
port:
number: 80
在這個示例中,所有請求都會添加一個 X-Custom-Header
請求頭,值為 custom-value
。
如果 Ingress 資源未生效,可能是以下原因:
如果 TLS 證書無效,可能是以下原因:
如果路徑重寫未生效,可能是以下原因:
nginx.ingress.kubernetes.io/rewrite-target
注解配置正確。Kubernetes Ingress 是一個強大的工具,可以幫助你管理外部訪問集群內部服務的流量。通過 Ingress,你可以實現基于主機名或路徑的路由、TLS 終止、負載均衡等功能。本文介紹了如何部署 Ingress Controller、創建 Ingress 資源、配置 TLS 終止以及一些高級路由配置。希望這些內容能幫助你快速入門 Kubernetes Ingress,并在實際項目中應用這些知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。