我正在使用虚拟盒vm在我的笔记本电脑中设置示例Kubernetes群集。 使用法兰绒作为覆盖网络。我已经成功创建了一个主节点和一个节点。当我在节点中启动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服务的唯一方法是在显示&#34的节点上运行http://172.17.60.2:27017/;看起来您正试图通过本机驱动程序端口上的HTTP访问MongoDB。 #34;
问题是我无法从主服务器或任何其他节点访问mongodb端点至少与上面的相同网址。我有另一个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和服务,但我不是网络人员,因此无法弄清楚究竟是什么问题。请帮助。
答案 0 :(得分:1)
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服务(将容器端口绑定到节点端口,使用-p 8000:8080
时在docker中的方式,或者跳转到集群内并尝试从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有一个值,即NODE中暴露mongodb的端口。)
curl NODE:32076
It looks like you are trying to access MongoDB over HTTP on the native driver port.
答案 1 :(得分:0)
发现了这个问题。这是因为在/ 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 logs 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主控或其他节点访问此内容。所以仍然需要弄明白。那里的任何人都可以提供一些调试技巧,会很棒。
更新
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