办公环境下k8s网络互通方案
在 kubernetes 的网络模型中,基于官方默认的 CNI 网络插件 Flannel,这种 Overlay Network(覆盖网络)可以轻松的实现 pod 间网络的互通。当我们把基于 spring cloud 的微服务迁移到 k8s 中后,无须任何改动,微服务 pod 可以通过 Eureka 注册后可以互相轻松访问。
但是实际使用中,我们出现了以下需求:
- 1.办公室网络 和 k8s pod 网络不通。开发在电脑完成某个微服务模块开发后,希望本地启动后,能注册到 k8s 中开发环境的服务中心进行调试,而不是本地起一堆依赖的服务。
- 2.办公室网络 和 k8s svc 网络不通。在 k8s 中运行的 mysql、redis 等,无法通过 ingress 7层暴露,电脑无法通过客户端工具直接访问;如果我们通过 service 的 NodePort 模式,会导致维护量工作量巨大。
网络互通配置
k8s 集群中新加一台配置不高(2核3G)的 node 节点(node-3)专门做路由转发,连接办公室网络和 k8s 集群 pod、svc
- node-3 IP 地址 10.129.83.159
- 内网DNS IP 地址 10.129.83.159
- pod网段 172.20.0.0/16,svc网段 10.68.0.0/16
- 办公网段 10.129.0.0/24
给 node-3节点打上污点标签(taints),不让 k8s 调度 pod 来占用资源:
kubectl taint nodes node-3 forward=node-3:NoSchedule
node-3节点,做snat:
# 开启转发
# vim /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
# sysctl -p
# 来自办公室访问pod、service snat
iptables -t nat -A POSTROUTING -s 10.129.0.0/24 -d 172.20.0.0/16 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 10.129.0.0/24 -d 10.68.0.0/16 -j MASQUERADE
在办公室的出口路由器上,设置静态路由,将 k8s pod 和 service 的网段,路由到 node-3节点上
ip route 172.20.0.0 255.255.0.0 10.129.83.159
ip route 10.68.0.0 255.255.0.0 10.129.83.159
DNS 解析配置
以上步骤操作后,我们就可以在本地电脑通过访问 pod ip 和 service ip 去访问服务。但是在 k8s 中,由于 pod ip 随时都可能在变化,service ip 也不是开发、测试能轻松获取到的。我们希望内网 DNS 在解析 *.cluster.local
,去coreDNS
寻找解析结果。
这里也可以测试一下,podip是可以通的,但是svc不行,因为svc的ip是虚拟ip。
例如,我们约定将(项目A 、开发环境一 、数据库mysql)部署到 ProjectA-dev1 这个 namespace 下,由于本地到 k8s 集群 service 网络已经打通,我们在本地电脑使用 mysql 客户端连接时,只需要填写mysql.ProjectA-dev1.svc.cluster.local
即可,DNS 查询请求到了内网DNS后,走向 CoreDNS,从而解析出 service ip。
由于内网 DNS 在解析 *.cluster.local
,需要访问 CoreDNS 寻找解析结果。这就需要保证网络可达
最简单的做法,我们把内网DNS部署在node-3这台节点上,那么他肯定访问到kube-dns 10.68.0.2
# kubectl get svc -n kube-system |grep kube-dns
kube-dns ClusterIP 10.68.0.2 <none> 53/UDP,53/TCP,9153/TCP 7h1m
因为当前环境中内网dns就部署在node-3这台机器上,所以直接配置即可。
首先部署内网dns(有dns的略过)
本环境以centos7为例,安装轻量级的dns服务dnsmasq
#yum install -y dnsmasq
#vim /etc/resolv.conf #这个DNS指定本地服务器ip
# Generated by NetworkManager
nameserver 10.129.83.159
#vim /etc/dnsmasq.conf
resolv-file=/etc/resolv.dnsmasq.conf #上游DNS路径,这里面配置电信、谷歌等公有dns。
strict-order #取消strict-order注释
addn-hosts=/etc/dnsmasq.hosts #可以配置所有服务器的主机地址和对应的主机名
listen-address=127.0.0.1,10.129.83.159 #监听地址,改成自己服务器IP
server=/cluster.local/10.68.0.2 #指定以cluster.local为后缀的域名,使用coredns的地址解析。
#systemctl start dnsmasq #启动服务
可以看到已经启动成功。
#systemctl enable dnsmasq #开机自动启动
注意:其他服务器或者本地windows要使用这个dns,就把dns配置为此服务器的地址。
测试
办公环境下k8s网络互通方案的更多相关文章
- 【Kubernetes】K8S 网络隔离 方案
参考资料: K8S-网络隔离参考 OpenContrail is an open source network virtualization platform for the cloud. – Kub ...
- 查看shell环境下,网络是否连通-curl/ping
检查网络是否可用 curl www.baidu.com <!--STATUS OK--><html>...</html> ping www.baidu.com注意: ...
- MySQL分库分表环境下全局ID生成方案 转
在大型互联网应用中,随着用户数的增加,为了提高应用的性能,我们经常需要对数据库进行分库分表操作.在单表时代,我们可以完全依赖于数据库的自增ID来唯一标识一个用户或数据对象.但是当我们对数据库进行了分库 ...
- MySQL分库分表环境下全局ID生成方案
在大型互联网应用中,随着用户数的增加,为了提高应用的性能,我们经常需要对数据库进行分库分表操作.在单表时代,我们可以完全依赖于数据库的自增ID来唯一标识一个用户或数据对象.但是当我们对数据库进行了分库 ...
- 【转】MySQL分库分表环境下全局ID生成方案
转载一篇博客,里面有很多的知识和思想值得我们去思考. —————————————————————————————————————————————————————————————————————— 在大 ...
- XP环境下的网络证书问题
项目过程中,由于是收银系统需要从服务器获取支付二维码,会产生SSL连接的问题,在win7.win10上都没有问题,放到WIN XP上出现了The underlying connection was c ...
- 同一局域网环境下的arp欺骗和中间人攻击(mac)
最近读了一篇有关arp欺骗和中间人攻击的文章,于是乎就想着自己实现一下,顺便验证下微信在回话劫持后的安全性. 1.本机环境 Macbook Air:OS X 10.11 El Captain 2.推荐 ...
- 开发环境下的 Kubernetes 容器网络演进之路
马蜂窝技术原创文章,更多干货请搜索公众号:mfwtech 使用 Docker+Kubernetes 来简化开发人员的工作流,使应用更加快速地迭代,缩短发布周期,在很多研发团队中已经是常见的做法. 如果 ...
- 理解 Linux 网络栈(3):QEMU/KVM + VxLAN 环境下的 Segmentation Offloading 技术(发送端)
本系列文章总结 Linux 网络栈,包括: (1)Linux 网络协议栈总结 (2)非虚拟化Linux环境中的网络分段卸载技术 GSO/TSO/UFO/LRO/GRO (3)QEMU/KVM + Vx ...
随机推荐
- 【题解】[HAOI2018]染色(NTT+容斥/二项式反演)
[题解][HAOI2018]染色(NTT+容斥/二项式反演) 可以直接写出式子: \[ f(x)={m \choose x}n!{(\dfrac 1 {(Sx)!})}^x(m-x)^{n-Sx}\d ...
- 如何根据HttpServletRequets获取用户真实IP地址
最近的一个项目的某个功能获取用户的ip地址,添加用户的系统使用记录. 我发现当我直接使用getRemoteAddr()方法从HttpServletRequet中获取用户的ip时,获取到的是服务器的ip ...
- 人生苦短,我用Python(6)
1.分隔.合并字符串 分隔字符串是把字符串分隔为列表,而合并字符串是把列表合并为字符串,分割字符串和合并字符串可以看作是互逆操作. (1)分隔字符串 字符串对象得split()方法可以实现字符串分隔, ...
- 解决httpclient设置代理ip之后请求无响应的问题
httpclient这个工具类对于大家来说应该都不陌生吧,最近在使用过程中出现了碰到一个棘手的问题,当请求的接口地址由http变成https之后,程序执行到 httpClient.execute(ht ...
- 小技巧(2) 查询自己博客的SEO(如果违规,请先提醒)
今天,教大家查看自己博客的SEO. 首先,上网站http://seo.chinaz.com/ 接着,在网页输入框中输入自己博客地址(带后面路径,不是cnblogs.com这样的,类似https://w ...
- ArcGIS Server for JavaScript 3.3 的安装部署
一.安装包下载 首先从官网下载ArcGIS API for JavaScript 3.3 的API和SDK,地址:http://support.esrichina.com.cn/2011/0223/9 ...
- 全流程开发 TP6.0实战高并发电商服务系统*完
在TP6框架中我们可以学到TP整体知识,如下图一所示: 图一:TP6整体知识点 这些内容都会在实战课程中一一涵盖,并且在课程中我们会用到五层架构思想(如图二),和传统的MVC架构有所不一样,这样做可以 ...
- 客户端访问windows server2016 服务器共享 速度慢
客户端(windows10)敲完地址后,要过很久才会谈出窗口. 所有的客户端都出现过此现象. 解决:关闭server的 Smb1.0
- 【C_Language】---最全面的C指针总结,初级程序员必备
好久没写博客了,重新学习C语言了的基础课程,发现很多东西都忘记的差不多了,闲来无事,总结一下关于指针的知识,希望能帮到像我一样的菜鸟们: 指针,众所周知是C语言的精华所在,不懂指针的话,你就不要说你学 ...
- Go 每日一库之 viper
简介 上一篇文章介绍 cobra 的时候提到了 viper,今天我们就来介绍一下这个库. viper 是一个配置解决方案,拥有丰富的特性: 支持 JSON/TOML/YAML/HCL/envfile/ ...