1、Ingress
在Kubernetes中,服务和Pod的IP地址仅可以在集群网络内部使用,对于集群外的应用是不可见的。为了使外部的应用能够访问集群内的服务,在Kubernetes中可以通过NodePort和LoadBalancer这两种类型的服务,或者使用Ingress。Ingress本质是通过http代理服务器将外部的http请求转发到集群内部的后端服务。Kubernetes目前支持GCE和nginx控制器;另外,F5网络为Kubernetes提供了F5 Big-IP控制器。通过Ingress,外部应用访问群集内容服务的过程如下所示。
Ingress控制器通常会使用负载均衡器来负责实现Ingress,尽管它也可以通过配置边缘路由器或其它前端以HA方式处理流量。
2、Ingress配置文件
下面是Ingress YAML配置文件的示例:
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: test-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: rules: - http: paths: - path: /testpath backend: serviceName: test servicePort: 80
- 1-6行:Ingress YAML文件中的1-6行与其它的Kubernetes配置文件一样,需要apiVersion, kind和metadata字段。此示例定义了名称为test-ingress的Ingress。
- 7-9行:Ingress规格具有配置负载均衡器或代理服务器所需的所有信息。最重要的是,它包含与所有传入请求相匹配的规则列表。目前,Ingress资源仅支持http规则。
- 10-11行:每个http规则都包含以下信息:一个主机(例如:foo.ba.com,在这个例子中为*),一个路径列表(例如:/testpath),每个路径都有一个相关的后端(test:80)。在负载均衡器将业务引导到后端之前,主机和路径都必须匹配传入请求的内容。
- 12-14行:后端是服务:端口(test:80)的组合。Ingress流量通常被直接发送到与后端相匹配的端点。
3、Ingress类型
3.1 代理单一服务
Kubernetes可以使用LoadBalancer和NodePort类型的服务暴露服务,也可以通过一个Ingress来实现。下面是名称为test-ingress的Ingress YAML文件,它将对外代理名称为testsvc的服务。
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: single-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: rules: - host: foo.bar.com http: paths: - path: /foo backend: serviceName: s1 servicePort: 80
通过kubectl create -f创建上述的Ingress,在创建后可以通过kubectl get ing的命令获取Ingress的列表信息:
$ kubectl get ing
NAME RULE BACKEND ADDRESS
single-ingress –s1:80 107.178.254.228
3.2 代理多个服务
如前所述,在kubernetes 中Pod的IP地址只能对群集内的其它的应用可见。因此,如果需要接受集群外部的流量,并将其代理到集群中后端服务。在此示例中,通过foo.bar.com(IP地址为:178.91.123.132)主机作为代理服务器。当路径为http://foo.bar.cm:80/foo时,将会访问后端的s1服务;当路径为http://foo.bar.cm:80/bar时,将会访问后端的s2服务。
foo.bar.com -> 178.91.123.132 -> / foo s1:80 / bar s2:80
针对上述场景,Ingress的YAML配置文件如下所示:
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: mult-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: rules: - host: foo.bar.com http: paths: - path: /foo backend: serviceName: s1 servicePort: 80 - path: /bar backend: serviceName: s2 servicePort: 80
通过kubctl create -f命令创建上述的Ingress:
$ kubectl get ing
NAME RULE BACKEND ADDRESS
mult-ingress – foo.bar.com /foo s1:80 /bar s2:80
默认后端:没有规则的入口,就像前一节中所示的那样,会将所有的流量发送到一个默认的后端。通过指定一组规则和默认后端,可以使用相同的技术来告诉负载均衡器,可以在哪里能够找到网站的404页。如果在Ingress中没有与请求头中主机相匹配的主机,并且/或者没有与请求的URL相匹配的路径,那么路由将被路由到默认的后端。
参考资料
1.《Ingress》地址:https://kubernetes.io/docs/concepts/services-networking/ingress/
2.《Rewrite》地址:https://github.com/kubernetes/ingress-nginx/blob/master/docs/examples/rewrite/README.md
作者简介:
季向远,北京神舟航天软件技术有限公司产品经理。本文版权归原作者所有。