You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DigitalOcean Kubernetes负载均衡器多部署共存流量异常求助

排查DigitalOcean Kubernetes中多Deployment共享LoadBalancer时的健康检查失败问题

我在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时

资源请求值限制值
CPU1502m (79%)850m (44%)
内存2526180480(77%)2442294400(74%)

单独部署一个Deployment时

资源请求值限制值
CPU1302m (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配置

验证方法

  1. 删除原有的metrol-network-service
  2. 应用上述两个新的Service配置
  3. 同时部署两个Deployment
  4. 查看LoadBalancer的状态,确认流量状态变为1/1(或对应节点数),并测试两个服务的外部访问是否正常

内容的提问来源于stack exchange,提问作者Camilo Rivera

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 11:44:56