Ingress使用示例
当需要「一个IP,多个网站」时(基于域名路由)
场景目标
一个IP:
192.168.100.100
(Ingress Controller的External-IP)三个域名:
app1.com
-> 转发到app1-service
app2.com
-> 转发到app2-service
api.app1.com
-> 转发到api-service
步骤一:部署后端应用和Service
1.部署三个简单的Web应用(例如Nginx)并为它们创建对应的Service。
apiVersion: apps/v1
kind: Deployment
metadata:name: app1-deployment
spec:replicas: 2selector:matchLabels:app: app1template:metadata:labels:app: app1 # Pod标签,会被Service的selector匹配spec:containers:- name: nginximage: nginxports:- containerPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:name: app2-deployment
spec:replicas: 2selector:matchLabels:app: app2template:metadata:labels:app: app2spec:containers:- name: nginximage: nginxports:- containerPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:name: api-deployment
spec:replicas: 2selector:matchLabels:app: apitemplate:metadata:labels:app: apispec:containers:- name: nginximage: nginxports:- containerPort: 80
2. 创建Service (services.yaml
)
apiVersion: v1
kind: Service
metadata:name: app1-service # Service名称,Ingress规则会引用这个名字
spec:selector:app: app1 # 选择标签为 app: app1 的Podports:- protocol: TCPport: 80 # Service端口targetPort: 80 # Pod端口type: ClusterIP
---
apiVersion: v1
kind: Service
metadata:name: app2-service
spec:selector:app: app2ports:- protocol: TCPport: 80targetPort: 80type: ClusterIP
---
apiVersion: v1
kind: Service
metadata:name: api-service
spec:selector:app: apiports:- protocol: TCPport: 80targetPort: 80type: ClusterIP
步骤二:编写Ingress规则
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: my-main-ingressannotations:# 明确指定使用nginx ingress controllerkubernetes.io/ingress.class: "nginx"# 其他常用注解示例:# nginx.ingress.kubernetes.io/rewrite-target: / # 如果需要重写路径# nginx.ingress.kubernetes.io/ssl-redirect: "false" # 关闭强制HTTPS跳转(默认true)
spec:# rules字段定义了所有的路由规则rules:# 规则一:匹配主机名 app1.com- host: app1.comhttp:paths:- path: / # 匹配根路径及其所有子路径pathType: Prefixbackend:service:name: app1-service # 转发到名为app1-service的Serviceport:number: 80 # 转发到该Service的80端口# 规则二:匹配主机名 app2.com- host: app2.comhttp:paths:- path: /pathType: Prefixbackend:service:name: app2-serviceport:number: 80# 规则三:匹配主机名 api.app1.com- host: api.app1.comhttp:paths:- path: /pathType: Prefixbackend:service:name: api-serviceport:number: 80# 您可以继续添加更多规则...# - host: another.example.com# http:# paths:# - path: /# pathType: Prefix# backend:# service:# name: another-service# port:# number: 80
步骤三:测试访问
总结
通过以上配置,我们成功地实现了:
一个入口点:
192.168.100.100
基于域名的路由:
访问
app1.com
->app1-service
访问
app2.com
->app2-service
访问
api.app1.com
->api-service
所有的流量都通过同一个负载均衡器IP进入,然后由Ingress Controller根据HTTP请求头中的 Host
字段智能地转发到不同的后端Service,实现了高效且成本低廉的流量管理。