大家都知道,k8s中的服务(service)是对k8s中的deployment等对象的一个一致访问点.所以service会有一个vip(headless service没有).无论是普通service的vip或者headless service的pod ip其实都是k8s集群中的内部ip,在集群内访问它是非常容易的.比如有一个service叫nginx,我们在集群内的另一个pod里既可以对这个nginx service的vip进行get访问,也可以通过coredns对这个nginx service的域名如(nginx, nginx.default等)进行访问.但是在集群外呢?这就麻烦了.
常见的集群外访问service的方式大致分为 LoadBalance, NodePort, ExternalIp等方式, 再细致一点也可以通过Ingress在7层做一层分发再外接上述流量接入,甚至你可以直接将api server做proxy. 很显然的,这些方式如果在我们只是需要对服务进行调试或者随便用用的场景都是要么太复杂(Ingress), 要么花钱(LoadBanlence),要么不靠谱(NodePort).
这时候你会说,嗷,我们可以使用kubectl port-forward 功能,将service的端口port-forward到本地端口.对,没错,这确实是一个不错的解决方式,但这仍然存在非常多的问题。
比如,我们并不想要将nginx service的80端口port-forward到我的8080端口上,就想用80端口,那么如果有两个service分别叫nginx1和nginx2,这不就没法弄了吗?再比如,如果我们port-forward的svc的pod发生了变动,怎么办?再比如,我们就是想像在集群内一样,通过service的内部域名对其访问(nginx, nginx.default等),怎么办?再比如,如果我们有100个服务,难道我们要手动对每个服务port-forward然后手动选择一个没用过的端口吗?甚至,当我们的服务创建,删除,我们又得手动操作,这是何等的麻烦?
基于上述问题,一个叫kubefwd的工具出现了。
继续阅读“使用kubefwd对k8s中的service进行本地化调试”