GKE入口无法正确重写路径

时间:2019-04-15 11:08:47

标签: node.js kubernetes google-kubernetes-engine kubernetes-ingress nginx-ingress

我最近在GKE中设置了一个nginx入口,但该入口无法以某种方式正确地重写目标容器中要解析的微型应用程序(laravel流明)的路径。这些应用程序具有一个称为“测试”的功能,该功能将为“ alpha”和“ beta”打印“ testing one”和“ testing two”。该功能应该可以通过http://<base_url>/public/testing访问。

入口yaml中定义了两个路径,/alpha/*/beta/*都指向两个服务lumen-alpha-svclumen-beta-svc。我没有此入口的任何域,因此我未定义入口的“主机”,并且入口仍应可通过GKE为入口提供的外部IP地址进行访问。

我通过访问两个入口路径的http://<external-ip-address>/alpha/public/testing/测试了入口,并且收到HTTP错误404,但是这件事仍然让我感到困惑。因此,我建立了一个名为path-check-svc的新服务,并在入口处添加了指向该服务的新路径/check/*。然后该服务指向一个将打印URL路径的nodejs程序。我通过访问http://<external-ip-address>/check/something/测试了路径,而nodejs返回了URL路径/check/something/。这让我更加困惑。由于入口路径是使用/check/*定义的,以将其重定向到path-check-svc,所以这不会使程序的路径仅捕获到/something/吗?这使我意识到这是导致流明应用程序中出现http错误404的原因,因为它无法解决http://<external-ip-address>/alpha/public/testing/,因为流明应用程序不知道/alpha/是什么。

那么我应该如何定义入口,以便可以将url路径重写为应用程序可以捕获的有效url路径。谢谢。

这是kubernetes的yaml文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: lumen-alpha
  labels:
    app: lumen-alpha
spec:
  selector:
    matchLabels:
      app: lumen-alpha
  template:
    metadata:
      labels:
        app: lumen-alpha
    spec:
      containers:
        - image: husnurrsyafni/lumen-test-alpha:php
          name: lumen-test-alpha                 
          ports:
            - containerPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: lumen-beta
  labels:
    app: lumen-beta
spec:
  selector:
    matchLabels:
      app: lumen-beta
  template:
    metadata:
      labels:
        app: lumen-beta
    spec:
      containers:
        - image: husnurrsyafni/lumen-test-beta:php
          name: lumen-test-beta                 
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: lumen-alpha-svc
spec:
  type: NodePort
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  selector:
    app: lumen-alpha
---
apiVersion: v1
kind: Service
metadata:
  name: lumen-beta-svc
spec:
  type: NodePort
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  selector:
    app: lumen-beta
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: lumen-ingress
  annotations:
        nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
  - http:
      paths:
      - path: /alpha/*
        backend:
          serviceName: lumen-alpha-svc
          servicePort: 80
      - path: /beta/*
        backend:
          serviceName: lumen-beta-svc
          servicePort: 80

1 个答案:

答案 0 :(得分:0)

如果要进行nginx.ingress.kubernetes.io/rewrite-target注释,则需要创建自己的 nginx ingress controller,它是service

或使用头盔(最好):

helm install stable/nginx-ingress

GKE提供的入口控制器不支持rewrite-target