MST

星途 面试题库

面试题:微服务架构下如何通过服务编排提升单个微服务的可用性

在微服务架构中,阐述一种常见的服务编排工具(如Kubernetes)是如何针对单个微服务实现高可用性保障的,包括但不限于故障检测、自动重启、副本管理等方面。
29.1万 热度难度
后端开发微服务架构

知识考点

AI 面试

面试题答案

一键面试

1. 故障检测

  • Kubernetes 探针机制:Kubernetes 提供了三种类型的探针来检测容器(微服务实例)的健康状态,分别为存活探针(livenessProbe)、就绪探针(readinessProbe)和启动探针(startupProbe)。
    • 存活探针:用于判断容器是否正在运行。如果存活探针检测失败,Kubernetes 会自动重启该容器。例如,可以通过 HTTP 方式检查微服务的健康检查接口,若接口返回 200 则表示容器存活,否则判定为故障。示例配置如下:
apiVersion: v1
kind: Pod
metadata:
  name: my - app - pod
spec:
  containers:
  - name: my - app - container
    image: my - app - image
    livenessProbe:
      httpGet:
        path: /healthz
        port: 8080
      initialDelaySeconds: 30
      periodSeconds: 10
- **就绪探针**:判断容器是否准备好接收流量。只有当就绪探针成功时,该容器对应的 Pod 才会被添加到 Service 的端点列表中,从而接收用户请求。例如,同样通过 HTTP 检查接口,只有当接口返回成功时,才认为容器已就绪可以提供服务。
- **启动探针**:主要用于处理应用启动时间较长的情况,避免在应用还未完全启动时存活探针就开始检测并误判为故障。它会在容器启动期间执行,当启动探针成功后,存活探针和就绪探针才开始生效。

2. 自动重启

  • 基于故障检测结果:当存活探针检测到容器故障时,Kubernetes 的 kubelet 组件会根据 Pod 的重启策略来决定是否重启容器。Pod 的重启策略有 Always、OnFailure 和 Never 三种。
    • Always:默认策略,无论容器以何种原因终止,kubelet 都会自动重启该容器。这对于大多数需要持续运行的微服务非常适用,比如后台的 API 服务。
    • OnFailure:只有当容器以非零状态码退出(即发生故障)时,kubelet 才会重启容器。适用于一些批处理任务类型的微服务,任务正常完成退出时不需要重启。
    • Never:容器终止后,kubelet 不会重启它。这种策略很少用于长期运行的微服务,通常用于一次性任务。

3. 副本管理

  • Deployment 控制器:Kubernetes 使用 Deployment 资源对象来管理微服务的副本。通过 Deployment,可以定义期望的副本数量,Kubernetes 会自动确保实际运行的副本数量与期望数量一致。例如,定义一个 Deployment 如下:
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 - container
        image: my - app - image

上述配置表明期望运行 3 个 my - app 微服务的副本。如果某个副本由于节点故障、容器崩溃等原因终止运行,Kubernetes 会自动在集群中的其他可用节点上创建新的副本,以维持副本数量为 3 个,从而保证微服务的高可用性。同时,Deployment 还支持滚动更新、回滚等功能,在更新微服务版本时,可以通过控制更新的节奏,确保在更新过程中服务的可用性不受影响。例如,在进行滚动更新时,可以每次只更新一个副本,等待该副本更新成功并就绪后,再更新下一个副本,避免一次性更新所有副本导致服务不可用。