我在同一个网络上有 4 台服务器;
我按照 https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/ 中的说明设置了一个 Kubernetes 集群使用 Calico 作为网络提供商。
我可以通过以下命令成功运行一个 pod(我以带有 ssh 访问的 Ubuntu docker 镜像为例)
kubectl run ubuntupod --image=rastasheep/ubuntu-sshd:16.04
并且可以使用
kubectl get
查看此 pod 的 IP 地址和 kubectl describe
(本例中,pod 的 IP 为 192.168.65.74。)然后我确认以下连接已启用
但是,我未能建立以下连接,我想请教人们如何做;
我尝试向ubuntu服务器(10.0.0.20)添加路由表,希望kubernetes主节点可以作为路由器,但没有成功;
sudo route add -net 192.168.0.0 netmask 255.255.0.0 gw 10.0.0.10
我怀疑Kubernetes master中的iptables有什么关系,但我不知道该怎么做。
有人可以帮我解决这个问题。
顺便说一句,我知道我想做的事情可能与 kubernetes 或 docker 的基本原理不同。也许我应该使用 kubernetes 的 Service 机制,但是我需要这种在 pod 和实际服务器之间访问的透明性。
最佳答案
I need this sort of transparency in accessing between pods and actual servers.
那么你想要的是,正如你所说但由于某种原因被解雇,一个
Service
使用 type: NodePort
-- 或 type: LoadBalancer
如果您的设置允许 - 它将在所有与其 selector:
匹配的 Pod 中循环...或
kubectl exec -it $the_pod_name -- bash -il
在 Pod 上执行命令(即:如果您的目标只是“连接”到 Pod 以在其上运行命令,而不是“网络连接”)...或
kubectl port-forward $the_pod_name ${local_port_number}:${pod_port_number}
将允许您有效地在 k8s 网络中直接钻一个洞到 Pod,但需要注意的是,连接仅在 kubectl
内有效。正在运行(当然还有 Pod 的使用生命周期)为了非常清楚,像 Calico 这样的软件定义网络传统上用于集群内的流量,最好将任何 IP 地址视为“假”地址。因此,我永远不会期望仅在任何东西上更新路由表就可以让您将“真实”网络堆栈连接到 Calico 中的“虚构”堆栈。用一小粒盐来回答这个问题,因为我从来没有专门使用过印花布,但毫无疑问,法兰绒就是以这种方式表现的。
关于docker - 直接从同一网络中的机器访问 kubernetes pod,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46077270/