我在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
答案 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