无法创建 Ingress
Couldn't create Ingress
我创建了两个服务,然后尝试在 GKE 中创建 Ingress。我的意图是使用 loadbalancer http/https 负载均衡器创建入口,从我读过的课程中可以看出入口创建负载均衡器。我为负载均衡器创建了一个静态 ip,它是注释的一部分。
两个服务都创建成功,也创建了入口,但入口没有任何主机或'address'。
以下是集群服务...
服务定义.. 除了服务名称更改外,服务 2 相同...
apiVersion: v1
kind: Service
metadata:
name: dns-demo
spec:
selector:
name: dns-demo
clusterIP: None
ports:
- name: dns-demo
port: 1234
targetPort: 1234
---
apiVersion: v1
kind: Pod
metadata:
name: dns-demo-1
labels:
name: dns-demo
spec:
hostname: dns-demo-1
subdomain: dns-demo
containers:
- name: nginx
image: nginx
---
apiVersion: v1
kind: Pod
metadata:
name: dns-demo-2
labels:
name: dns-demo
spec:
hostname: dns-demo-2
subdomain: dns-demo
containers:
- name: nginx
image: nginx
入口定义...
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: hello-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
kubernetes.io/ingress.global-static-ip-name: "global-ingress"
spec:
rules:
- http:
paths:
- path: /v1
backend:
serviceName: hello-svc
servicePort: 80
- path: /v2
backend:
serviceName: hello-lb-svc
servicePort: 80
你能告诉我我做错了什么吗?
谢谢
这里有一个简单而好的教程解释了如何实现这一点。
在您的设置中,我看到了一些需要更正的地方。第一个也是最重要的是您使用了选项 clusterIP: None
并且它使 Ingress 无法访问您的服务。
这是一张解释 ingress 工作原理的图片。
Ingress 会将所有流量重定向到您的服务,您的服务必须是 Type NodePort 或 LoadBalancer 才能接收此流量。
第二个问题是您的服务指向端口 1234 但您的 pods 是 运行 NGINX 并且它正在侦听端口 80。
您的服务应如下所示(已测试):
apiVersion: v1
kind: Service
metadata:
name: dns-demo
spec:
type: NodePort
selector:
name: dns-demo
ports:
- name: dns-demo
port: 80
targetPort: 80
我们现在可以进入您的入口,在这里我发现了更多问题。
第一个问题是您设置了 backend: serviceName: hello-svc
和 hello-lb-svc
但您的服务名称是 dns-demo
。因此,当向您的入口发出请求时,它不知道将流量发送到哪里,因为后端不存在。
您还使用了一些此时不需要的注释。针对您的案例的简单入口规则可能如下所示(已测试):
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: dns-demo
spec:
backend:
serviceName: dns-demo
servicePort: 80
最后,您的完整清单可能如下所示:
apiVersion: v1
kind: Pod
metadata:
name: dns-demo-1
labels:
name: dns-demo
spec:
hostname: dns-demo-1
subdomain: dns-demo
containers:
- name: nginx
image: nginx
---
apiVersion: v1
kind: Pod
metadata:
name: dns-demo-2
labels:
name: dns-demo
spec:
hostname: dns-demo-2
subdomain: dns-demo
containers:
- name: nginx
image: nginx
---
apiVersion: v1
kind: Service
metadata:
name: dns-demo
spec:
type: NodePort
selector:
name: dns-demo
ports:
- name: dns-demo
port: 80
targetPort: 80
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: dns-demo
spec:
backend:
serviceName: dns-demo
servicePort: 80
我创建了两个服务,然后尝试在 GKE 中创建 Ingress。我的意图是使用 loadbalancer http/https 负载均衡器创建入口,从我读过的课程中可以看出入口创建负载均衡器。我为负载均衡器创建了一个静态 ip,它是注释的一部分。
两个服务都创建成功,也创建了入口,但入口没有任何主机或'address'。
以下是集群服务...
服务定义.. 除了服务名称更改外,服务 2 相同...
apiVersion: v1
kind: Service
metadata:
name: dns-demo
spec:
selector:
name: dns-demo
clusterIP: None
ports:
- name: dns-demo
port: 1234
targetPort: 1234
---
apiVersion: v1
kind: Pod
metadata:
name: dns-demo-1
labels:
name: dns-demo
spec:
hostname: dns-demo-1
subdomain: dns-demo
containers:
- name: nginx
image: nginx
---
apiVersion: v1
kind: Pod
metadata:
name: dns-demo-2
labels:
name: dns-demo
spec:
hostname: dns-demo-2
subdomain: dns-demo
containers:
- name: nginx
image: nginx
入口定义...
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: hello-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
kubernetes.io/ingress.global-static-ip-name: "global-ingress"
spec:
rules:
- http:
paths:
- path: /v1
backend:
serviceName: hello-svc
servicePort: 80
- path: /v2
backend:
serviceName: hello-lb-svc
servicePort: 80
你能告诉我我做错了什么吗?
谢谢
这里有一个简单而好的教程解释了如何实现这一点。
在您的设置中,我看到了一些需要更正的地方。第一个也是最重要的是您使用了选项 clusterIP: None
并且它使 Ingress 无法访问您的服务。
这是一张解释 ingress 工作原理的图片。
Ingress 会将所有流量重定向到您的服务,您的服务必须是 Type NodePort 或 LoadBalancer 才能接收此流量。
第二个问题是您的服务指向端口 1234 但您的 pods 是 运行 NGINX 并且它正在侦听端口 80。
您的服务应如下所示(已测试):
apiVersion: v1
kind: Service
metadata:
name: dns-demo
spec:
type: NodePort
selector:
name: dns-demo
ports:
- name: dns-demo
port: 80
targetPort: 80
我们现在可以进入您的入口,在这里我发现了更多问题。
第一个问题是您设置了 backend: serviceName: hello-svc
和 hello-lb-svc
但您的服务名称是 dns-demo
。因此,当向您的入口发出请求时,它不知道将流量发送到哪里,因为后端不存在。
您还使用了一些此时不需要的注释。针对您的案例的简单入口规则可能如下所示(已测试):
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: dns-demo
spec:
backend:
serviceName: dns-demo
servicePort: 80
最后,您的完整清单可能如下所示:
apiVersion: v1
kind: Pod
metadata:
name: dns-demo-1
labels:
name: dns-demo
spec:
hostname: dns-demo-1
subdomain: dns-demo
containers:
- name: nginx
image: nginx
---
apiVersion: v1
kind: Pod
metadata:
name: dns-demo-2
labels:
name: dns-demo
spec:
hostname: dns-demo-2
subdomain: dns-demo
containers:
- name: nginx
image: nginx
---
apiVersion: v1
kind: Service
metadata:
name: dns-demo
spec:
type: NodePort
selector:
name: dns-demo
ports:
- name: dns-demo
port: 80
targetPort: 80
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: dns-demo
spec:
backend:
serviceName: dns-demo
servicePort: 80