如何将Kubernetes Pod的9090端口暴露至本地VM实现跨VM访问?
问题解答
让第二台VM访问第一台VM中Pod的几种方法
1. 把Service改成NodePort类型(持久化方案)
这是最常用的持久化暴露方式,能将Pod的端口映射到第一台VM(集群节点)的端口上。
- 修改现有Service的
spec.type为NodePort,还可指定nodePort字段固定端口(不指定的话,K8s会自动分配30000-32767之间的端口) - 修改后的Service配置示例:
apiVersion: v1 kind: Service metadata: creationTimestamp: "2023-06-09T06:21:57Z" labels: app.kubernetes.io/name: myapp service-type: public name: myapp namespace: myapp ownerReferences: - apiVersion: core.opni.io/v1beta1 blockOwnerDeletion: true controller: true kind: Gateway name: myapp uid: 5cf052fb-31cb-43b4-8b3c-264a4d2240ce resourceVersion: "371786" uid: 95a07669-fe15-40a2-9614-21d33475a54b spec: clusterIP: 10.43.66.183 clusterIPs: - 10.43.66.183 internalTrafficPolicy: Cluster ipFamilies: - IPv4 ipFamilyPolicy: SingleStack ports: - name: grpc port: 9090 protocol: TCP targetPort: grpc nodePort: 9090 # 固定映射到VM的9090端口,需确保该端口未被占用 - name: noauth port: 4000 protocol: TCP targetPort: noauth selector: app.kubernetes.io/name: myapp sessionAffinity: None type: NodePort # 这里改为NodePort status: loadBalancer: {}
- 执行命令更新Service:
kubectl apply -f <修改后的yaml文件> -n myapp - 完成后第二台VM就能通过
第一台VM的IP:9090访问Pod的gRPC服务。
2. 用kubectl port-forward临时转发(测试用)
如果只是临时需要访问,不用修改配置,直接运行端口转发命令:
kubectl port-forward service/myapp 9090:9090 -n myapp --address 0.0.0.0
--address 0.0.0.0允许外部VM访问,默认仅允许本地连接- 该命令需保持运行状态,关闭后端口转发即停止,适合临时调试场景。
3. 改用LoadBalancer类型Service(需集群支持)
如果你的K8s集群配有负载均衡组件(比如本地环境用MetalLB),可以把Service改成LoadBalancer类型,集群会自动分配一个可访问的IP,第二台VM直接用这个IP:9090访问即可。不过本地VM集群用NodePort方案更直接。
能否将应用暴露在nodeIP:9090?
可以,但需要满足两个条件:
- 第一台VM的9090端口未被其他程序占用
- 修改Service为NodePort时,显式设置
nodePort: 9090(如上面的配置示例)
注意:K8s默认NodePort的端口范围是30000-32767,若要使用9090这类低于30000的端口,需修改Kube-apiserver和Kube-proxy的配置,调整--service-node-port-range参数(例如改为1-65535),然后重启相关组件。如果不想修改集群配置,建议使用默认范围内的端口,或用port-forward临时映射到9090。
内容的提问来源于stack exchange,提问作者Kristian Zhelyazkov
相关产品推荐
相关产品推荐

