【问题标题】:GKE ingress resource returns 404 although it is connected to a service尽管 GKE 入口资源已连接到服务,但它返回 404
【发布时间】:2021-12-10 04:00:31
【问题描述】:

我添加了一个默认的 nginx-ingress 部署,其中包含从 GCP 获得的区域 IP。

helm install nginx-ingress \
             nginx-stable/nginx-ingress \
             --set rbac.create=true \
             --set controller.service.loadBalancerIP="<GCP Regional IP>"

我有一个带有单个 .js 文件的 dockerized 节点应用程序。我使用基本的舵图进行了部署。该服务称为 node-app-blue-helm-chart

const http = require('http');

const hostname = '0.0.0.0';
const port = 80;

const server = http.createServer((req, res) => {
    if (req.url == '/another-page'){
        res.statusCode = 200;
            res.setHeader('Content-Type', 'text/html');
                res.end('<h1>another page</h1>');

    } else {
        res.statusCode = 200;
            res.setHeader('Content-Type', 'text/html');
                res.end('<h1>Hello World</h1>');
    }
});

server.listen(port, hostname, () => {
    console.log('Server running at http://%s:%s/', hostname, port);
});

process.on('SIGINT', function() {
    console.log('Caught interrupt signal and will exit');
    process.exit();
});

我部署了以下入口资源:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-resource
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
  rules:
  - host: "*.example.com"
    http:
      paths:
      - path: /*
        pathType: Prefix
        backend:
          service:
            name: node-app-blue-helm-chart
            port:
              number: 80

虽然入口资源获取 IP 和端点。它仍然返回 404 错误。有什么问题? host: "*.example.com" 部分会不会有问题?

更多信息:

kubectl describe ing ingress-resource
Name:             ingress-resource
Namespace:        default
Address:          <GCP Regional IP>
Default backend:  default-http-backend:80 (10.0.0.2:8080)
Rules:
  Host           Path  Backends
  ----           ----  --------
  *.example.com  
                 /*   node-app-blue-helm-chart:80 (10.0.0.15:80)
Annotations:     kubernetes.io/ingress.class: nginx
                 nginx.ingress.kubernetes.io/ssl-redirect: false
Events:          <none>


kubectl describe svc node-app-blue-helm-chart
Name:              node-app-blue-helm-chart
Namespace:         default
Labels:            app.kubernetes.io/instance=node-app-blue
                   app.kubernetes.io/managed-by=Helm
                   app.kubernetes.io/name=helm-chart
                   app.kubernetes.io/version=1.16.0
                   helm.sh/chart=helm-chart-0.1.0
Annotations:       meta.helm.sh/release-name: node-app-blue
                   meta.helm.sh/release-namespace: default
Selector:          app.kubernetes.io/instance=node-app-blue,app.kubernetes.io/name=helm-chart
Type:              ClusterIP
IP Families:       <none>
IP:                10.3.248.13
IPs:               10.3.248.13
Port:              http  80/TCP
TargetPort:        80/TCP
Endpoints:         10.0.0.15:80
Session Affinity:  None
Events:            <none>

我尝试了什么:

从入口资源中的 /* 中删除 *。没有解决问题。

kubectl describe ing ingress-resource
Name:             ingress-resource
Namespace:        default
Address:          W.X.Y.Z
Default backend:  default-http-backend:80 (10.0.0.2:8080)
Rules:
  Host           Path  Backends
  ----           ----  --------
  *.example.com  
                 /   node-app-blue-helm-chart:80 (10.0.0.15:80)
Annotations:     kubernetes.io/ingress.class: nginx
                 nginx.ingress.kubernetes.io/ssl-redirect: false
Events:
  Type    Reason          Age        From                      Message
  ----    ------          ----       ----                      -------
  Normal  AddedOrUpdated  <invalid>  nginx-ingress-controller  Configuration for default/ingress-resource was added or updated

【问题讨论】:

    标签: kubernetes google-kubernetes-engine kubernetes-helm kubernetes-ingress nginx-ingress


    【解决方案1】:

    尝试编辑您的 Ingress。您设置了path=/*,这可能不是您的本意。 / 应该这样做:

    [...]
    spec:
      rules:
      - host: "*.example.com"
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: node-app-blue-helm-chart
                port:
                  number: 80
    

    【讨论】:

    • 没有解决问题。
    • 你确定吗,@bcan?您在最后一个 Ingress 描述中留下了您的公共 IP,仅供参考。我可以查询它并从您的 NodeJS 代码中获得响应(curl --header 'Host: abc.example.com' http://W.X.Y.Z/ping 返回&lt;h1&gt;Hello World&lt;/h1&gt;)。也可以在没有路径的情况下使用。 /another-page 仍然将我发送到同一个“Hello World”,也许这不是您在代码中匹配的实际路径,... AFAIU,您的入口效果很好。
    • 感谢修复。但是当我尝试使用浏览器时,它只返回 404。尝试使用不同的浏览器和私有模式等。
    • 从我的浏览器(chrome)测试,强制 DNS 解析(/etc/hosts 文件),我可以看到 Hello World。也许您正在使用某种 http 代理,无法解析您的 .example.com 名称?您是否有任何可以使用的有效 DNS 名称?如果您执行一些host W.X.Y.Z,您应该找到与您的 IP 关联的 PTR 记录的值。您可以在您的 Ingress 配置和浏览器中使用该名称……可能会更好?
    • 已将主机更改为我拥有的实际域,现在可以使用了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-27
    • 2020-12-05
    • 1970-01-01
    • 2020-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多