【问题标题】:Unable to use curl and service name from inside kubernetes pod无法从 kubernetes pod 内部使用 curl 和服务名称
【发布时间】:2016-04-06 02:16:14
【问题描述】:

我在 coreos 上运行 kubernetes 单节点

我创建了一个运行 python 应用程序并公开 http 端点的 pod。

我创建了一个暴露 HTTP 端点的 kubernetes 服务。我已经使用 NodePort 公开了这个服务,并且可以从集群外部成功调用它。

然后我正在尝试从 docker 容器调用 HTTP 服务。为了测试我只是使用相同的运行容器并使用 curl。

我可以docker exec 进入运行我的服务的 docker 容器。 nslookup for 'my-service' 解析为 IP 地址。所以我很高兴 DNS 服务注册工作正常。 (我还检查了服务的 ENV 变量是否存在 - 它们确实存在并且与从 nslookup 返回的值相同)

但是,如果我再尝试:

curl http://my-service:9042/status

它只是挂起没有响应。 (端口 9042 是正确的端口,状态是有效的资源)

我假设我遗漏了一些非常明显的东西。热烈欢迎任何建议。

更新:

curl -v 的响应是:

root@lake-cluster-manager:/# curl -v http://lake-service:9042/status
* Hostname was NOT found in DNS cache
*   Trying 10.3.0.128...

nslookup 的输出是:

root@lake-cluster-manager:/# nslookup lake-service   
Server:     10.3.0.10
Address:    10.3.0.10#53

Name:   lake-service.default.svc.cluster.local
Address: 10.3.0.128

【问题讨论】:

  • 请与我们分享以下命令的输出:curl -v http://my-service:9042/status
  • 感谢@IDvoretskyi 我已将 curl -v 信息以及 nsloookup 的输出添加到原始描述中。
  • @IDvoretskyi 我想我找到了问题所在。我正在测试 curl 命令的容器是托管服务的容器。如果我在另一个 Pod 的同一节点上启动另一个容器,则 curl 命令按预期工作。我想了解为什么会这样......
  • @gra-moore 你有什么发现
  • @RajeshRajendran 您是否发现为什么容器不能通过其服务名称引用自己?我正在运行一个 IdentityServer,它需要能够通过服务名称引用自己,当它这样做时,它会超时。我用 kubectl 连接到 pod 并尝试 curl 到它刚刚挂起的服务名称。

标签: kubernetes


【解决方案1】:

从 cmets 看来,您似乎可以做到这一点。

到服务 IP 的流量通过 kube-proxy 转发,通过用户空间代理或通过 iptables 规则,具体取决于 Kubernetes 发布版本和配置。您可能需要查看与该容器对应的节点的 iptables 规则,看看这是否是问题的根源。

【讨论】:

    【解决方案2】:

    由于 Kubernetes v1.10 kubectl port-forward 允许使用资源名称(例如服务名称)来选择匹配的 pod 进行端口转发 有了这个连接,您就可以使用本地工作站来调试在 pod 中运行的应用程序。

    捕获您的 pod 端口号

    kubectl get pods [YOUR_PODE_NAME] --template='{{(index (index .spec.containers 0).ports 0).containerPort}}{{"\n"}}'
    

    假设我们得到了 PORT NUMBER 8080

    kubectl port-forward [YOUR_PODE_NAME] 8080:8080
    

    现在导航到本地计算机上的http://localhost:8080/ 以查看您的应用程序正在运行

    【讨论】:

      【解决方案3】:

      访问同一集群中另一个 pod 上的服务的另一种方法是使用服务的扩展网络名称,例如:

      service-name: wash-disher
      service-port: 8080
      namespace: restaurant
      
      kubectl run client --image=curlimages/curl --namespace test
      kubectl -n test exec client-654845585c-s4fcw -- curl -v -Ss http://wash-disher.restaurant.svc.cluster.local:8080
      

      可以通过服务ip上的nslookup找到:

      $ kubectl -n test exec client-654845585c-s4fcw -- nslookup 10.96.183.177
      Server:         10.96.5.5
      Address:        10.96.5.5:53
      
      a.b.c.d.in-addr.arpa      name = ingress-nginx.ingress-nginx.svc.cluster.local
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-30
        • 2020-09-02
        • 2021-06-17
        • 2020-03-19
        • 1970-01-01
        • 2021-06-03
        • 2021-12-09
        相关资源
        最近更新 更多