1、概述
本文档,我们主要来说明,在创建ingress的时候呢,里面会有个字段叫做,path type,这个字段都可以设置为哪些的值,设置为不同的值,对我们设置的path有什么影响。
OK,话不多说,我们开始。
2、路径类型(pathType)介绍
在ingress中的每个path都需要一个对应的pathType。
如下:
kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-test-ingress
  namespace: test01
spec:
  ingressClassName: nginx
  rules:
  - host: nginx-test.k8s.com
    http:
      paths:
      - backend:
          service:
            name: nginx-test-02
            port:
              number: 80
        path: /
        pathType: Prefix
EOF 
如果创建ingress的时候,没有指定pathType,那么创建会失败,如下:
[root@nccztsjb-node-23 ~]# kubectl apply -f - <<EOF
> apiVersion: networking.k8s.io/v1
> kind: Ingress
> metadata:
>   name: nginx-test-ingress
>   namespace: test01
> spec:
>   ingressClassName: nginx
>   rules:
>   - host: nginx-test.k8s.com
>     http:
>       paths:
>       - backend:
>           service:
>             name: nginx-test-02
>             port:
>               number: 80
>         path: /
> EOF
error: error validating "STDIN": error validating data: ValidationError(Ingress.spec.rules[0].http.paths[0]): missing required field "pathType" in io.k8s.api.networking.v1.HTTPIngressPath; if you choose to ignore these errors, turn validation off with --validate=false
[root@nccztsjb-node-23 ~]# 
 
提示:missing required field "pathType"
好的,那么在ingress中,支持哪些path类型呢,我们接着往下看
3、支持的path类型
有3种支持的path类型:
ImplementationSpecific:对于这种path类型,匹配取决于IngressClass。可以将其视为一个单独的pathType或者将其认为和Prefix或者Exact路径类型一样。
Exact:精确匹配URL路径,并且区分大小写
Prefix: 根据URL中的,被/分割的前缀进行匹配。匹配区分大小写并且按照元素对路径进行匹配。path元素指的是路径中由/分隔符分隔的标签列表。
注意:如果路径的最后一个元素是请求路径中最后一个元素的子字符串,那么这个是不匹配的。【举例:/foo/bar匹配/foo/bar/baz,但是不匹配/foo/barbaz】
4、示例
以下为匹配的具体的示例:
|   路径类型  |  
     路径  |  
     请求路径  |  
     匹配与否  |  
  
|   Prefix  |  
     /  |  
     (all paths)  |  
     Yes  |  
  
|   Exact  |  
     /foo  |  
     /foo  |  
     Yes  |  
  
|   Exact  |  
     /foo  |  
     /bar  |  
     No  |  
  
|   Exact  |  
     /foo  |  
     /foo/  |  
     No  |  
  
|   Exact  |  
     /foo/  |  
     /foo  |  
     No  |  
  
|   Prefix  |  
     /foo  |  
     /foo, /foo/  |  
     Yes  |  
  
|   Prefix  |  
     /foo/  |  
     /foo, /foo/  |  
     Yes  |  
  
|   Prefix  |  
     /aaa/bb  |  
     /aaa/bbb  |  
     No  |  
  
|   Prefix  |  
     /aaa/bbb  |  
     /aaa/bbb  |  
     Yes  |  
  
|   Prefix  |  
     /aaa/bbb/  |  
     /aaa/bbb  |  
     Yes, ignores trailing slash-忽略结尾/  |  
  
|   Prefix  |  
     /aaa/bbb  |  
     /aaa/bbb/  |  
     Yes, matches trailing slash-忽略结尾/  |  
  
|   Prefix  |  
     /aaa/bbb  |  
     /aaa/bbb/ccc  |  
     Yes, matches subpath-匹配子路径  |  
  
|   Prefix  |  
     /aaa/bbb  |  
     /aaa/bbbxyz  |  
     No, does not match string prefix-不匹配字符串前缀  |  
  
|   Prefix  |  
     /, /aaa  |  
     /aaa/ccc  |  
     Yes, matches /aaa prefix-最长匹配  |  
  
|   Prefix  |  
     /, /aaa, /aaa/bbb  |  
     /aaa/bbb  |  
     Yes, matches /aaa/bbb prefix--最长匹配  |  
  
|   Prefix  |  
     /, /aaa, /aaa/bbb  |  
     /ccc  |  
     Yes, matches / prefix  |  
  
|   Prefix  |  
     /aaa  |  
     /ccc  |  
     No, uses default backend-使用默认后端  |  
  
|   Mixed  |  
     /foo (Prefix), /foo (Exact)  |  
     /foo  |  
     Yes, prefers Exact-精确匹配优先  |  
  
5、多路径匹配原则
在某些情况下,一个Ingress中的多个路径将匹配一个请求。在这些情况下,优先级将首先给最长的匹配路径。如果两条路径仍然相等匹配,则优先级将给具有精确路径类型的路径,而不是前缀路径类型。
简单来说,就是,精确匹配,最长匹配的原则。
