Ingress用于集群外部到集群内部Service的HTTP和HTTPS路由,可以配置提供服务外部访问的URL、负载均衡和终止SSL,并提供基于域名的虚拟主机。
1. 使用域名发布 K8s 的服务
创建一个 web 服务:
kubectl create deploy nginx-ingress --image=registry.cn-beijing.aliyuncs.com/jiangxiaonan/nginx:1.22.1
暴露服务:
kubectl expose deploy nginx-ingress --port 80
创建 Ingress:
apiVersion: networking.k8s.io/v1 # k8s >= 1.22 必须 v1
kind: Ingress
metadata:
name: nginx-ingress
spec:
ingressClassName: nginx
rules:
- host: nginx.test.com # 域名
http:
paths:
- backend:
service:
name: nginx-ingress
port:
number: 80
path: /
pathType: ImplementationSpecific
path:域名的location配置,同一个host可以配置多个path。比如一个路径格式为xxx.com/abc,可以配置path为/abc,每个路径都有一个对应的backend,对应到应用的Servcie和Port。
pathType: 路径的匹配方式,目前有 ImplementationSpecific、 Exact 和 Prefix 方式
Exact: 精确匹配,比如配置的 path 为/bar,那么/bar/将不能被路由;
Prefix: 前缀匹配,基于以 / 分隔的 URL 路径。比如 path 为/abc,可以匹配到/abc/bbb 等,比较常用的配置;
ImplementationSpecific:这种类型的路由匹配根据 Ingress Controller 来实现,可以当做一个单独的类型,也可以当做 Prefix 和 Exact。ImplementationSpecific是 1.18 版本引入 Prefix 和 Exact 的默认配置;
backend:描述Servcie和Port的组合,对Ingress匹配主机和路径的HTTP与HTTPS请求将被发送到对应的后端。
2. 单域名
apiVersion: networking.k8s.io/v1 # k8s >= 1.22 必须 v1
kind: Ingress
metadata:
name: nginx-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: foo.bar.com
http:
paths:
- backend:
serviceName: service1
servicePort: 4200
path: /foo
- backend:
serviceName: service2
servicePort: 8080
path: /bar
访问foo.bar.com/foo到service1的4200,访问foo.bar.com/bar到service2的8080。
3. 多域名
apiVersion: networking.k8s.io/v1 # k8s >= 1.22 必须 v1
kind: Ingress
metadata:
name: nginx-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: foo.bar.com
http:
paths:
- backend:
serviceName: service1
servicePort: 4200
- host: bar.foo.com
http:
paths:
- backend:
serviceName: service2
servicePort: 8080
此时,访问foo.bar.com到service1,访问bar.foo.com到service2。