让我们笔记本畅游k8s内部网络吧 - kubernees ocserv 搭建
现状众所周知k8s 内部存在两种私有网络,1 pod的扁平网络,2 虚拟的service网络。 然而我们外部用户是不能直接访问,如果访问只能用service nodePort或者ingress发布出来。痛点开发人员有时候需要直接访问pod用于验证问题,如果每个后端服务都用service NodePort 不太方便,再有就是系统管理员排查问题也不方便解决办法如果通过vpn能直接访问k8s 的Pod
现状
众所周知k8s 内部存在两种私有网络,1 pod的扁平网络,2 虚拟的service网络。 然而我们外部用户是不能直接访问,如果访问只能用service nodePort或者ingress发布出来。
痛点
开发人员有时候需要直接访问pod用于验证问题,如果每个后端服务都用service NodePort 不太方便,再有就是系统管理员排查问题也不方便
解决办法
如果通过vpn能直接访问k8s 的Pod 和 Service两个网络以上问题就能非常好的解决。
汤坑
- 第一次我docker方式直接部署ocserv到k8s集群,部署后能够实现但是极其不稳定。并且删掉服务后,导致 kubectl exec 到特定node(部署过ocserv的node)直接夯筑,偷鸡不成蚀把米。这个问题找了好久最后发现是 部署ocserv的时候用了privilege权限,服务直接修改主机的iptables, 后来把两条策略删掉好了。 稍后贴出配置
- 目前市面上已有这种方式的解决方案,例如openvpn 可以直接通过helm部署到k8s内部,由于上一次的问题,我不想把vpn部署到集群内部,担心再出现其他诡异问题。
实现
实现思路,找一台和worker节点同网段的服务器部署ocserv服务,在该服务器上添加路由使其能访问k8s的podIP和serviceIP。vpn 客户端接入即可访问k8s 的podip 和 serviceip
实验介绍
wokerip: 192.168.56.102
Pod NET: 10.96.0.0/12
Service Net: 10.244.0.0/16
ocserv服务器ip 192.168.56.104
部署 ocserv
yum install epel-release -y
yum install ocserv
编辑配置文件/etc/ocserv/ocserv.conf 以下是主要的配置,参见配置修改成自己的配置
default-domain = svc.cluster.local ## dns 搜索后缀,如果想让客户端能直接访问固定的命名空间例如 test 可以配置为 test.svc.cluster.local , cluster.local 是部署k8s 指定的如果你修改过需要改成自己的
auth = "plain[/etc/ocserv/ocpasswd]"
tcp-port = 8443
udp-port = 8443
# 登录 VPN 后分配的地址
ipv4-network = 192.168.99.0
ipv4-netmask = 255.255.255.0
## 配置k8s coredns的serviceip
dns = 10.96.0.10
# 内网的网段
route = 10.244.0.0/16 ## pod net route 这些会在客户端路由生效 route print 可查看
route = 10.96.0.0/12 ## service net route 这些会在客户端路由生效 route print 可查看
route = 192.168.56.0/24
创建账号,并输入密码
ocpasswd -c /etc/ocserv/ocpasswd ocuser
启动ocserver
service ocserv start
配置路由(ocserv服务器)
ocserv 启动后需要配置两种路由,1 vpn客户端访问其他地址需要做snat, 并且启用vpn网卡转发 2 需要配置ocserv服务器访问 pod ip 和 service ip 的路由
如下1
## enp0s8 是ocserv服务器的网卡
iptables -t nat -A POSTROUTING -s 192.168.99.0/24 -o enp0s8 -j MASQUERADE
## vpns 是ocserv vpn的虚拟网卡,如果你改了这个名称这个也需要改
iptables -A FORWARD -o vpns0 -j ACCEPT
iptables -A FORWARD -i vpns0 -j ACCEPT
如下2
## pod 网段 路由 192.168.56.102 是k8s 其中一个worker节点,master节点也可以,建议还是用worker
route add -net 10.244.0.0/16 gw 192.168.56.102
## service 网段路由
route add -net 10.96.0.0/12 gw 192.168.56.102
客户端链接
客户端windows选用思科的
easyconnect
需要修改配置 设置(左下角扳手) -> preferences -> 取消 Block connections to untrusted servers
输入vpn地址,我的是 192.168.56.104:8443 ,输入用户名密码
验证
1 cmd执行 ipconfig /all 查看ip 和dns 以及 dns后缀是否生效
2 通过kubeclt 找一个 podip 在客户端直接ping一下,看是否能通(k8s serviceip 是虚拟ip ping不通的
)
3 直接通过podip 和端口访问服务
4 通过serviceIP访问服务
5 如果你的ocserv.conf 的default.domain配置了namespace后缀 例如test.svc.cluster.local
那么可以直接访问 test 命名空间的servcie name 例如 test namespace 下有一个service : aaaa-nginx , 可以直接通过浏览器访问 http://aaaa-nginx
6 如果你ocserv 没有配置dns后缀(ocserv 配置文件),可以通过修改本机vpn网卡的dns实现直接访问servicename
修改方式如下:
win10 系统设置(win+x -> 设置)-》 网络和internet -》 更改适配器选项-》Cisco AnyConnect Secure 网卡右击-》 属性 -》internet 协议版本4 双击-》高级(右下角)-》 DNS(上面中间)
在“附件这些DNS后缀” 添加或者修改 dns后缀, 例如想要访问 test命名空间下的服务,添加或者修改成:test.svc.cluster.local dns后缀,保存退出 -》 直接访问 http://aaaa-nginx 测试
更多推荐
所有评论(0)