陈同学
微服务
Accelerator
About
# 开发者本机如何访问 K8s Service? 在开发测试中,开发人员经常需要直接访问某些服务,如Redis、DB等,本文分享开发者在本机如何访问K8s Service。 ## 场景 > Versions:K8s v1.16.3、CentOS 7 先举个例子介绍场景,在 default namespaces 下创建 Redis (创建Pod、Deployment,已Deprecated)。 ```bash kubectl run redis --image=redis --port=6379 ``` 虽可通过IP `10.233.90.32` 访问,但变化的IP无法被使用。 ![](https://blog-1256695615.cos.ap-shanghai.myqcloud.com/2020/01/11/3.png) 集群中可通过 Kube-dns 实现服务发现的功能,会为每个 Service 设置一个 `serviceName.namespace.svc.cluster.local` 的 **A记录** 用于解析其 ClusterIP,现将其创建为 Service。 ```bash kubectl expose deployment redis --target-port=6379 --type=NodePort ``` ![](https://blog-1256695615.cos.ap-shanghai.myqcloud.com/2020/01/11/4.png) 根据规则,service 的别名为 `redis.default.svc.cluster.local`,但仅Pod具备DNS解析能力,因此在任何主机都无法直接访问其别名,效果如下: ```bash [root@node1 ~]# ping redis.default.svc.cluster.local ping: redis.default.svc.cluster.local: 未知的名称或服务 ``` run 一个Pod做下测试。 ```bash kubectl run alpine -i --image=alpine --generator=run-pod/v1 ``` 创建 Pod 后,会自动在DNS配置文件 `/etc/resolv.conf` 中添加解析记录。 ```bash [root@node1 ~]# kubectl exec -it alpine cat /etc/resolv.conf nameserver 169.254.25.10 search default.svc.cluster.local svc.cluster.local cluster.local options ndots:5 ``` 下面在 alpine Pod 中 ping 服务别名,可以正常访问。 ![](https://blog-1256695615.cos.ap-shanghai.myqcloud.com/2020/01/11/5.png) **由于服务名称不会乱变,同时Pod内可访问服务别名,因此可将服务别名直接应用到各应用的配置文件中**。 那服务器和开发人员本地如何访问呢?有两种方式: ## 服务器访问svc 为服务器配置DNS可达到目的。 在 `/etc/sysconfig/network-scripts/ifcfg-eth0` 文件最后添加一行(来自任意Pod的 `/etc/resolv.conf`): ``` DNS1=169.254.25.10 ``` 重启network(`service network restart`),此时机器可访问K8s所有服务。 ```bash [root@node1 ~]# ping redis.default.svc.cluster.local PING redis.default.svc.cluster.local (10.233.11.49) 56(84) bytes of data. 64 bytes from redis.default.svc.cluster.local (10.233.11.49): icmp_seq=1 ttl=64 time=0.045 ms ``` 查看机器 `/etc/resolv.conf` 文件(network restart 会自动重新生成),配置的DNS已经刷进去。 ``` [root@node1 ~]# cat /etc/resolv.conf ; generated by /usr/sbin/dhclient-script nameserver 169.254.25.10 ``` 不过主机访问service无实际意义,这里仅做个 demo。 ## 开发者访问 svc 通过在主机上跑一个vpn应用,打通和k8s的网络,开发者通过vpn访问即可。下面运行应用(需生成公私钥,耗时1分钟左右,可看容器日志): ```bash docker run -d --privileged=true -p 1194:1194 \ -v /etc/openvpn:/etc/openvpn \ -e REMOTE_IP=129.211.30.98 \ -e REMOTE_PORT=1194 \ -e K8S_DNS=10.233.0.3 \ --name=vpn \ ccr.ccs.tencentyun.com/easyk8s/k8s-openvpn-pam:1.2 ``` 我基于 [docker-rancher-openvpn-pam](https://github.com/mdnsfr/docker-rancher-openvpn-pam) 做了微调,简化了使用(详见 [GitHub: k8s-openvpn-pam](https://github.com/codercyj/k8s-openvpn-pam)),新镜像 **ccr.ccs.tencentyun.com/easyk8s/k8s-openvpn-pam:1.2** 发布在腾讯,公网可使用。 配置含义如下: * REMOTE_IP、REMOTE_PORT:REMOTE_IP指主机的IP和vpn程序的端口(或暴露在公网的弹性IP都可以),仅用于生成客户端配置文件,无其他实际用户,乱给然后改客户端配置文件也可以。 * K8S_DNS 指K8s中dns service的IP,如下图: ```bash kubectl get svc -n kube-system -o wide ``` 如果担心IP变化,可以用Pod的形式来跑vpn应用,然后DNS配置成 `coredns.kube-system.svc.cluster.local` ![](https://blog-1256695615.cos.ap-shanghai.myqcloud.com/2020/01/11/10.png) **k8s-openvpn-pam** 基于 **openvpn**,运行上面镜像后,在 `/etc/openvpn` 目录有如下文件: ``` -rw-r--r--. 1 root root 20 1月 11 16:41 credentials drwxr-xr-x. 3 root root 4096 1月 11 16:16 easy-rsa -rw-r--r--. 1 root root 485 1月 11 16:41 server.conf ``` * credentials 文件存储了 vpn的账户密码,可执行`docker exec -it vpn vpn_create_user.sh username` 来创建用户。 * easy-rsa 是生成的公私钥信息 * server.conf 是 openvpn 的配置信息 切到容器中执行 `vpn_get_client_config.sh` 可拿到客户端配置(容器日志中也有): ```bash docker exec -it vpn bash root@709f25731f91:/# vpn_get_client_config.sh ``` 去掉首尾的 **"====*"** 保存为 **.ovpn** 结尾的文件,导入到VPN客户端工具中即可。 以工具 Shimo 为例子,将拿到的 client 配置保存为 k8s.ovpn,导入 Shimo。 ![](https://blog-1256695615.cos.ap-shanghai.myqcloud.com/2020/01/11/7.png) 连接VPN后,在我本机就可以访问云服务器上的K8s网络了。 ![](https://blog-1256695615.cos.ap-shanghai.myqcloud.com/2020/01/11/8.png) 如果采用了容器化,但没有使用K8s,可参考 [docker-rancher-openvpn-pam](https://github.com/mdnsfr/docker-rancher-openvpn-pam)。 如果用户认证方式需要支持LDAP、httpbasic等,可参考 [docker-rancher-openvpn](https://github.com/mdnsfr/docker-rancher-openvpn)
本文由
cyj
创作,可自由转载、引用,但需署名作者且注明文章出处。
文章标题:
开发者本机如何访问 K8s Service?
文章链接:
https://chenyongjun.vip/articles/134
扫码或搜索 cyjrun 关注微信公众号, 结伴学习, 一起努力