你好,我是张磊。今天我和你分享的主题是:谈谈Service与Ingress。
在上一篇文章中,我为你详细讲解了将Service暴露给外界的三种方法。其中有一个叫作LoadBalancer类型的Service,它会为你在Cloud Provider(比如:Google Cloud或者OpenStack)里创建一个与该Service对应的负载均衡服务。
但是,相信你也应该能感受到,由于每个 Service 都要有一个负载均衡服务,所以这个做法实际上既浪费成本又高。作为用户,我其实更希望看到Kubernetes为我内置一个全局的负载均衡器。然后,通过我访问的URL,把请求转发给不同的后端Service。
这种全局的、为了代理不同后端Service而设置的负载均衡服务,就是Kubernetes里的Ingress服务。
所以,Ingress的功能其实很容易理解:所谓Ingress,就是Service的“Service”。
举个例子,假如我现在有这样一个站点:https://cafe.example.com
。其中,https://cafe.example.com/coffee
,对应的是“咖啡点餐系统”。而,https://cafe.example.com/tea
,对应的则是“茶水点餐系统”。这两个系统,分别由名叫coffee和tea这样两个Deployment来提供服务。
那么现在,[strong_begin]我如何能使用Kubernetes的Ingress来创建一个统一的负载均衡器,从而实现当用户访问不同的域名时,能够访问到不同的Deployment呢?[strong_end]
上述功能,在Kubernetes里就需要通过Ingress对象来描述,如下所示:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: cafe-ingress
spec:
tls:
- hosts:
- cafe.example.com
secretName: cafe-secret
rules:
- host: cafe.example.com
http:
paths:
- path: /tea
backend:
serviceName: tea-svc
servicePort: 80
- path: /coffee
backend:
serviceName: coffee-svc
servicePort: 80
在上面这个名叫cafe-ingress.yaml文件中,最值得我们关注的,是rules字段。在Kubernetes里,这个字段叫作:IngressRule。
IngressRule的Key,就叫做:host。它必须是一个标准的域名格式(Fully Qualified Domain Name)的字符串,而不能是IP地址。
备注:Fully Qualified Domain Name的具体格式,可以参考RFC 3986标准。
而host字段定义的值,就是这个Ingress的入口。这也就意味着,当用户访问cafe.example.com的时候,实际上访问到的是这个Ingress对象。这样,Kubernetes就能使用IngressRule来对你的请求进行下一步转发。
而接下来IngressRule规则的定义,则依赖于path字段。你可以简单地理解为,这里的每一个path都对应一个后端Service。所以在我们的例子里,我定义了两个path,它们分别对应coffee和tea这两个Deployment的Service(即:coffee-svc和tea-svc)。
通过上面的讲解,不难看到,所谓Ingress对象,其实就是Kubernetes项目对“反向代理”的一种抽象。
一个Ingress对象的主要内容,实际上就是一个“反向代理”服务(比如:Nginx)的配置文件的描述。而这个代理服务对应的转发规则,就是IngressRule。
这就是为什么在每条IngressRule里,需要有一