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 个字符不唯一,您将遇到此问题。
我正在使用外部 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 个字符不唯一,您将遇到此问题。