Kubernetes 入口 |无法解析主机名

Posted

技术标签:

【中文标题】Kubernetes 入口 |无法解析主机名【英文标题】:Kubernetes Ingress | could not resolve hostname 【发布时间】:2020-03-24 01:47:12 【问题描述】:

我首先创建了一个入口集群和一个入口服务,然后将请求路由到 k8s 集群中的 NodePort-serviceA(资源服务)和 NodePort-serviceB(人员服务),一个入口文件(通过Staffing-ingress.yaml 的名称)应用如下所述。

Resources-service 和 Staffing-service 可以在容器内部相互通信,并且在从资源容器中点击 curl 命令“curl -v http://staffing-service:8080/swagger/index.html”时,会返回 HTTP 200 的准确结果,反之亦然。但是,如果像 http://staffing-service:8080/ 这样点击不完整的 URL,则会引发 404 错误。

我怀疑路径路由是在下面的 staffing-ingress.yaml 文件中完成的。欢迎提出任何建议。

这里是详细信息

使用 nginx 负载均衡器 IP 访问服务(人员或资源)不会返回结果并抛出 404 错误。

Curl –v http:// a5b9f45d4119a11eabbd90a9c35f3125-1159448980.us-east-2.elb.amazonaws.com:80/api/resources throws the below error
* TCP_NODELAY set
* Connected to a5b9f45d4119a11eabbd90a9c35f3125-1159448980.us-east-2.elb.amazonaws.com (3.134.165.38) port 80 (#0)

< HTTP/1.1 404 Not Found
< Server: openresty/1.15.8.2
< X-Response-Time-ms: 0

Staffing-Ingress.YAML

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: staffing-ingress
  namespace: default
  annotations:
    ingress.kubernetes.io/ssl-redirect: "false"
spec:
  rules:
    http:
      paths:
      - path: /api/resources
        backend:
          serviceName: resources-service
          servicePort: 8001
      - path: /api/staffing
        backend:
          serviceName: staffing-service
          servicePort: 8080

预期结果 是在使用具有 URI'/api/resources/' 的外部 LB 从入口命中时,它应该调用 api-service http://resources-service:8001/swagger/index.html。

【问题讨论】:

您使用了错误的 URL。我已经提供了有关如何使用正确 URL 的答案。 【参考方案1】:

在路由方面一切正常。 您使用的 URL 错误。 你必须使用这个网址

http:// a5b9f45d4119a11eabbd90a9c35f3125-1159448980.us-east-2.elb.amazonaws.com:80/api/resources/swagger/index.html

您必须在您的网址中附加 swagger/index.html,就像您在通过服务访问它时所做的那样。

curl –v http://staffing-service:8080/swagger/index.html


curl –v http:// a5b9f45d4119a11eabbd90a9c35f3125-1159448980.us-east-2.elb.amazonaws.com:80/api/resources/swagger/index.html

【讨论】:

太棒了!非常感谢,它奏效了。 :) 是否有可能在配置文件中进行任何更改,以便调用 .../api/recources 本身在末尾添加后缀 ../swagger/index.html。 是的,您可以在 Staffing-Ingress.YAML 中添加“rewrite-target”注释。 像这样:“ingress.kubernetes.io/rewrite-target: /api/resources/swagger/index.html” 谢谢,在这种情况下,对 /api/staffing 的请求也会被重定向到 /api/resources/swagger/index.html。我们可以有多个重定向 您可以从中删除 /api/staffing 配置,并使用 /api/staffing 创建一个不带“rewrite-target”注释的新 Ingress 资源【参考方案2】:

Ingress 不会删除上下文路径!

因此,您在 Ingress 之前对 www.xxx.yyy/api/resources/ 的调用不等于在 Ingress 之后对 www.xxx.yyy/ 的调用。这个想法是您的支持服务也需要具有相同的上下文路径。

您需要做的是为这两个服务添加上下文路径:

resources-service: www.xxx.yyy/api/resources/swagger/index.html
staffing-service: www.xxx.yyy/api/staffing/swagger/index.html

【讨论】:

感谢您的回复。我还没有测试,但我相信你是正确的,这应该有效。

以上是关于Kubernetes 入口 |无法解析主机名的主要内容,如果未能解决你的问题,请参考以下文章

可达性解析主机名但无法ping通主机名

无法推送到 Heroku '致命:无法访问..无法解析主机:(无);提供节点名或服务名,或未知'

无法在 Eclipse 上解析主机名(localhost)

Ubuntu ssh:无法解析主机名 myserver:名称或服务未知

apache 虚拟主机(EAI 2)名称或服务未知:AH00547:无法解析主机名

无法解析主机名 git:提供节点名或服务名,或未知