
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配置):
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
apiVersion: v1
kind: Service
metadata:
name: my-app-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP
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) 【常见坑/雷区】