一、单域名匹配多 Path 到不同服务

一个扇出(fanout)配置根据请求的 HTTP URI 将来自同一 IP 地址的流量路由到多个 Service。 Ingress 允许你将负载均衡器的数量降至最低。例如,这样的设置:

单域名匹配同一IP流量到不同服务

针对上面设置,进行示例说明:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: simple-fanout-example
spec:
  rules:
  - host: foo.bar.com
    http:
      paths:
      - path: /foo
        pathType: Prefix
        backend:
          service:
            name: service1
            port:
              number: 4200
      - path: /bar
        pathType: Prefix
        backend:
          service:
            name: service2
            port:
              number: 8080

二、多域名匹配到相同服务

基于名称的虚拟主机支持将针对多个主机名的 HTTP 流量路由到同一 IP 地址上。例如,这样的设置:

多域名匹配到相同服务

针对上面设置,进行示例说明:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: name-virtual-host-ingress
spec:
  rules:
  - host: foo.bar.com
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: service1
            port:
              number: 80
  - host: bar.foo.com
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: service2
            port:
              number: 80

说明:如果你创建的 Ingress 资源没有在 rules 中定义的任何 hosts,则可以匹配指向 Ingress 控制器 IP 地址的任何网络流量,而无需基于名称的虚拟主机。

三、更新 Ingress

更新Ingress可以直接使用kubectl edit进行更改,也可以通过kubectl apply/replace进行更改。

在线编辑更新

要更新现有的 Ingress可以通过编辑资源来对其进行更新:

$ k edit ingress ingress-name

YAML 文件更新

要更新现有的 Ingress可以通过编辑yaml文件来对其进行更新:

$ k replace/apply -f new-ingress.yaml

Ingress 接口变化解析

1.19 之前的 v1beta1

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: simple-fanout-example
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
    - host: foo.bar.com
      http:
        paths:
          - path: /foo
            pathType: Prefix
            backend:
              serviceName: service1
              servicePort: 80
          - path: /bar
            pathType: ImplementationSpecific
            backend:
              serviceName: service2
              servicePort: 8080

1.19之后的v1

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: name-virtual-host-ingress
spec:
  rules:
  - host: foo.bar.com
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: service1
            port:
              number: 80

二者之间的区别:

特性 v1beta1 v1
API 版本 Kubernetes 1.19 之前,已弃用 Kubernetes 1.19 及之后,稳定版本
pathType 字段 不支持,默认为 Prefix 支持 PrefixExactImplementationSpecific
后端服务定义 serviceNameservicePort service.nameservice.port.number
默认行为 宽松,默认路径匹配为 Prefix 严格,要求明确指定 pathType
兼容性 Kubernetes 1.19 之前 Kubernetes 1.19 及之后