首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

k8s集群外的主机访问pod的解决方案

背景

目前公司想做服务的注册与发现,但是在推进过程中,存在一个问题,目前我们的服务是混合部署的,即一部分部署在虚机,一部分部署在容器,所以就会面临这样一个问题,当容器里的服务和虚机里的服务都去注册中心进行注册时,虚机是无法访问容器的地址的,不过令人欣慰的是,虚机和容器是同属一局域网,所以要实现服务的注册与发现,首先需要解决这一问题。

解决过程

首先就是一顿分析了,下面是我的分析过程

k8s集群和集群外的虚机属于同一局域网,网络互联互通,即容器能访问集群外的虚机

集群外的虚机无法访问pod里的服务

只需要在集群外的虚机上做调整

是不是可以通过添加静态路由的方式呢?

知道了这些,我大概就想到了是不是可以通过添加一条静态路由呢?但是在添加静态路由之前,得需要了解从pod里访问集群外虚机时的出口IP地址是什么?这个可以通过使用tcpdump来解决

1)现在一个Pod中去telnet虚机的地址,然后在虚机上进行抓包

#进入Pod中

kubectl exec -it user-api-764d68b678-54kt2 bash

#执行telnet,这里随意指定一个端口,只要没有被占用就好,目的是防止抓包时被其他信息干扰

telnet192.168.0.13012345

虚机上抓包

#虚机上抓包,指定12345端口即可

tcpdump -nni any port12345

Telnet的结果

# telnet 192.168.0.130 12345

Trying192.168.0.130...

telnet: connect to address192.168.0.130: Connection refused

tcpdump抓包结果

可以看到在Pod里进行Telnet时,访问虚机的源地址为node节点的IP地址,到这里基本上问题就解决了。

2)虚机上添加静态路由

#查看Pod的IP是什么?

kubectl get pod -o wide | grep user-api

user-api-764d68b678-54kt21/1Running3d17h10.200.0.90alpha-node-01

可以看到IP地址为10.200.0.90

拿到Pod的IP地址后,就可以去虚机上添加路由了

route add -host10.200.0.90gw192.168.0.198

验证下

#ping下是否能通

# ping 10.200.0.90

PING10.200.0.90(10.200.0.90)56(84)bytes of data.

64bytes from10.200.0.90: icmp_seq=1ttl=63time=0.296ms

64bytes from10.200.0.90: icmp_seq=2ttl=63time=0.258ms

#再访问下服务是否可以通

# curl 10.200.0.90:8088/api/healthy/check

{"code":,"message":"success"}

可以的,所以通过添加一条静态路由就可以解决同一局域网的虚机和pod的通信问题,但是这只是一个Pod的IP,实际上每一个node上都会起几十上百个这样的pod,那该如何添加呢?

我们的集群使用的网络插件是calico,而每一台节点分配的子网都是不同的,比如node1的IP段为10.200.0.0/24 , node2的IP段为10.200.38.0/24 所以我们可以添加整个IP段到虚机的路由表中

route add -net10.200.0.0/24gw192.168.0.198

route add -net10.200.38.0/24gw192.168.0.168

在每一台需要访问pod的虚机上,把集群内的IP段都添加上,就能实现了

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200419A089XI00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券