docker - 直接从同一网络中的机器访问 kubernetes pod

标签 docker kubernetes iptables project-calico

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

  • 10.0.0.10:Kubernetes 主机
  • 10.0.0.11:Kubernetes 节点 1
  • 10.0.0.12:Kubernetes 节点 2
  • 10.0.0.20:普通 ubuntu 服务器(未安装 kubernetes)

  • 我按照 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。)

    然后我确认以下连接已启用
  • 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)
  • pods (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 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/

    相关文章:

    kubernetes - 无法在K8S集群上安装Rook

    linux - IPTables 如何阻止特定的 UDP 数据包?

    c - docker 容器中的共享内存 ID 始终为 0

    docker - ENTRYPOINT的Docker Run错误

    docker - 使用-ti bash启动时Docker连接被拒绝

    node.js - 如何获取 Kubernetes 集群上所有正在运行的 POD

    bash - 如何确定在 shell 启动期间打印的错误消息来自何处?

    apache-spark - 在集群模式下在 Kubernetes 上提交 Spark 应用程序 : Configured service account doesn't have access

    linux - 如何检查 iptables 中每条规则的命中数?

    c - BPF : mark in structure __skbuff is not writeable?