gpt4 book ai didi

kubernetes - Kube 集群通信

转载 作者:行者123 更新时间:2023-12-02 12:23:05 26 4
gpt4 key购买 nike

我正在使用虚拟机虚拟机在我的笔记本电脑中设置一个示例 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://172.17.60.2:27017/在显示“看起来您正试图在 native 驱动程序端口上通过 HTTP 访问 MongoDB”的节点上。

问题是我无法从主节点或任何其他节点访问 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 和服务,但存在一些潜在的网络问题,但我不是网络人,所以无法弄清楚究竟是什么问题。请帮忙。

最佳答案

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

看服务描述:

[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如您所见,这是一个法兰绒 IP:运行 Mongo 的容器的 IP。此 IP 是您覆盖网络的一部分。无法从虚拟网络(法兰绒网络)外部访问它。

这就是为什么当你这样做时:
 [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 服务(将容器端口绑定(bind)到节点端口,就像使用 -p 8000:8080 时在 docker 中所做的那样,或者跳入集群并尝试连接到该服务从 pods (这就是您尝试过但失败的方法)。

将服务公开为节点端口(当您不在云中运行时相当于 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.

关于kubernetes - Kube 集群通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41384295/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com