Ingress
介绍视频
为什么需要Ingress
Service是基于四层TCP和UDP协议转发的,而Ingress可以基于七层的HTTP和HTTPS协议转发,可以通过域名和路径做到更细粒度的划分,如下图所示。
Ingress工作机制
要想使用Ingress功能,必须在Kubernetes集群上安装Ingress Controller。Ingress Controller有很多种实现,最常见的就是Kubernetes官方维护的ingress-nginx;不同厂商通常有自己的实现,例如CCE使用弹性负载均衡服务ELB实现Ingress的七层负载均衡。
外部请求首先到达Ingress Controller,Ingress Controller根据Ingress的路由规则,查找到对应的Service,进而通过Endpoint查询到Pod的IP地址,然后将请求转发给Pod。
创建Ingress
下面例子中,使用http协议,关联的后端Service为“nginx:8080”,使用ELB作为Ingress控制器(metadata.annotations字段都是指定使用哪个ELB实例),当访问“http://192.168.10.155:8080/”时,流量转发“nginx:8080”对应的Service,从而将流量转发到对应Pod。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: test-ingress
annotations:
kubernetes.io/elb.class: union
kubernetes.io/elb.port: '8080'
kubernetes.io/elb.id: aa7cf5ec-7218-4c43-98d4-c36c0744667a
spec:
rules:
- host: ''
http:
paths:
- path: /
backend:
service:
name: nginx
port:
number: 8080
property:
ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
pathType: ImplementationSpecific
ingressClassName: cce
Ingress中还可以设置外部域名,这样您就可以通过域名来访问到ELB,进而访问到后端服务。
...
spec:
rules:
- host: www.example.com # 域名
http:
paths:
- path: /
backend:
service:
name: nginx
port:
number: 8080
...
路由到多个服务
Ingress可以同时路由到多个服务,配置如下所示。
- 当访问“http://foo.bar.com/foo”时,访问的是“s1:80”后端。
- 当访问“http://foo.bar.com/bar”时,访问的是“s2:80”后端。
Ingress转发策略中的path路径要求后端应用内存在相同的路径,否则转发无法生效。
例如,Nginx应用默认的Web访问路径为“/usr/share/nginx/html”,在为Ingress转发策略添加“/test”路径时,需要应用的Web访问路径下也包含相同路径,即“/usr/share/nginx/html/test”,否则将返回404。
...
spec:
rules:
- host: foo.bar.com # host地址
http:
paths:
- path: "/foo"
backend:
service:
name: s1
port:
number: 80
- path: "/bar"
backend:
service:
name: s2
port:
number: 80
...
