直接从同一网络中的计算机访问kubernetes pod

时间:2017-09-06 14:01:34

标签: docker kubernetes iptables project-calico

我在同一个网络上有4台服务器;

  • 10.0.0.10:Kubernetes master
  • 10.0.0.11:Kubernetes node 1
  • 10.0.0.12:Kubernetes node 2
  • 10.0.0.20:正常的ubuntu服务器(未安装kubernetes)

我按照https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/中的说明使用Calico作为网络提供商设置了kubernetes群集。

我可以通过以下命令成功运行一个pod(我使用带有ssh访问权限的Ubuntu docker镜像作为示例)

kubectl run ubuntupod --image=rastasheep/ubuntu-sshd:16.04

并且可以使用kubectl getkubectl describe查看此广告连播的IP地址(在这种情况下,广告连接的IP为192.168.65.74。)

然后我确认已启用以下连接

  • kubernetes master / nodes(10.0.0.10~10.0.0.12) - > pod(192.168.65.74)
  • pod(192.168.65.74) - > kubernetes master / nodes(10.0.0.10~10.0.0.12)
  • pod(192.168.65.74) - >普通的ubuntu服务器(10.0.0.20)

但是,我未能建立以下连接,我想问人们该怎么做;

  • 普通的ubuntu服务器(10.0.0.20) - > pod(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大师中与iptables有关,但我不知道该怎么做。

有人可以帮我解决这个问题。

顺便说一句,我明白我想做的事可能与kubernetes或docker的基本原理不同。也许我应该使用kubernetes的服务机制,但是在pod和实际服务器之间访问时我需要这种透明性。

3 个答案:

答案 0 :(得分:0)

  

在pod和实际服务器之间访问时,我需要这种透明性。

然后您想要的是,正如您所说,但由于某种原因被解雇,如果您的设置允许,则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中的“虚构”网络堆栈。用一小块盐来回答这个问题,因为我从来没有特别使用过Calico,但毫无疑问法兰绒就是这样做的。

答案 1 :(得分:0)

您可以尝试在ubuntu服务器上运行k8s的kube-proxy组件,它将为访问k8s服务和pod创建所需的iptables规则

答案 2 :(得分:0)

使用Calico,您可以使用BGP将您的群集与网络结构(甚至只是一个主机)对等,然后将路由分发到您的Pod,允许从外部主机直接访问Pod。 以下是一些可以帮助https://docs.projectcalico.org/v2.5/usage/external-connectivity#inbound-connectivityhttps://docs.projectcalico.org/v2.5/usage/configuration/bgp

的文档链接

在主机上实现此目的的一种(可能是简单的)方法是在主机上运行calico / node并配置它,使得calico / node可以到达Calico数据存储区并有效地成为“Calico群集”的一部分但不属于Kuberentes集群。