现状

众所周知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 测试

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐