Kubernetes-Ingress:如何使用HTTPS正确路由到两个服务?

时间:2019-06-23 06:15:57

标签: kubernetes kubernetes-ingress

我正在尝试通过Kubernetes部署ReactJs应用程序和Express-GraphQL服务器。但是我在设置入口以将流量路由到两个服务时遇到麻烦。具体来说,我无法再到达后端。

当我将React前端和Express后端作为单独的服务并公开它们时,它运行良好。但是现在我正在尝试启用HTTPS和DNS。并通过Ingress路由到他们两个人。

这是我的服务Yaml文件

apiVersion: v1
kind: Service
metadata:
  name: bpmclient
  namespace: default
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 5000
  selector:
    run: bpmclient
  type: NodePort
apiVersion: v1
kind: Service
metadata:
  name: bpmserver
  namespace: default
spec:
  ports:
  - port: 3090
    protocol: TCP
    targetPort: 3090
  selector:
    run: bpmserver
  type: NodePort

和我的入口...

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: bpm-nginx
  annotations:
    kubernetes.io/ingress.global-static-ip-name: bpm-ip
    networking.gke.io/managed-certificates: bpmclient-cert
    ingress.kubernetes.io/enable-cors: "true"
    ingress.kubernetes.io/cors-allow-origin: "https://example.com"
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /v2/*
        backend:
          serviceName: bpmserver
          servicePort: 3090
      - path: /*
        backend:
          serviceName: bpmclient
          servicePort: 80

通过此设置,我已经能够使用https成功访问客户端。但是我再也无法通过客户端或浏览到后端了。我收到502服务器错误。但是我检查了后端Pod的日志,除了404日志之外什么都看不到。

我的前端通过example.com/v2/graphql到达后端。当我在计算机上本地运行它时,我转到localhost:3090 / graphql。因此,如果路由正确完成,我看不到为什么得到404。

1 个答案:

答案 0 :(得分:1)

我在这里看到了几处可能出错的东西:

  1. 入口对象应在与其路由的服务相同的名称空间中创建。我看到您在服务的Yaml中指定了namespace: default,但在Ingress中没有指定。

  2. 我不知道您使用的是哪个Ingress版本,但在0.22.0之后符合documentation

  

使用注释的入口定义   nginx.ingress.kubernetes.io/rewrite-target不向后   与以前的版本兼容。在0.22.0及更高版本中,任何   请求URI中需要传递给   重新编写的路径必须在捕获组中明确定义。

  1. path:应该嵌套在backend:之后,捕获组应该添加到nginx.ingress.kubernetes.io/rewrite-target: /中的数字占位符中,例如$1

所以您应该尝试这样的事情:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: bpm-nginx
  namespace: default
  annotations:
    kubernetes.io/ingress.global-static-ip-name: bpm-ip
    networking.gke.io/managed-certificates: bpmclient-cert
    ingress.kubernetes.io/enable-cors: "true"
    ingress.kubernetes.io/cors-allow-origin: "https://example.com"
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
  - host: example.com
    http:
      paths:
      - backend:
          serviceName: bpmserver
          servicePort: 3090
        path: /v2/?(.*)
      - backend:
          serviceName: bpmclient
          servicePort: 80
        path: /?(.*)

请告诉我是否有帮助。