无法从 Kubernetes 主节点访问服务。

4
[root@kubemaster ~]# kubectl get pods -o wide
NAME                             READY   STATUS    RESTARTS   AGE   IP             NODE          NOMINATED NODE   READINESS GATES
pod1deployment-c8b9c74cb-hkxmq   1/1     Running   0          12s   192.168.90.1   kubeworker1   <none>           <none>

[root@kubemaster ~]# kubectl logs pod1deployment-c8b9c74cb-hkxmq
2020/05/16 23:29:56 Server listening on port 8080

[root@kubemaster ~]# kubectl get service -o wide
NAME          TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE   SELECTOR
kubernetes    ClusterIP   10.96.0.1        <none>        443/TCP   13m   <none>
pod1service   ClusterIP   10.101.174.159   <none>        80/TCP    16s   creator=sai

主节点上的 Curl:

[root@kubemaster ~]# curl -m 2 -v -s http://10.101.174.159:80
* About to connect() to 10.101.174.159 port 80 (#0)
*   Trying 10.101.174.159...
* Connection timed out after 2001 milliseconds
* Closing connection 0

工作节点1上的Curl对集群IP(这是Pod运行的节点)成功。

[root@kubemaster ~]# ssh kubeworker1 curl -m 2 -v -s http://10.101.174.159:80
Hello, world!
Version: 1.0.0
Hostname: pod1deployment-c8b9c74cb-hkxmq

Curl 在其他工作节点上也失败了:
[root@kubemaster ~]# ssh kubeworker2 curl -m 2 -v -s http://10.101.174.159:80
* About to connect() to 10.101.174.159 port 80 (#0)
*   Trying 10.101.174.159...
* Connection timed out after 2001 milliseconds
* Closing connection 0

请问您能否在主节点上尝试执行 curl -m 2 -v -s http://pod1service.default.svc 命令吗? - hariK
如果您正在尝试从集群外部访问服务(甚至从其中一个节点的控制台),那么NodePort服务是否更适合您的需求? - David Maze
[root@kubemaster ~]#curl -m 2 -v http://pod1service.default.svc *无法解析主机:pod1service.default.svc;未知错误 *关闭连接0 - confused genius
David,是的,那是真的...但我们在设置中真正遇到的问题是“无法从集群内部访问群集IP”。 - confused genius
David,请为我澄清这个疑问...serviceip:port应该从Pod内部访问,还是从k8节点访问? - confused genius
这里有一个对你有帮助的链接:https://dev59.com/YFgR5IYBdhLWcg3wRbo2。 - Crou
2个回答

1

我也遇到了同样的问题,以下是我所做的事情,并且它有效:

概述:我正在运行 2 个虚拟机以组成一个 2 节点群集。一个主节点和一个工作节点。部署正在工作节点上运行。我想要从主节点 curl,以便我可以从在工作节点上的 pod 中运行的应用程序获得响应。为此,我在工作节点上部署了一个服务,然后暴露了集群中这些一组 pod。

问题:在部署服务并执行 Kubectl get service 后,它提供了该服务的 ClusterIP 和端口(顺便说一下,在编写 service.yaml 时我使用了 NodePort 而不是 Cluster IP)。但是在那个 IP 地址和端口上进行 curl 时,它只是挂起,然后经过一段时间后超时。

解决方案:然后我尝试查看层次结构。首先,我需要联系服务所在的节点上的节点,然后使用NodePort提供的端口(即30000-32767之间的端口),因此我首先执行Kubectl get nodes -o wide以获取所需节点的内部IP地址(我的是10.0.1.4),然后我执行kubectl get service -o wide以获取端口(即30000-32767之间的端口),并对其进行了curl操作。因此,我的curl命令是->curl http://10.0.1.4:30669,然后我就能够得到输出结果。

0
首先,您应始终使用Service DNS而不是集群/动态IP来访问部署的应用程序。服务DNS将为<service-name>.<service-namespace>.svc.cluster.local,“cluster.local”是默认的Kubernetes集群名称,如果未更改则可以使用此默认值。
现在来谈服务可访问性,可能是DNS问题。您可以尝试检查kube-system命名空间中kube-dns pod日志。还可以尝试从独立pod上进行curl检查是否正常运作。 kubectl run --generator=run-pod/v1 bastion --image=busybox kubectl exec -it bastion bash curl -vvv pod1service.default.svc.cluster.local 如果还是有问题,进一步的问题可能是如何创建这个集群以及它在哪里。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接