
1) 【一句话结论】
采用基于Kubernetes的微服务架构,通过StatefulSet管理有状态服务(如数据库)实现数据持久化(多副本容灾),通过Deployment管理无状态服务(如UI)实现服务冗余,结合持久化存储(如Ceph多副本)和健康检查(liveness/readiness)保障故障恢复,确保监控软件在设备/网络/组件故障时数据不丢失且服务持续运行。
2) 【原理/概念讲解】
老师来解释核心概念:
volumeClaimTemplates自动挂载持久化存储(如Ceph多副本),保证数据不会因Pod故障丢失。类比:像“带编号的仓库群”,每个仓库(Pod)有固定编号和位置,货物(数据)通过多副本备份,故障时能从其他仓库恢复。replicas设置副本数(如3个),当某个Pod故障时,Kubernetes自动替换为新的健康Pod,实现服务冗余。类比:像“多台备用电脑”,一台故障时自动切换到另一台,保证服务不中断。PersistentVolume是集群中的存储资源(如Ceph集群),PersistentVolumeClaim是Pod对存储资源的请求,两者结合保证数据持久化。多副本配置时,每个StatefulSet Pod挂载不同副本的PV,实现数据容灾。externalTrafficPolicy: Local优化流量路由,确保服务间通信不中断。3) 【对比与适用场景】
| 特性 | StatefulSet | Deployment |
|---|---|---|
| 生命周期 | 有状态,每个Pod有唯一ID(如0,1,2) | 无状态,Pod无固定ID |
| 数据持久化 | 支持(通过PV/PVC,多副本容灾) | 不直接支持(需额外配置) |
| 适用场景 | 数据库、消息队列、分布式存储等有状态服务 | Web UI、API网关、无状态后端服务等 |
| 故障恢复 | 自动迁移,数据不丢失(多副本) | 自动重启,数据可能丢失(需额外持久化) |
| 注意点 | 需配置多副本PV/PVC,避免单点故障 | 需结合持久化存储(如emptyDir+PV)或无状态设计 |
4) 【示例】
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: monitoring-db
spec:
serviceName: "monitoring-db"
replicas: 3
selector:
matchLabels:
app: monitoring-db
template:
metadata:
labels:
app: monitoring-db
spec:
containers:
- name: db
image: mysql:5.7
volumeMounts:
- name: data-storage
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: data-storage
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: ceph-rbd
resources:
requests:
storage: 20Gi
apiVersion: v1
kind: PersistentVolume
metadata:
name: ceph-pv-0
spec:
capacity:
storage: 20Gi
accessModes:
- ReadWriteOnce
rbd:
imageFeatureFlags:
- layering
image: ceph-rbd:monitoring-db
pool: monitoring-db
fsType: rbd
imageFsType: ext4
imageFsFeature: "ext4"
(假设Ceph集群已配置多副本,每个PV对应不同副本)apiVersion: apps/v1
kind: Deployment
metadata:
name: monitoring-ui
spec:
replicas: 3
selector:
matchLabels:
app: monitoring-ui
template:
metadata:
labels:
app: monitoring-ui
spec:
containers:
- name: ui
image: my-monitoring-ui:1.0
ports:
- containerPort: 80
livenessProbe:
httpGet:
path: /health
port: 80
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 80
initialDelaySeconds: 5
periodSeconds: 5
apiVersion: v1
kind: Service
metadata:
name: monitoring-service
spec:
selector:
app: monitoring
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP
sessionAffinity: None
5) 【面试口播版答案】
“面试官您好,针对监控软件的高可用需求,我会设计一个基于Kubernetes的架构,核心是通过StatefulSet实现数据持久化(多副本容灾),通过Deployment实现服务冗余,结合持久化存储和健康检查确保故障恢复。首先,数据持久化方面,使用StatefulSet管理有状态监控服务(如数据库),每个Pod通过Ceph多副本持久化存储(如每个Pod挂载不同副本的PV),保证故障时数据不丢失。然后服务冗余,用Deployment部署无状态组件(如Web UI),设置3个副本,当某个Pod故障时自动替换。故障恢复通过Kubernetes的liveness和readiness探针,监控服务状态,不健康的Pod会被自动重启或替换,同时结合自动扩缩容策略,确保系统持续运行。数据一致性方面,数据库使用事务机制(ACID),分布式环境用Raft协议保证最终一致;服务间通信通过Service负载均衡,结合健康检查避免流量打到故障节点。这样整体架构能保证数据不丢失且服务持续可用。”
6) 【追问清单】
7) 【常见坑/雷区】