GKE 上的一个 GCE 入口导致另一个 GCE 入口服务于默认后端

One GCE ingress on GKE is causing a different GCE ingress to serve default backend

我正在使用外部 DNS,以获得额外的背景。

我为应用程序 "A," 设置了一项服务、部署和入口,一切都按预期工作,我可以在指定的 URL 到达应用程序 A。然后我为应用程序 "B," 设置了类似的东西,现在我 可以 到达应用程序 B,但是如果我点击为应用程序 A 指定的 URL,我得到default backend - 404 消息。我以前没见过这个问题,请问是什么问题?以下是 A 和 B 的服务、部署和入口清单:

一个:服务:

apiVersion: v1
kind: Service
metadata:
  name: my-app-A
spec:
  ports:
    - name: https
      port: 443
      protocol: TCP
      targetPort: 3000
    - name: http
      port: 80
      protocol: TCP
      targetPort: 3000
  selector:
    run: my-app-A
  type: NodePort

A:部署:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: my-app-A
spec:
  replicas: 1
  template:
    metadata:
      labels:
        run: my-app-A
    spec:
      containers:
        - name: my-app-A
          image: this-is-my-docker-image
          imagePullPolicy: Always
          envFrom:
            - secretRef:
                name: my-app-A-secrets
            - configMapRef:
                name: my-app-A-configmap
          ports:
            - containerPort: 3000

A:入口:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: my-app-A
  annotations:
    external-dns.alpha.kubernetes.io/hostname: "A.myurl.com"
    kubernetes.io/ingress.class: "gce"
    kubernetes.io/ingress.allow-http: "true"
spec:
  rules:
  - host: "A.myurl.com"
    http:
      paths:
      - path: /*
        backend:
          serviceName: my-app-A
          servicePort: 80
  - host: "my-app-A-namespace.clusterbase.myurl.com"
    http:
      paths:
      - path: /*
        backend:
          serviceName: my-app-A
          servicePort: 80

对于 B 的清单,将 "A" 的所有实例替换为 "B",并将 external-dns.alpha.kubernetes.io/hostname: "A.myurl.com" 替换为 external-dns.alpha.kubernetes.io/hostname: "myurl.com"

问题是命名空间+ingress 的名称太长,在后台创建的资源以相同的名称结束,因为它们有 64 个字符的限制并且独特的部分被截断了。我在这里提交了一个错误,在其中进行了更详细的解释。

https://github.com/kubernetes/ingress-gce/issues/537

如果 <namespace>-<ingress> 的前 64 个字符不唯一,您将遇到此问题。