[Kubernetes / K8s]Ingress 和 Ingress Controller 差別
Ingress是什麼?
Ingress是一個Kubernetes平台上的API,它用於定義應用程序如何公開服務
通過Ingress,Kubernetes使用不同的標準HTTP和HTTPS規則來將流量路由到不同的服務。
Ingress Controller是什麼?
Ingress Controller是一個Kubernetes應用程序,負責監聽Kubernetes集群中的Ingress API對象,並管理相關的網絡路由器(例如Nginx,Traefik等)。Ingress Controller根據Ingress規則將流量路由到不同的應用程序服務。
Ingress 定義了應用程式的路由規則
而Ingress Controller是實現Ingress規則並將流量路由到不同應用程序的應用程序。
Ingress實例示範
1.建立多個服務
首先我們先創建多個 Kubernetes 服務,每個服務用於運行一個微服務。例如,以下是兩個服務 YAML 文件的示例:
apiVersion: v1
kind: Service
metadata:
name: service-a
spec:
selector:
app: service-a
ports:
- name: http
port: 80
targetPort: http
---
apiVersion: v1
kind: Service
metadata:
name: service-b
spec:
selector:
app: service-b
ports:
- name: http
port: 80
targetPort: http
上面描述的 YAML 文件分別定義了名為 service-a 和 service-b 的 Kubernetes 服務,每個服務都運行一個微服務。
2.創建第一個Ingress 資源
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: microservices-ingress
spec:
rules:
- host: example.com
http:
paths:
- path: /service-a
pathType: Prefix
backend:
service:
name: service-a
port:
name: http
- path: /service-b
pathType: Prefix //#path 前綴是/service-b時就會進入規則內
backend:
service:
name: service-b. #對應k8s內部服務名稱 service叫service-b,使用80 PORT
port:
name: http
上面描述的 YAML 文件定義了一個名為 microservices-ingress 的 Ingress 資源,將 example.com/service-a 的請求路徑命名為 service-a 的 Kubernetes Service,將 example.com/service-b 的請求路徑命名為service-b 的 Kubernetes 服務。
這個Ingress規則使用了多個路徑條目,用於確定義不同的URL路徑。pathType設置為Prefix,表示將請求路徑由到以/service-a或/service-b打頭的所有路徑方向。
如果pathType設置為Exact,需要完全一致才行,包含大小寫也要一致,只可以請求請求路徑由到 /service-a 或 /service-b 路徑
3.安裝一個Ingress Controller 實現
最後需要安裝一個Ingress Controller 實際,用於實際上面描述 Ingress 規則。例如,下面是使用 Nginx Ingress Controller 的 YAML 文件
apiVersion: v1
kind: Service
metadata:
name: nginx-ingress-controller
spec:
selector:
app: nginx-ingress-controller
type: LoadBalancer
ports:
- name: http
port: 80
targetPort: http
- name: https
port: 443
targetPort: https
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-ingress-controller
spec:
selector:
matchLabels:
app: nginx-ingress-controller
replicas: 1
template:
metadata:
labels:
app: nginx-ingress-controller
spec:
containers:
- name: nginx-ingress-controller
image: nginx/nginx-ingress:latest
ports:
- name: http
Nginx Ingress Controller 會自動監聽 Kubernetes 集合中的 Ingress 資源,並根據其中規定的規則來由請求。它會檢測和自動更新 Ingress 資源的變化,並根據規則將流量轉發到後端服務。
一旦更新或刪除 Ingress 資源,Nginx Ingress Controller 會自動響應並相應地更新或刪除相關的路由規則。
提問
為什麼Nginx Ingress Controller service type 是LoadBalancer
Nginx Ingress Controller Service 的類型為 LoadBalancer 是因為它需要公開一個外部 IP 地址或 DNS 名稱,以方便外部流量可以到達 Ingress Controller從而通過 Ingress 規則將請求請求路由到後端服務.
recall service #當在 Kubernetes 群中創建一個 Service 資源時,選擇是 LoadBalancer 類型,它會為服務創建一個外部負載均衡器,並分配一個公共IP地址或者 DNS 名稱。