无法使用kubernetes pod

时间:2016-01-01 16:16:27

标签: kubernetes

我在coreos上运行 kubernetes单个节点

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

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

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

我可以docker exec进入运行我的服务的docker容器。 'my-service'的nslookup解析为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

3 个答案:

答案 0 :(得分:0)

从评论中,听起来你可以开始工作了。

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

答案 1 :(得分:0)

因为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"}}'

假设我们的端口号为8080

kubectl port-forward [YOUR_PODE_NAME] 8080:8080

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

答案 2 :(得分:0)

访问同一集群中另一个 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