51mee - AI智能招聘平台Logo
模拟面试题目大全招聘中心会员专区

在Kubernetes集群中部署一个高可用的微服务应用,请说明如何配置服务发现、负载均衡、自动扩缩容,以及如何处理应用故障(如Pod重启、节点故障)。

新凯来算法技术工程师难度:困难

答案

1) 【一句话结论】在Kubernetes中,通过Service(如ClusterIP)实现服务发现与负载均衡,结合Deployment管理Pod副本,配置Horizontal Pod Autoscaler(HPA)自动扩缩容,并利用liveness/readiness探针结合健康检查机制处理应用故障(如Pod重启、节点故障),确保高可用。

2) 【原理/概念讲解】
Service是K8s的服务发现与负载均衡机制,为应用提供稳定的网络标识(ClusterIP),通过选择器关联Pod,实现请求的负载均衡(默认轮询)。Deployment是声明式控制器,管理Pod的创建、更新和删除,确保副本数符合期望。Horizontal Pod Autoscaler(HPA)根据指标(如CPU使用率)自动调整Deployment的副本数。健康检查(liveness probe用于重启不健康Pod,readiness probe用于决定Pod是否加入服务)通过探针(如HTTP请求、TCP连接、exec命令)判断Pod状态,确保只有健康的Pod参与负载。
类比:Service像“路由器”,把请求分发到后端的Pod;Deployment像“自动扩容的团队管理者”,根据需求增减团队成员;HPA像“自动调节的阀门”,根据流量大小调整团队规模;健康检查像团队的“体检”,确保成员健康才能工作。

3) 【对比与适用场景】

  • Service类型对比(ClusterIP、NodePort、LoadBalancer):
    | 类型 | 定义 | 特性 | 使用场景 | 注意点 |
    |---------------|--------------------------|--------------------------|------------------------------|----------------------------|
    | ClusterIP | 仅集群内可达的虚拟IP | 内部负载均衡 | 集群内服务调用 | 需要Ingress或NodePort暴露 |
    | NodePort | 在每个Node的特定端口暴露 | 集群外访问(Node IP+Port)| 需要外部访问的内部服务 | 端口冲突风险 |
    | LoadBalancer | 云服务商的负载均衡器 | 集群外访问(云LB) | 云环境下的外部访问 | 依赖云服务商的LB资源 |

  • HPA触发指标对比:
    | 指标类型 | 定义 | 特性 | 使用场景 | 注意点 |
    |----------------|--------------------------|--------------------------|------------------------------|----------------------------|
    | CPU | Pod的CPU使用率 | 标准指标,易获取 | CPU密集型应用 | 需合理设置阈值(如80%) |
    | Memory | Pod的内存使用率 | 内存敏感型应用 | 内存密集型应用 | 需监控内存压力 |
    | Custom Metric | 自定义指标(如QPS) | 需Prometheus等监控 | 对QPS有严格要求的系统 | 配置复杂,需额外组件 |

4) 【示例】(以Nginx Web服务为例,YAML配置):

  • Deployment(管理Pod副本与探针):
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        image: nginx:1.19
        ports:
        - containerPort: 80
        livenessProbe:
          httpGet:
            path: /healthz
            port: 80
          initialDelaySeconds: 30
          periodSeconds: 10
          timeoutSeconds: 5
        readinessProbe:
          httpGet:
            path: /ready
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 5
          timeoutSeconds: 2
  • Service(服务发现与负载均衡):
apiVersion: v1
kind: Service
metadata:
  name: my-app-service
spec:
  selector:
    app: my-app
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  type: ClusterIP
  • HPA(自动扩缩容):
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: my-app-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-app-deployment
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70

5) 【面试口播版答案】
在Kubernetes中部署高可用微服务,核心是通过Service实现服务发现与负载均衡,用Deployment管理Pod副本,结合HPA自动扩缩容,并配置健康检查处理故障。具体来说,首先创建一个Deployment,定义Pod的副本数(如3个),并配置liveness和readiness探针,确保只有健康的Pod参与服务。然后创建Service(ClusterIP类型),通过选择器关联Deployment,实现请求的负载均衡。接着配置HPA,根据CPU使用率(如70%阈值)自动调整Deployment的副本数,当流量增加时自动扩容,减少时自动缩容。对于故障处理,liveness探针会定期检查Pod的健康状态,如果Pod不健康(如超时),会重启Pod;readiness探针用于判断Pod是否准备好接收流量,如果Pod不健康,Service会暂时移除该Pod,避免将请求发送到不健康的实例。当节点故障时,K8s会自动将故障节点上的Pod重新调度到其他健康节点,同时HPA会根据剩余节点的负载情况调整副本数,确保服务持续可用。

6) 【追问清单】

  • 问:Service的ClusterIP和NodePort有什么区别?什么时候用NodePort?
    回答要点:ClusterIP仅集群内可达,NodePort在Node的固定端口暴露,用于集群外访问,适合需要外部访问的内部服务,但需注意端口冲突风险。

  • 问:HPA的CPU利用率阈值如何设置?为什么不是100%?
    回答要点:设置合理阈值(如70-80%),避免过度扩容或缩容,考虑资源利用率波动,确保系统稳定。

  • 问:健康检查的liveness和readiness探针有什么区别?为什么都需要?
    回答要点:liveness用于重启不健康Pod,防止服务崩溃;readiness用于决定Pod是否加入服务,确保请求发送到健康实例。

  • 问:节点故障时,Pod的重新调度如何影响服务可用性?如何优化?
    回答要点:K8s自动重新调度,但可能短暂中断,可通过增加副本数(如n+1)或使用云服务商的自动伸缩组优化。

  • 问:如果应用有状态,如何处理服务发现和故障恢复?
    回答要点:对于有状态应用,可能需要StatefulSet,结合持久化存储(如PersistentVolume),并配置故障转移策略(如Raft),确保数据一致性和服务可用性。

7) 【常见坑/雷区】

  • 健康检查配置错误:liveness探针超时时间过短导致正常Pod被误判,频繁重启;readiness探针超时时间过长导致不健康Pod长时间参与服务。
  • HPA阈值设置不当:CPU利用率阈值过高(如90%)导致扩容延迟,阈值过低(如30%)导致过度扩容,资源浪费。
  • Service类型选择错误:使用ClusterIP但需要外部访问,未配置NodePort或Ingress,导致无法从外部访问服务。
  • 探针路径错误:健康检查的路径(如/healthz)未在应用中正确实现,导致探针返回失败,Pod被标记为不健康。
  • 节点故障时的资源限制:节点资源不足导致重新调度失败,需检查节点资源配额和云服务商的节点池配置。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1