迁移至Kubernetes后,AP如何通过OpenVPN使用Service名连接FreeRADIUS?
先给你划个重点:K8s内部的Service名称(比如openvpn.default.svc.cluster.local)是靠集群里的CoreDNS解析的,但你的AP作为外部设备,默认碰不到这个DNS服务。所以核心思路要么是让AP连上VPN后能用上K8s的DNS,要么换个方式让AP能定位到OpenVPN服务。
下面是几个按推荐度排序的方案,你可以根据自己的集群情况选:
方案1:通过OpenVPN推送K8s CoreDNS配置(首推)
当AP连上OpenVPN后,让OpenVPN服务器自动给AP下发K8s的DNS地址,这样AP就能直接解析集群内的所有Service名称了,一步到位。具体操作:
- 先拿到CoreDNS的ClusterIP:在K8s节点上执行
kubectl get service coredns -n kube-system,会得到类似10.96.0.10的IP,记下来。 - 修改OpenVPN服务器的配置文件(一般叫
server.conf),添加一行:
把这里的IP换成你刚才拿到的CoreDNS实际地址即可。push "dhcp-option DNS 10.96.0.10" - 重启OpenVPN服务——如果是在K8s里部署的OpenVPN,就执行
kubectl rollout restart deployment openvpn重启对应的Deployment。 - 等AP重新连上VPN,它会自动获取这个DNS配置,这时候不管是OpenVPN的Service名,还是FreeRADIUS的Service名,都能直接解析访问,完全不用改AP的其他配置。
这个方案的好处是一劳永逸,扩展性拉满,后续加其他服务也不用额外折腾AP。
方案2:把OpenVPN Service暴露成NodePort/LoadBalancer,用外部地址连接
要是不想折腾DNS,最简单粗暴的方式就是把OpenVPN服务暴露成外部能直接访问的地址,AP直接用这个地址连接就行:
- NodePort模式:修改OpenVPN的Service配置,把
type改成NodePort,K8s会在每个集群节点上分配一个端口,AP用节点IP:分配的端口就能连上OpenVPN。 - LoadBalancer模式:如果你的集群是在云厂商上运行(比如AWS、阿里云),把Service的
type改成LoadBalancer,云厂商会自动分配一个公网IP,AP直接用这个IP连接即可。
这个方案的优点是配置简单,不用碰AP的任何设置;缺点是没法直接用Service名称,不过NodePort/LoadBalancer的地址一般都比较稳定,除非集群节点大规模变动。
方案3:在AP本地加Hosts映射(适合小集群)
如果你的集群规模很小,Service的ClusterIP基本不会变化,可以直接在AP的本地hosts文件里加个静态映射:
- 先拿到OpenVPN Service的ClusterIP:执行
kubectl get service openvpn,查看CLUSTER-IP列的地址。 - 在AP的hosts文件里添加一行:
IP换成你刚才拿到的OpenVPN ClusterIP,域名根据你的Service所在Namespace调整(比如如果OpenVPN在10.xx.xx.xx openvpn.default.svc.cluster.localvpn命名空间,就是openvpn.vpn.svc.cluster.local)。
这个方案的缺点是维护麻烦,要是哪天Service的ClusterIP变动(比如重启Service、K8s升级),你得手动修改所有AP的hosts文件,只适合小场景使用。
方案4:用Ingress暴露OpenVPN(需要Ingress支持TCP/UDP)
如果你的集群已经在用支持TCP/UDP转发的Ingress Controller(比如Nginx Ingress),可以用Ingress来统一管理OpenVPN的外部访问:
- 配置Ingress Controller的TCP/UDP端口映射,比如Nginx Ingress需要修改它的ConfigMap:
这里apiVersion: v1 kind: ConfigMap metadata: name: nginx-ingress-tcp-udp namespace: kube-system data: udp-services: | 1194: default/openvpn:11941194是OpenVPN默认的UDP端口,default/openvpn是你的OpenVPN Service的命名空间和名称。 - 之后AP就可以用Ingress的域名(比如
vpn.yourdomain.com)来连接OpenVPN,这个域名是外部可解析的,Ingress会自动把流量转发到内部的OpenVPN Service。
这个方案适合已经有Ingress Controller的场景,能统一管理所有外部访问入口,但需要额外配置Ingress的TCP/UDP规则。
内容的提问来源于stack exchange,提问作者user3069488

