通过Nginx Ingress处理多个子路径。

通过Nginx Ingress处理多个子路径。

我正在努力让Ingress控制器正确处理子路径。我的架构 - 两个服务坐在一个域的不同路径上。每个服务都有自己的入口配置。

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress1
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/rewrite-target: /
    cert-manager.io/cluster-issuer: "letsencrypt-production-issuer"
    kubernetes.io/ingress.allow-http: "false"    
spec:
  tls:
  - hosts:
    - api.mydomain.com
    secretName: my-secret
  rules:
  - host: api.mydomain.com
    http:
      paths:
      - path: /path1
        backend:
          serviceName: service1
          servicePort: 80

而且...

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress2
  annotations:
    kubernetes.io/ingress.class: "nginx"
    cert-manager.io/cluster-issuer: "letsencrypt-production-issuer"
    kubernetes.io/ingress.allow-http: "false"
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  tls:
  - hosts:
    - api.mydomain.com
    secretName: my-secret
  rules:
  - host: api.mydomain.com
    http:
      paths:
      - path: /path2
        backend:
          serviceName: service2
          servicePort: 80

在上述配置下,第一个入口工作,我能够到达我的端点api.mydomain.compath1,同时api.mydomain.compath2返回http400。我到底做错了什么?

1
投票

所以实际的问题和Ingress找不到端点有点不同。我的后台服务是安全的gRPC服务,因此希望通过https或者grpcs来调用。所以设置一个ingress是针对安全后端运行的,就解决了这个问题。

nginx.ingress.kubernetes.io/secure-backends: "true"

对于新版本的k8s,你应该使用不同的属性。