什么是Ingress
Kubernetes中,Ingress(入口)是一个对象,作用是让外部可以访问集群内部的服务。Ingress通过创建访问规则,定义了哪些进入的请求可以访问哪些服务。
这让我们可以很方便地定义服务的路由规则。例如,要把对example.com/api/v1/
的访问导向到api-v1
服务,对example.com/api/v2/
的服务导向到api-v2
服务,就可使用Ingress轻松进行设置,而无需创建一堆LoadBalancers或在节点上暴露每个服务。
Ingress 与 LoadBalancer、NodePort 比较
Ingress, LoadBalancer, NodePort做的都是同一件事情,对外暴露服务,让外部可以访问。
NodePort
在服务的YAML文件中,可以将服务类型设置为NodePort,为对外暴露服务,Kubernetes将在每个工作节点上,为服务分配一个特定端口,可以通过节点IP与该端口访问服务。
NodePort的优点是简单,缺点是功能不够强大,你不知道服务将被分配到哪个端口,端口也可能会变化,在某个时候被重新分配。
LoadBalancer
与NodePort类似,在服务的YAML文件中,服务类型也可以设置为LoadBalancer类型。LoadBalancer类型需要集群外部有负载均衡模块,通常由云供应商(如阿里云)提供。
每次想要向外界暴露一个服务时,你都必须创建一个新的LoadBalancer并获得一个IP地址。
Ingress
NodePort和LoadBalancer都是服务类型,在服务的yaml文件中设置。与此不同,Ingress是一个完全独立的服务资源对象,你可以创建和销毁它。
使用Ingress可以统一管理路由规则,并且与集群内的服务解耦。
Ingress yaml
下面是Ingress yaml 示例。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test-ingress
namespace: dev
spec:
rules:
- host: test.apps.example.com
http:
paths:
- backend:
serviceName: hello-service
servicePort: 80
上面声明的规则中,所有对test.apps.example.com
的调用都被导到dev
命名空间中的hello-service
服务。
理解ingress对象的关键点:
- 服务对与ingress对象应该属于同一个命名空间
- ingress对象定义导流规则,真正导流的是ingress控制器