使用K8s YAML部署Spring Boot应用无法访问,与命令行结果不一致
问题分析与解决方案
嘿,我一眼就发现问题所在了——你的Service和Pod之间没有建立关联,导致外部请求的流量无法转发到对应的Pod上,自然访问不到应用。
为什么命令行部署能正常工作?
当你用kubectl run创建Deployment时,K8s会自动给生成的Pod打上类似run: gearbox-rack-eureka-server的标签;紧接着kubectl expose命令会自动识别这个标签,并将其作为Service的selector配置,这样Service就能精准找到要转发流量的Pod,所以访问正常。
你的YAML配置哪里错了?
看你的配置文件:
- Pod的
metadata.labels是purpose: platform_eureka_demo - 但Service的
spec里完全没有selector字段——K8s根本不知道这个Service要把流量发给哪些Pod,相当于Service是“孤立”的,没有绑定任何后端Pod。
修正方案
1. 修改Service的YAML(eureka_svc.yaml)
给Service加上selector字段,匹配Pod的标签:
apiVersion: v1 kind: Service metadata: name: gearbox-rack-eureka-server labels: name: gearbox_rack_eureka_server spec: type: NodePort selector: purpose: platform_eureka_demo # 这里必须和Pod的labels完全匹配 ports: - port: 8761 nodePort: 31501 name: tcp targetPort: 8761 # 明确指定容器端口,增强可读性(和containerPort一致)
2. (可选但推荐)用Deployment替代直接创建Pod
直接创建Pod的话,一旦Pod意外挂掉,K8s不会自动重启它。换成Deployment能保证应用的高可用性:
把原来的eureka_pod.yaml改成Deployment配置:
apiVersion: apps/v1 kind: Deployment metadata: name: gearbox-rack-eureka-server spec: replicas: 1 # 保持1个副本 selector: matchLabels: purpose: platform_eureka_demo template: metadata: labels: purpose: platform_eureka_demo spec: containers: - name: gearbox-rack-eureka-server image: 192.168.1.229:5000/gearboxrack/gearbox-rack-eureka-server ports: - containerPort: 8761
操作步骤
- 先删除之前创建的Pod和Service:
kubectl delete pod gearbox-rack-eureka-server kubectl delete svc gearbox-rack-eureka-server
- 重新应用修正后的配置:
# 如果用Deployment的话执行这个 kubectl apply -f eureka_deployment.yaml # 再执行Service的配置 kubectl apply -f eureka_svc.yaml
- 检查关联状态:
执行kubectl describe svc gearbox-rack-eureka-server,在Endpoints字段里应该能看到Pod的IP,说明关联成功了,此时再访问172.16.100.83:31501就能正常打开应用了。
内容的提问来源于stack exchange,提问作者user84592
相关产品推荐
相关产品推荐

