DigitalOcean Kubernetes负载均衡器多部署共存流量异常求助
我在DigitalOcean Kubernetes集群部署Java/Spring Boot微服务,同时部署Eureka Server和Google hello-app测试环境时遇到问题:配置两个Deployment和一个LoadBalancer Service后,同时部署两者时LoadBalancer流量状态显示0/1,无法连接Droplet;删除任意一个Deployment再重新部署,LoadBalancer即可正常工作。
部署配置
1. hello-deployment-1
apiVersion: apps/v1 kind: Deployment metadata: name: hello-deployment-1 spec: replicas: 1 selector: matchLabels: app: hello-deployment-1 role: metrol-network-service template: metadata: labels: app: hello-deployment-1 role: metrol-network-service spec: containers: - name: hello image: gcr.io/google-samples/hello-app:1.0 ports: - containerPort: 8080 resources: requests: memory: "400Mi" cpu: "200m" limits: memory: "500Mi" cpu: "250m" readinessProbe: httpGet: path: / port: 8080 initialDelaySeconds: 60 periodSeconds: 10 livenessProbe: tcpSocket: port: 8080 initialDelaySeconds: 20 periodSeconds: 10
2. metrol-eureka-server-deployment
apiVersion: apps/v1 kind: Deployment metadata: name: metrol-eureka-server-deployment spec: replicas: 1 selector: matchLabels: app: metrol-eureka-server role: metrol-network-service template: metadata: labels: app: metrol-eureka-server role: metrol-network-service spec: containers: - name: 'metrol-eureka-server' image: crivera3/metrol-eureka-server:0.0.2 ports: - containerPort: 8761 resources: requests: memory: "1000Mi" cpu: "500m" limits: memory: "1100Mi" cpu: "600m" readinessProbe: httpGet: path: /actuator/health port: 8761 initialDelaySeconds: 30 periodSeconds: 10 livenessProbe: tcpSocket: port: 8761 initialDelaySeconds: 20 periodSeconds: 10
LoadBalancer Service配置
apiVersion: v1 kind: Service metadata: name: metrol-network-service annotations: service.beta.kubernetes.io/do-loadbalancer-healthcheck-protocol: "http" service.beta.kubernetes.io/do-loadbalancer-healthcheck-path: "/actuator/health" service.beta.kubernetes.io/do-loadbalancer-healthcheck-port: "8761" spec: externalTrafficPolicy: Local type: LoadBalancer ports: - port: 8761 targetPort: 8761 name: metrol-eureka - port: 8080 targetPort: 8080 name: hello-deployment-1 selector: role: metrol-network-service
节点资源使用情况
同时部署两个Deployment时
| 资源 | 请求值 | 限制值 |
|---|---|---|
| CPU | 1502m (79%) | 850m (44%) |
| 内存 | 2526180480(77%) | 2442294400(74%) |
单独部署一个Deployment时
| 资源 | 请求值 | 限制值 |
|---|---|---|
| CPU | 1302m (68%) | 600m (31%) |
| 内存 | 2106750080(64%) | 1918006400 (58%) |
故障排查与解决方案
核心问题分析
你的LoadBalancer配置了针对8761端口的/actuator/health路径的健康检查,但Service的selector匹配了所有带有role: metrol-network-service标签的Pod——包括hello-app的Pod,而hello-app的Pod并没有暴露8761端口和/actuator/health端点。当两个Deployment同时运行时,DigitalOcean的负载均衡器会尝试对所有匹配到的Pod执行健康检查,hello-app的Pod无法通过检查,导致负载均衡器认为节点不可用(0/1状态)。
具体修复步骤
1. 拆分Service,为每个Deployment单独配置Service
不要让单个LoadBalancer同时代理两个不同的服务,而是分别创建两个LoadBalancer Service,各自匹配对应的Pod标签:
针对Eureka Server的Service:
apiVersion: v1 kind: Service metadata: name: metrol-eureka-service annotations: service.beta.kubernetes.io/do-loadbalancer-healthcheck-protocol: "http" service.beta.kubernetes.io/do-loadbalancer-healthcheck-path: "/actuator/health" service.beta.kubernetes.io/do-loadbalancer-healthcheck-port: "8761" spec: externalTrafficPolicy: Local type: LoadBalancer ports: - port: 8761 targetPort: 8761 name: metrol-eureka selector: app: metrol-eureka-server
针对hello-app的Service:
apiVersion: v1 kind: Service metadata: name: hello-app-service annotations: service.beta.kubernetes.io/do-loadbalancer-healthcheck-protocol: "http" service.beta.kubernetes.io/do-loadbalancer-healthcheck-path: "/" service.beta.kubernetes.io/do-loadbalancer-healthcheck-port: "8080" spec: externalTrafficPolicy: Local type: LoadBalancer ports: - port: 8080 targetPort: 8080 name: hello-app selector: app: hello-deployment-1
这样每个负载均衡器只会检查对应服务的Pod,避免健康检查不匹配的问题。
2. 调整资源配置(可选)
从资源使用数据看,同时部署时CPU请求已达节点的79%,内存请求达77%,接近节点资源上限。如果节点资源不足,可能导致Pod启动缓慢或健康检查超时,可考虑:
- 升级DigitalOcean Droplet的节点规格,增加CPU和内存资源
- 优化Pod的资源请求/限制值,避免资源过度占用
3. 验证健康检查配置
确保每个Service的健康检查配置与对应Pod的端点完全匹配:
- Eureka Server的健康检查路径是
/actuator/health,端口8761,对应Pod的readinessProbe配置 - hello-app的健康检查路径是
/,端口8080,对应Pod的readinessProbe配置
验证方法
- 删除原有的
metrol-network-service - 应用上述两个新的Service配置
- 同时部署两个Deployment
- 查看LoadBalancer的状态,确认流量状态变为1/1(或对应节点数),并测试两个服务的外部访问是否正常
内容的提问来源于stack exchange,提问作者Camilo Rivera

