如何将本地k3d Kubernetes集群中运行的应用暴露至本地机器?
我在本地k3d Kubernetes集群部署了一个带Helm Chart的项目,所有部署操作都正常完成,但服务使用ClusterIP仅能集群内部访问,想在本地浏览器打开应用,需要通过NodePort或LoadBalancer实现外部访问,求具体操作步骤。
已完成的正常操作:
# 构建Docker镜像 # 导航至根目录 -> ./ProtoClusterTutorial docker build . -t proto-cluster-tutorial:1.0.0 # 导航至根目录 docker build -f ./SmartBulbSimulatorApp/Dockerfile . -t smart-bulb-simulator:1.0.0 # 将Docker镜像推送至Docker Hub docker tag proto-cluster-tutorial:1.0.0 hulkstance/proto-cluster-tutorial:1.0.0 docker push hulkstance/proto-cluster-tutorial:1.0.0 docker tag smart-bulb-simulator:1.0.0 hulkstance/smart-bulb-simulator:1.0.0 docker push hulkstance/smart-bulb-simulator:1.0.0 # 列出Docker镜像 docker images # 创建k3d集群(修复集群不可达错误后执行) k3d cluster create two-node-cluster --agents 2 # 切换集群上下文 kubectl config use-context k3d-two-node-cluster # 部署应用 helm install proto-cluster-tutorial chart-tutorial helm install simulator chart-tutorial --values .\simulator-values.yaml # 验证运行状态 kubectl get pods kubectl logs proto-cluster-tutorial-78b5db564c-jrz26
方案一:用NodePort暴露服务
NodePort会在集群所有节点上开放一个固定端口,将外部流量转发到目标服务。
操作步骤:
修改Helm配置文件
找到对应服务的values.yaml(或simulator专用的simulator-values.yaml),把服务类型改成NodePort,可指定端口(不指定则从30000-32767范围随机分配):service: type: NodePort # 可选:指定固定NodePort,比如30080 nodePort: 30080两个服务(proto-cluster-tutorial和simulator)需要分别修改对应配置文件。
重新部署应用
helm upgrade proto-cluster-tutorial chart-tutorial -f ./values.yaml helm upgrade simulator chart-tutorial -f ./simulator-values.yaml获取NodePort端口
执行命令查看服务详情:kubectl get svc在输出的
NODEPORT列找到对应端口,比如30080:80/TCP。本地访问
k3d默认会把NodePort映射到本地localhost,直接访问http://localhost:<NODEPORT>即可。
方案二:用LoadBalancer暴露服务(k3d专属)
k3d内置Traefik作为Ingress Controller,支持LoadBalancer类型服务,会自动把服务端口映射到本地主机。
操作步骤:
修改Helm配置文件
把服务类型改成LoadBalancer:service: type: LoadBalancer重新部署应用
helm upgrade proto-cluster-tutorial chart-tutorial -f ./values.yaml helm upgrade simulator chart-tutorial -f ./simulator-values.yaml获取外部访问地址
执行命令查看服务:kubectl get svc输出的
EXTERNAL-IP列会显示localhost,结合PORT(S)列的端口,直接访问http://localhost:<端口号>即可(如果端口是80,直接访问http://localhost)。
进阶:创建集群时提前映射端口
如果想提前固定本地映射端口,创建集群时可以指定:
k3d cluster create two-node-cluster --agents 2 -p "8080:80@loadbalancer" -p "8443:443@loadbalancer"
这样集群的80/443端口会映射到本地8080/8443,后续部署LoadBalancer服务时直接访问http://localhost:8080即可。
内容的提问来源于stack exchange,提问作者nop

