首页
学习
活动
专区
圈层
工具
发布
50 篇文章
1
kubernetes与velero的第一次尝试
2
在Kubernetes中如何针对Namespace进行资源限制?
3
kubernetes之metrics-server安装与配置
4
kubernetes部署metrics-server
5
Kubernetes1.20.9摘掉一个master节点再重新加入(ETCD需要注意的)
6
Kubernetes 1.17.17升级到1.18.20
7
Kubernetes 1.18.20升级到1.19.12
8
Kubernetes 1.19.12升级到1.20.9(强调一下selfLink)
9
Kubernetes 1.16.15升级到1.17.17
10
使用 kainstall 工具一键部署 kubernetes 高可用集群
11
附034.Kubernetes_v1.21.0高可用部署架构二
12
附016.Kubernetes_v1.17.4高可用部署
13
附022.Kubernetes_v1.18.3高可用部署架构一
14
附024.Kubernetes_v1.18.3高可用部署架构二
15
使用 StatefulSet 部署 etcd 集群
16
Kubernetes 稳定性保障手册 -- 极简版
17
Linux(centos7)离现安装kubernetes1.19.2和docker——组件部分
18
docker register 私有仓库部署 - http模式
19
KubeSphere 开源 KubeEye:Kubernetes 集群自动巡检工具
20
K8S 中的 CPUThrottlingHigh 到底是个什么鬼?
21
全链路分布式跟踪系统 Apache SkyWalking 入门教程
22
pod Evicted的状态究竟是何人所为
23
使用 ezctl 工具部署和管理 Kubernetes 集群
24
Kubernetes部署策略详解
25
kubernetes容器探针检测
26
使用Spring Boot实现动态健康检查HealthChecks
27
真一文搞定 ingress-nginx 的使用
28
K8S备份、恢复、迁移神器 Velero
29
一次关于k8s kubectl top 和 contained ps 不一致的问题探究
30
kubernetes备份恢复之velero
31
使用 Velero 进行集群备份与迁移
32
TKE集群中nginx-ingress使用实践
33
使用velero进行kubernetes灾备
34
Kubernetes 映射外部服务
35
运维体系建设套路
36
k8s解决pod调度不均衡的问题
37
ingress中虚拟路径解决方案
38
容器下的两地三中心建设
39
k8s集群外的主机访问pod的解决方案
40
k8s基础-健康检查机制
41
k8s基础-标签使用
42
ingress-nginx请求改写
43
nginx ingress server alias 多域名多证书问题
44
JAVA | Java 解决跨域问题 花式解决跨域问题
45
如何通过ingress-nginx实现应用灰度发布?
46
在Kubernetes(k8s)中使用GPU
47
使用 Prometheus-Operator 监控 Calico
48
使用Kubespray部署Kubernetes集群
49
云原生下的CI/CD:Argo CD 详解,手把手教你入门
50
Pod的健康检查机制
清单首页k8s文章详情

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

背景

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

解决过程

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

  • k8s集群和集群外的虚机属于同一局域网,网络互联互通,即容器能访问集群外的虚机
  • 集群外的虚机无法访问pod里的服务
  • 只需要在集群外的虚机上做调整
  • 是不是可以通过添加静态路由的方式呢?

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

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

代码语言:javascript
复制
#进入Pod中
kubectl exec -it user-api-764d68b678-54kt2 bash
#执行telnet,这里随意指定一个端口,只要没有被占用就好,目的是防止抓包时被其他信息干扰
telnet 192.168.0.130 12345

虚机上抓包

代码语言:javascript
复制
#虚机上抓包,指定12345端口即可
tcpdump -nni any port 12345

Telnet的结果

代码语言:javascript
复制
# telnet 192.168.0.130 12345
Trying 192.168.0.130...
telnet: connect to address 192.168.0.130: Connection refused

tcpdump抓包结果

代码语言:javascript
复制
# 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)虚机上添加静态路由

代码语言:javascript
复制
#查看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地址后,就可以去虚机上添加路由了

代码语言:javascript
复制
route add -host 10.200.0.90 gw 192.168.0.198

验证下

代码语言:javascript
复制
#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段到虚机的路由表中

代码语言:javascript
复制
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段都添加上,就能实现了。

下一篇
举报
领券