面试题答案
一键面试基本原理
- 服务故障识别:Kubernetes 通过对服务的健康检查机制(如 liveness probe 和 readiness probe)来识别服务是否处于故障状态。liveness probe 用于判断容器是否正在运行,如果失败则表明容器可能已故障。readiness probe 用于判断服务是否已准备好接收流量,若失败说明服务虽在运行但可能无法正常提供功能。同时,Kubernetes 可以结合服务的指标监控(如 Prometheus 监控服务的响应时间、错误率等指标),当错误率超过设定阈值或平均响应时间过长时,可认定服务出现故障。
- 熔断触发:基于上述对服务故障的识别,当服务故障达到一定条件(如连续多次健康检查失败、错误率在一段时间内持续高于阈值等),就触发熔断机制。熔断机制的目的是防止故障服务继续接收请求,避免故障扩散到其他依赖它的服务。
实现方式
- 配置健康检查:在 Kubernetes 的 Pod 配置文件(如 YAML 文件)中配置 liveness probe 和 readiness probe。例如,对于一个基于 HTTP 的服务,可以这样配置 liveness probe:
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
spec:
containers:
- name: myapp-container
image: myapp:v1
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
上述配置表示每 10 秒对容器内运行的服务通过 http://<pod - ip>:8080/healthz
进行健康检查,容器启动 30 秒后开始首次检查。同样方式配置 readiness probe。
2. 结合监控指标与 Istio 实现熔断:
- 安装 Istio:Istio 是一个服务网格框架,集成了熔断、限流等功能。在 Kubernetes 集群中部署 Istio 控制平面。
- 配置指标监控:通过 Prometheus 收集服务的指标数据,如请求成功率、响应时间等。Istio 可以与 Prometheus 集成获取这些指标。
- 熔断配置:使用 Istio 的 VirtualService 和 DestinationRule 资源来配置熔断。例如,下面是一个简单的熔断配置示例:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: my - service - vs
spec:
hosts:
- my - service
http:
- route:
- destination:
host: my - service
subset: v1
fault:
abort:
percentage:
value: 100
httpStatus: 503
delay:
fixedDelay: 5s
percentage:
value: 50
上述配置表示对于发送到 my - service
的请求,有 50% 的请求会延迟 5 秒,并且 100% 的请求会返回 503 错误,模拟服务故障和熔断效果。实际使用中,会根据监控指标动态调整这些参数。当服务错误率或响应时间达到设定阈值时,通过修改这些配置触发熔断。
3. 熔断后处理:
- 快速失败:熔断触发后,后续请求不再转发到故障服务,而是立即返回错误(如上述 Istio 配置中的返回 503 错误),告知调用方服务不可用,避免调用方长时间等待。
- 重试机制:在调用方(如使用 Istio 的 Sidecar 代理的服务)可以配置重试策略。例如,当收到 503 错误时,在一定时间间隔后重试调用故障服务,随着时间推移逐渐增加重试间隔。可以通过 Istio 的 VirtualService 配置重试次数和间隔:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: my - service - vs
spec:
hosts:
- my - service
http:
- route:
- destination:
host: my - service
subset: v1
retries:
attempts: 3
perTryTimeout: 2s
retryOn: 503
上述配置表示当调用 my - service
收到 503 错误时,会重试 3 次,每次重试间隔 2 秒。
- 服务降级:熔断期间,可以将请求转发到备用服务(如缓存服务或简单的兜底服务),以提供基本功能。这可以通过 Istio 的 DestinationRule 配置不同的服务子集来实现,当主服务熔断时,将流量切换到备用服务子集。例如:
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: my - service - dr
spec:
host: my - service
subsets:
- name: v1
labels:
version: v1
- name: fallback
labels:
version: fallback
在 VirtualService 中配置流量切换:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: my - service - vs
spec:
hosts:
- my - service
http:
- route:
- destination:
host: my - service
subset: fallback
when:
- fault:
injected:
abort:
httpStatus: 503
上述配置表示当服务返回 503 错误(模拟熔断)时,将流量切换到 fallback
子集对应的备用服务。