【问题标题】:Couldn't create Ingress无法创建 Ingress
【发布时间】:2020-10-01 20:25:54
【问题描述】:

我创建了两个服务,然后尝试在 GKE 中创建 Ingress。我的意图是使用负载平衡器 http/https 负载平衡器创建入口,从我读过的课程中,入口创建负载平衡器。我为负载均衡器创建了一个静态 ip,它是注释的一部分。

两个服务都已成功创建,入口也已创建,但入口没有任何主机或“地址”。

以下是集群服务...

服务定义..与服务 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

你能告诉我我做错了什么吗?

谢谢

【问题讨论】:

    标签: service kubernetes-ingress kubernetes-service google-cloud-load-balancer


    【解决方案1】:

    这里有一个简单而好的教程来解释如何实现这一点。

    在您的设置中,我看到一些需要纠正的地方。第一个也是最重要的是您使用了选项clusterIP: None,它使 Ingress 无法访问您的服务。

    这是一张解释 Ingress 工作原理的图片。

    Source

    Ingress 会将所有流量重定向到您的服务,并且您的服务必须是 NodePort 或 LoadBalancer 类型才能接收此流量。

    第二个问题是您的服务指向 1234 端口,但您的 pod 正在运行 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-svchello-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
    

    【讨论】:

    • 谢谢你,沃特尼。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-08
    • 2022-01-14
    相关资源
    最近更新 更多