面试题答案
一键面试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 还支持滚动更新、回滚等功能,在更新微服务版本时,可以通过控制更新的节奏,确保在更新过程中服务的可用性不受影响。例如,在进行滚动更新时,可以每次只更新一个副本,等待该副本更新成功并就绪后,再更新下一个副本,避免一次性更新所有副本导致服务不可用。