kubernetes-核心资源之Ingress

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配置文件一样,需要apiVersionkindmetadata字段。此示例定义了名称为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

作者简介:
季向远,北京神舟航天软件技术有限公司产品经理。本文版权归原作者所有。

K8S中文社区微信公众号