无法通过GKE上的入口访问资源

时间:2019-12-21 21:01:21

标签: kubernetes google-cloud-platform google-kubernetes-engine devops kubernetes-ingress

我正在尝试创建一个Ingress资源,将其散布到两个运行状况良好的服务中。这是我非常简单的配置:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: my-ingress
  namespace: default
spec:
  rules:
    - http:
        paths:
          - path: /*
            backend:
              serviceName: service1
              servicePort: 8080
          - path: /service2/*
            backend:
              serviceName: service2
              servicePort: 9090

似乎只有对根(/)路径的请求有效。我一直在尝试使用类似的在线帖子来解决这个问题,但是没有任何帮助。

我该怎么办?

编辑:

此配置在Minikube上工作正常,但在GKE上不行吗?

3 个答案:

答案 0 :(得分:1)

如果您使用的是GKE的默认入口控制器,那么yaml对我来说看起来不错。我建议您重新检查 NodePort 类型的服务(即service1,service2),并确保它们运行正常。

如果您使用的是nginx-0.20.0以上版本的NGINX Ingress Controller,则需要将nginx.ingress.kubernetes.io/use-regex批注设置为true(默认值为{ {1}})启用区分大小写的正则表达式。

就像:

false

答案 1 :(得分:0)

我在Azure上具有有效的配置,这很简单,但在某些方面与您的配置有所不同。我相应地重写了您的Yaml,看看是否有帮助:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: my-ingress
  namespace: default
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
    - http:
        paths:
          - path: /service2/?(.*)
            backend:
              serviceName: service2
              servicePort: 9090
          - path: /?(.*)
            backend:
              serviceName: service1
              servicePort: 8080

显着的区别是:

  1. 路径被翻转,因此越具体的路径越高。不确定是否有影响。
  2. 将简单通配符更改为预读:* => ?(.*)。这使我可以使用nginx.ingress.kubernetes.io/rewrite-target批注来确保我不会丢失/service2/之后的url部分。因此,如果您要准确地呼叫 / service2 /,这可能会有所帮助。

答案 2 :(得分:0)

如果您使用的是 nginx ,请检出此github issue

如果您使用的是 traefik ,请尝试:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: traefik
  name: my-ingress
spec:
  rules:
  - http:
      paths:
      - path: /
        backend:
          serviceName: service1
      - path: /service2/
        backend:
          serviceName: service2
相关问题