Kubernetes:如何在本地访问服务(非节点)及代理方法咨询
嘿,针对你在Docker for Mac(Edge)环境下的需求,我整理了几种靠谱的方法,都能支持服务扩缩容后的流量分发,不用再纠结单个Pod的访问:
首先先澄清个小细节:你说执行了kubectl expose deployment hello-nginx --type=NodePort,但kubectl get services里显示的rolling-sponge-hello-world是ClusterIP类型——要么是你暴露的服务名字不是这个,要么是命令执行后服务状态还没更新?先执行kubectl get service hello-nginx确认下这个服务的类型是不是NodePort,这会影响后续的访问方式。
下面是具体的访问方法:
方法1:通过NodePort直接访问本地主机
如果你的hello-nginx服务确实是NodePort类型,Docker for Mac会自动把集群的NodePort映射到本地,操作很简单:
- 先拿到服务的NodePort端口:
kubectl get service hello-nginx -o jsonpath='{.spec.ports[0].nodePort}' - 直接在本地用浏览器或curl访问
http://localhost:<刚才拿到的NodePort>就行,流量会自动通过服务分发到所有Pod,扩缩容后也不用改配置。
方法2:用kubectl proxy代理集群API
这个方法不需要依赖NodePort,直接通过Kubernetes API来访问服务:
- 打开一个终端启动代理:
别关掉这个终端,保持代理运行。kubectl proxy - 另开一个终端访问服务(默认命名空间的情况):
要是你的服务在其他命名空间,把curl http://localhost:8001/api/v1/namespaces/default/services/hello-nginx:80/proxy/default换成对应的命名空间就行。这个方式也能自动分发流量到所有Pod。
方法3:port-forward直接代理服务(而非单个Pod)
你之前用的kubectl port-forward hello-nginx 8080:80如果是指向单个Pod的话,确实只能访问那一个Pod;但只要改成代理服务本身,就能支持扩缩容:
kubectl port-forward service/hello-nginx 8080:80
然后访问http://localhost:8080,此时所有请求都会通过Kubernetes服务的负载均衡规则分发到后端的Pod,不管你扩到多少个Pod都没问题——这个方法是完全正确的,你之前的思路方向对,只是要明确指定代理的是service/hello-nginx而不是单个Pod。
最后补个小提示:如果你的hello-nginx服务还是ClusterIP类型,重新执行下暴露命令,明确指定参数:
kubectl expose deployment hello-nginx --type=NodePort --port=80 --target-port=80
这样就能确保服务变成NodePort类型啦。
内容的提问来源于stack exchange,提问作者Chris G.

