什么是Kubernetes Ingress?
Ingress是K8s中的一個API對象,用于管理和配置外部對集群內(nèi)服務(wù)的訪問。它允許我們定義HTTP和HTTPS路由規(guī)則,將請求從集群外部的負載均衡器引導(dǎo)到相應(yīng)的服務(wù)。Ingress的靈活性使得我們能夠?qū)崿F(xiàn)高級的應(yīng)用程序路由、SSL終端和負載均衡等功能。
通過Ingress,我們可以將集群內(nèi)的多個服務(wù)暴露到外部,并根據(jù)需要進行定制化的路由設(shè)置。這為應(yīng)用的擴展和靈活部署提供了便利。
Ingress的基本結(jié)構(gòu)
Ingress由以下幾個主要組件構(gòu)成:
規(guī)則(Rules): 每個Ingress對象可以包含多個規(guī)則,每個規(guī)則定義了一組路徑匹配規(guī)則和與之關(guān)聯(lián)的后端服務(wù)。
后端服務(wù)(Backend Services): 規(guī)則中指定的后端服務(wù)是Ingress路由請求到達時的目標(biāo)服務(wù)。這可以是集群中的Service、Pod或外部服務(wù)。
路徑(Paths): 路徑定義了應(yīng)該如何將請求路由到后端服務(wù)??梢允褂猛ㄅ浞驼齽t表達式進行路徑匹配。
TLS(Transport Layer Security): Ingress還支持TLS,用于啟用HTTPS。TLS配置包括證書和密鑰,確保數(shù)據(jù)在傳輸過程中的安全性。
下面是一個簡單的Ingress對象的例子:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- host: mydomain.com
http:
paths:
- path: /app
pathType: Prefix
backend:
service:
name: my-app-service
port:
number: 80
tls:
- hosts:
- mydomain.com
secretName: my-tls-secret
在這個例子中,我們定義了一個Ingress對象,它將mydomain.com/app的請求路由到名為my-app-service的Service,并啟用了HTTPS。
Ingress的使用示例
為了更好地理解Ingress的使用,讓我們通過一個具體的示例來演示。
假設(shè)我們有一個Web應(yīng)用,包括前端(frontend)和后端(backend)服務(wù)。現(xiàn)在,我們希望通過Ingress將這兩個服務(wù)暴露到外部,并在路徑上進行定制化的路由。
首先,我們創(chuàng)建前端和后端的Deployment和Service:
apiVersion: apps/v1
kind: Deployment
metadata:
name: frontend
spec:
replicas: 3
selector:
matchLabels:
app: frontend
template:
metadata:
labels:
app: frontend
spec:
containers:
- name: web-server
image: my-frontend-image:latest
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: frontend-service
spec:
selector:
app: frontend
ports:
- protocol: TCP
port: 80
targetPort: 80
yamlapiVersion: apps/v1
kind: Deployment
metadata:
name: backend
spec:
replicas: 3
selector:
matchLabels:
app: backend
template:
metadata:
labels:
app: backend
spec:
containers:
- name: api-server
image: my-backend-image:latest
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: backend-service
spec:
selector:
app: backend
ports:
- protocol: TCP
port: 8080
targetPort: 8080
接下來,我們定義Ingress對象:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- host: mydomain.com
http:
paths:
- path: /frontend
pathType: Prefix
backend:
service:
name: frontend-service
port:
number: 80
- path: /backend
pathType: Prefix
backend:
service:
name: backend-service
port:
number: 8080
tls:
- hosts:
- mydomain.com
secretName: my-tls-secret
在這個示例中,我們定義了一個Ingress對象,它將mydomain.com/frontend的請求路由到前端服務(wù),將mydomain.com/backend的請求路由到后端服務(wù)。此外,我們還啟用了HTTPS,并指定了TLS證書的Secret。
動態(tài)更新Ingress規(guī)則
Ingress的一個強大之處在于它支持動態(tài)更新。當(dāng)我們需要調(diào)整路由規(guī)則時,可以直接修改Ingress對象,而不需要重啟應(yīng)用或重新創(chuàng)建服務(wù)。
讓我們通過一個動態(tài)更新的例子來演示:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- host: mydomain.com
http:
paths:
- path: /frontend
pathType: Prefix
backend:
service:
name: frontend-service
port:
number: 80
tls:
- hosts:
- mydomain.com
secretName: my-tls-secret
在這個例子中,我們僅保留了前端服務(wù)的路由規(guī)則。然后,通過應(yīng)用這個更新后的Ingress對象,K8s將自動更新負載均衡器的配置,使得只有mydomain.com/frontend的請求能夠到達前端服務(wù)。
Ingress作為連接集群內(nèi)服務(wù)和外部請求的橋梁,提供了靈活的路由和負載均衡功能。了解Ingress的基本結(jié)構(gòu)、使用示例以及動態(tài)更新的能力,有助于開發(fā)者更好地利用K8s進行應(yīng)用程序的外部暴露和訪問控制。