k8s集群外的主机访问pod的解决方案
时间:2022-07-22
本文章向大家介绍k8s集群外的主机访问pod的解决方案,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
背景
目前公司想做服务的注册与发现,但是在推进过程中,存在一个问题,目前我们的服务是混合部署的,即一部分部署在虚机,一部分部署在容器,所以就会面临这样一个问题,当容器里的服务和虚机里的服务都去注册中心进行注册时,虚机是无法访问容器的地址的,不过令人欣慰的是,虚机和容器是同属一局域网,所以要实现服务的注册与发现,首先需要解决这一问题。
解决过程
首先就是一顿分析了,下面是我的分析过程
- k8s集群和集群外的虚机属于同一局域网,网络互联互通,即容器能访问集群外的虚机
- 集群外的虚机无法访问pod里的服务
- 只需要在集群外的虚机上做调整
- 是不是可以通过添加静态路由的方式呢?
知道了这些,我大概就想到了是不是可以通过添加一条静态路由呢?但是在添加静态路由之前,得需要了解从pod里访问集群外虚机时的出口IP地址是什么?这个可以通过使用tcpdump来解决
1)现在一个Pod中去telnet虚机的地址,然后在虚机上进行抓包
#进入Pod中
kubectl exec -it user-api-764d68b678-54kt2 bash
#执行telnet,这里随意指定一个端口,只要没有被占用就好,目的是防止抓包时被其他信息干扰
telnet 192.168.0.130 12345
虚机上抓包
#虚机上抓包,指定12345端口即可
tcpdump -nni any port 12345
Telnet的结果
# telnet 192.168.0.130 12345
Trying 192.168.0.130...
telnet: connect to address 192.168.0.130: Connection refused
tcpdump抓包结果
# tcpdump -nni any port 12345
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
10:52:28.644112 IP 192.168.0.198.35066 > 192.168.0.130.12345: Flags [S], seq 3592146803, win 28000, options [mss 1400,sackOK,TS val 780676435 ecr 0,nop,wscale 7], length 0
10:52:28.644169 IP 192.168.0.130.12345 > 192.168.0.198.35066: Flags [R.], seq 0, ack 3592146804, win 0, length 0
可以看到在Pod里进行Telnet时,访问虚机的源地址为node节点的IP地址,到这里基本上问题就解决了。
2)虚机上添加静态路由
#查看Pod的IP是什么?
kubectl get pod -o wide | grep user-api
user-api-764d68b678-54kt2 1/1 Running 0 3d17h 10.200.0.90 alpha-node-01 <none> <none>
可以看到IP地址为10.200.0.90
拿到Pod的IP地址后,就可以去虚机上添加路由了
route add -host 10.200.0.90 gw 192.168.0.198
验证下
#ping下是否能通
# ping 10.200.0.90
PING 10.200.0.90 (10.200.0.90) 56(84) bytes of data.
64 bytes from 10.200.0.90: icmp_seq=1 ttl=63 time=0.296 ms
64 bytes from 10.200.0.90: icmp_seq=2 ttl=63 time=0.258 ms
#再访问下服务是否可以通
# curl 10.200.0.90:8088/api/healthy/check
{"code":0,"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 -net 10.200.0.0/24 gw 192.168.0.198
route add -net 10.200.38.0/24 gw 192.168.0.168
在每一台需要访问pod的虚机上,把集群内的IP段都添加上,就能实现了。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Ubuntu安装docker
- DockerFile简介与实例
- Elasticsearch2.3官方Dockerfile解析
- openstack架构解析
- Linux服务器基础网络配置
- 负载均衡集群介绍,LVS介绍,LVS的调度算法,LVS的NAT模式搭建
- 03 实战 Ansible-Playbook之初始化服务器
- Dubbo与Zookeeper,SpringMVC整合和使用
- Docker安全之用户资源隔离
- kubernetes(六) 基于kubeadm构建高可用k8s集群
- docker存储驱动知识归纳总结
- 未来已来——如何在VR游戏中实现3D语音
- kubernetes(五)之Dockerfile
- kubernetes(四)之Docker存储卷
- 使用卷积神经网络构建图像分类模型检测肺炎