【问题标题】:Kube cluster communicationKube 集群通信
【发布时间】:2017-09-25 14:02:24
【问题描述】:

我正在使用虚拟机虚拟机在我的笔记本电脑中设置一个示例 Kubernetes 集群。 使用 flannel 作为覆盖网络。我已经成功创建了一个主节点和一个节点。当我在节点中启动 pod 以部署 mongodb 容器时,pod 和容器已成功部署端点。服务也创建成功

在主人身上

[osboxes@kubemaster pods]$ kubectl get pods -o wide
NAME      READY     STATUS    RESTARTS   AGE       IP            NODE
busybox   1/1       Running   0          3m        172.17.60.3   192.168.6.103
mongodb   1/1       Running   0          21m       172.17.60.2   192.168.6.103
[osboxes@kubemaster pods]$ kubectl get services -o wide
NAME           CLUSTER-IP       EXTERNAL-IP   PORT(S)     AGE           SELECTOR
kubernetes     10.254.0.1       <none>        443/TCP     17d       <none>
mongoservice   10.254.244.175   <none>        27017/TCP   47m       name=mongodb


[osboxes@kubemaster pods]$ kubectl describe svc mongoservice 
Name:           mongoservice
Namespace:      default
Labels:         name=mongoservice
Selector:       name=mongodb
Type:           ClusterIP
IP:         10.254.244.175
Port:           <unset> 27017/TCP
Endpoints:      172.17.60.2:27017
Session Affinity:   None

使用 docker ps 在节点上

8707a465771b        busybox                                                      "sh"                  9 minutes ago Up 9minutes                            k8s_busybox.53e510d6_busybox_default_c4892314-cde3-11e6-8a53-08002700df07_492b1a89
bea9de4e05cf        registry.access.redhat.com/rhel7/pod-infrastructure:latest   "/pod"                   9 minutes ago       Up 9 minutes                            k8s_POD.ae8ee9ac_busybox_default_c4892314-cde3-11e6-8a53-08002700df07_2bffae46
eaff8dc1a360        mongo                                                        "/entrypoint.sh mongo"   28 minutes ago      Up 28 minutes                           k8s_mongodb.d1eca71a_mongodb_default_240cd411-cde1-11e6-8a53-08002700df07_ef5a8bbe
6a90b06cd434        registry.access.redhat.com/rhel7/pod-infrastructure:latest   "/pod"                   28 minutes ago      Up 28 minutes                           k8s_POD.7ce0ec0_mongodb_default_240cd411-cde1-11e6-8a53-08002700df07_11074b20

我可以连接到 mongodb 服务的唯一方法是在显示 “看起来您正试图在本机驱动程序端口上通过 HTTP 访问 MongoDB”的节点上运行 http://172.17.60.2:27017/

问题是我无法从 master 或任何其他节点访问 mongodb 端点,至少访问与上述相同的 url。我有另一个 java webapp 容器将作为另一个节点中的 pod 运行,我需要让它交互,但这是下一步。我计划使用 env 变量进行 interpod 通信,并且还看到在节点中的容器上正确创建了环境变量。

我完成了这个http://kubernetes.io/docs/user-guide/debugging-services/ 并遵循了该过程,但无法使任何步骤起作用。

[osboxes@kubemaster pods]$ sudo kubectl run -i --tty busybox --image=busybox --generator="run-pod/v1"
Waiting for pod default/busybox to be running, status is Pending, pod ready: false
Waiting for pod default/busybox to be running, status is Pending, pod ready: false
If you don't see a command prompt, try pressing enter.
Error attaching, falling back to logs: dial tcp 192.168.6.103:10250: getsockopt: connection refused
Error from server: Get https://192.168.6.103:10250/containerLogs/default/busybox/busybox: dial tcp 192.168.6.103:10250: getsockopt: connection refused


[osboxes@kubemaster pods]$ curl 172.17.60.2:27017
curl: (7) Failed connect to 172.17.60.2:27017; No route to host
[osboxes@kubemaster pods]$ curl 10.254.244.175:27017
curl: (7) Failed connect to 10.254.244.175:27017; Connection timed out

[osboxes@kubemaster pods]$ kubectl exec -ti mongodb -c k8s_mongodb.d1eca71a_mongodb_default_240cd411-cde1-11e6-8a53-08002700df07_ef5a8bbe sh
Error from server: container k8s_mongodb.d1eca71a_mongodb_default_240cd411-cde1-11e6-8a53-08002700df07_ef5a8bbe is not valid for pod mongodb
[osboxes@kubemaster pods]$ kubectl exec -ti mongodb -c k8s_POD.7ce0ec0_mongodb_default_240cd411-cde1-11e6-8a53-08002700df07_11074b20 sh
Error from server: container k8s_POD.7ce0ec0_mongodb_default_240cd411-cde1-11e6-8a53-08002700df07_11074b20 is not valid for pod mongodb
[osboxes@kubemaster pods]$ kubectl exec -ti mongodb  sh
Error from server: dial tcp 192.168.6.103:10250: getsockopt: connection refused

我怀疑尽管创建了 pod 和服务,但存在一些潜在的网络问题,但我不是网络人,所以无法弄清楚究竟是什么问题。请帮忙。

【问题讨论】:

    标签: kubernetes


    【解决方案1】:

    TL;DR:您无法按原样从主服务器连接到服务,您必须创建一个NodePort 服务,然后使用给定的NodePort 进行连接。 p>

    看服务描述:

    [osboxes@kubemaster pods]$ kubectl describe svc mongoservice 
    Name:           mongoservice
    Namespace:      default
    Labels:         name=mongoservice
    Selector:       name=mongodb
    Type:           ClusterIP
    IP:         10.254.244.175
    Port:           <unset> 27017/TCP
    Endpoints:      172.17.60.2:27017
    Session Affinity:   None
    

    服务端点是:Endpoints: 172.17.60.2:27017,如您所见,这是一个 flannel IP:运行 Mongo 的容器的 IP。此 IP 是您覆盖网络的一部分。无法从虚拟网络(flannel 网络)外部访问它。

    这就是为什么当你这样做时:

     [osboxes@kubemaster pods]$ curl 172.17.60.2:27017
    

    你得到这个错误,这是正确的:

     curl: (7) Failed connect to 172.17.60.2:27017; No route to host
    

    因为你试图从主节点访问容器 IP。

    您有 2 个选项,您可以将 mongoservice 公开为 NodePort 服务(将容器端口绑定到节点端口,就像在 docker 中使用 -p 8000:8080 时所做的那样,或者您跳入集群并尝试连接从 pod 到服务(这是您尝试过但失败的方法)。

    将服务公开为nodeport(当你不在云端运行时相当于LoadBalancer)

    kubectl expose service mongoservice --port=27017 --type=NodePort
    

    如果 mongoservice 已经存在,您可能必须删除它。现在让我们检查一下服务:

    Name:           mongo-4025718836
    Namespace:      default
    Labels:         pod-template-hash=4025718836
                run=mongo
    Selector:       pod-template-hash=4025718836,run=mongo
    Type:           NodePort
    IP:         10.0.0.11
    Port:           <unset> 27017/TCP
    NodePort:       <unset> 32076/TCP
    Endpoints:      172.17.0.9:27017
    Session Affinity:   None
    

    请注意,现在您拥有相同的端点(Pod Ip,mongo 端口:172.17.0.9:27017),但 NodePort 有一个值,即暴露 mongodb 的 NODE 中的端口。

    curl NODE:32076
    It looks like you are trying to access MongoDB over HTTP on the native driver port.
    

    【讨论】:

    • 您好伊万,非常感谢您的回复。我将节点端口添加到服务中。 kubectl describe svc mongoservice 名称:mongoservice 选择器:name=mongodb 类型:NodePort IP:10.254.54.22 端口: 27017/TCP NodePort: 30061/TCP curl 10.254.54.22:30061 curl:(7)连接失败10.254.54.22:30061;连接超时[\$ curl 172.17.38.3:27017 curl: (7) 连接到 172.17.38.3:27017 失败;没有路由到主机 $ curl 172.17.38.3:30061 curl: (7) 连接到 172.17.38.3:30061 失败;没有路由到主机仍然无法通信。
    • 抱歉,请完整阅读您的答案,并使用节点 ip 从 master 访问它,它可以正常工作。 curl 192.168.6.103:30061 从大师那里工作。非常感谢您的帮助。
    【解决方案2】:

    发现问题。这是因为在 /etc/kubernetes/kubelet

    不知何故,kubelet 地址是 127.0.0.1,将其更改为 0.0.0.0 工作正常。

    #KUBELET_ADDRESS="--address=127.0.0.1"
    KUBELET_ADDRESS="--address=0.0.0.0"
    

    sudo kubectl 记录 mongodb

    所以上面的命令现在从 master 可以正常工作了。

    但是这个命令仍然只在运行 mongodb 的节点上有效

    curl 10.254.39.156:27017
    It looks like you are trying to access MongoDB over HTTP on the native driver port.
    

    我无法从 kube master 或其他节点访问它。所以还是得想办法。那里的任何人都可以提供一些调试技巧,会很棒。

    更新:

    kube master 上的路由表

    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    0.0.0.0         192.168.6.1     0.0.0.0         UG    100    0        0 enp0s3
    172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
    192.168.6.0     0.0.0.0         255.255.255.0   U     100    0        0 enp0s3
    192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0
    

    节点1

    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    0.0.0.0         192.168.6.1     0.0.0.0         UG    100    0        0 enp0s3
    172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 flannel0
    172.17.100.0    0.0.0.0         255.255.255.0   U     0      0        0 docker0
    192.168.6.0     0.0.0.0         255.255.255.0   U     100    0        0 enp0s3
    192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0
    

    节点2

    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    0.0.0.0         192.168.6.1     0.0.0.0         UG    100    0        0 enp0s3
    0.0.0.0         10.0.3.2        0.0.0.0         UG    101    0        0 enp0s8
    10.0.3.0        0.0.0.0         255.255.255.0   U     100    0        0 enp0s8
    172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 flannel0
    172.17.95.0     0.0.0.0         255.255.255.0   U     0      0        0 docker0
    192.168.6.0     0.0.0.0         255.255.255.0   U     100    0        0 enp0s3
    

    【讨论】:

    • 嗨,有人对以上内容有任何想法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    • 2020-05-24
    • 2018-12-21
    • 2020-12-08
    • 2018-10-18
    相关资源
    最近更新 更多