K8s Playground中通过Service暴露httpd Deployment后无法访问
问题描述
- 集群环境:基于Play with Kubernetes搭建,包含1个master节点(node2)、2个worker节点;部署了4个运行httpd镜像的Pod,每个worker节点运行2个
- 资源配置:
- Deployment:指定
containerPort: 77,期望副本数4(当前YAML中replicas设为2,需调整) - NodePort Service:暴露端口
nodePort: 31399,port: 80,targetPort: 77,与Deployment的containerPort匹配(选择非80端口用于验证Service对非标准端口的支持)
- Deployment:指定
- 异常现象:外部通过
curl 192.168.0.23:31399访问worker节点时,返回failed to connect, connection refused;尝试port-forward、kubectl proxy均无法正常访问Pod服务 - 疑问:Kubernetes Service是否仅支持标准80端口?
问题分析与解决
Service完全支持非标准端口,你的访问失败并非端口类型限制导致,核心问题是容器内的httpd服务并未监听你指定的77端口。
关键原因
Deployment中配置的containerPort: 77仅为Kubernetes用于标识Pod暴露端口的元数据,不会修改容器内服务的实际监听配置。httpd官方镜像默认监听80端口,因此即使Service将流量转发到77端口,容器内无对应服务响应,必然出现连接拒绝。
修复步骤
调整Deployment,让httpd监听77端口
通过容器启动命令指定httpd的监听端口,修改后的Deployment YAML如下:apiVersion: apps/v1 kind: Deployment metadata: creationTimestamp: null labels: app: d name: d spec: replicas: 4 selector: matchLabels: app: d strategy: {} template: metadata: creationTimestamp: null labels: app: d spec: containers: - image: httpd name: httpd command: ["httpd-foreground", "-p", "77"] ports: - containerPort: 77验证容器内端口监听状态
进入任意Pod执行以下命令,确认httpd进程已监听77端口:kubectl exec -it <你的Pod名称> -- netstat -tulpn正常输出应包含
httpd进程对应0.0.0.0:77的监听记录。重新测试访问
等待Deployment滚动更新完成后,再次执行curl 192.168.0.23:31399,即可正常获取httpd默认页面。
补充说明
- 若无需使用非标准端口,也可将Deployment的
containerPort和Service的targetPort均改为80,无需修改容器启动命令即可正常访问。 - NodePort的默认可用范围为30000-32767,你使用的31399属于合法范围,无配置问题。
内容的提问来源于stack exchange,提问作者ERJAN
相关产品推荐
相关产品推荐

