仅按主机名进行动态路由 - Kubernetes Ingress 规则

Dynamic Routing by Hostname only - Kubernetes Ingress Rules

我有一个部署了多个不同服务的 K8s 集群,我想使用一个 Ingress 通过唯一的主机名 DNS.[=16= 将每个传入请求路由到适当的服务]

目前,我只能在使用根路径时解决请求,即 service-123.app.com

当我尝试使用无法解析的路径发出请求时。这些路径是每个服务的有效路径。例如,应用程序需要 service-123.app.com/page/12345

我可能不完全理解 K8s Ingress 规则的预期工作方式,但我希望它仅基于主机名进行匹配,并简单地转发到适当服务的路径上。

我是不是漏掉了一些非常简单的东西?任何帮助深表感谢。谢谢!

这是我的配置文件。

Ingress.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    ......
  name: app-name
  namespace: default
spec:
  rules:
  - host: service-123.app.com
    http:
      - path: "/*"
        backend:
          serviceName: service-123
          servicePort: 80
  - host: service-456.app.com
    http:
      paths:
      - path: "/*"
        backend:
          serviceName: service-456
          servicePort: 80

service.yaml

---
apiVersion: v1
kind: Service
metadata:
  annotations: {}
  labels:
    app: service-123
  name: service-123
  namespace: default
spec:
  ports:
  - name: port8080
    port: 80
    targetPort: 8080
  selector:
    app: service-123
  type: NodePort

不确定您使用的是哪个 K8s 和入口控制器,但在后来的 K8s 中,您可以指定 pathType 来更好地处理路径通配符。

你会得到这样的结果:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    ......
  name: app-name
  namespace: default
spec:
  rules:
  - host: service-123.app.com
    http:
      - path: /
        pathType: Prefix
        backend:
          serviceName: service-123
          servicePort: 80
  - host: service-456.app.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          serviceName: service-456
          servicePort: 80

如果您使用 nginx ingress controller 查看正确的 nginx 配置的一个好方法是查看入口控制器生成的实际 nginx.conf

$ kubectl cp <nginx-ingress-controller-pod>:nginx.conf nginx.conf
$ cat nginx.conf