Kubernetes StatefulSet深度解析与实践StatefulSet概述StatefulSet是Kubernetes中用于管理有状态应用的资源对象。与Deployment不同StatefulSet为每个Pod提供稳定的网络标识和持久化存储。本文将深入探讨StatefulSet的核心概念、配置方法和最佳实践。StatefulSet核心概念1. 稳定的网络标识apiVersion: v1 kind: Service metadata: name: nginx labels: app: nginx spec: ports: - port: 80 name: web clusterIP: None selector: app: nginx --- apiVersion: apps/v1 kind: StatefulSet metadata: name: web spec: selector: matchLabels: app: nginx serviceName: nginx replicas: 3 template: metadata: labels: app: nginx spec: containers: - name: nginx image: k8s.gcr.io/nginx-slim:0.8 ports: - containerPort: 80 name: web2. 有序部署和伸缩apiVersion: apps/v1 kind: StatefulSet metadata: name: web spec: replicas: 3 podManagementPolicy: OrderedReady updateStrategy: type: RollingUpdate rollingUpdate: partition: 03. 持久化存储apiVersion: apps/v1 kind: StatefulSet metadata: name: web spec: replicas: 3 template: spec: containers: - name: nginx image: nginx volumeMounts: - name: www mountPath: /usr/share/nginx/html volumeClaimTemplates: - metadata: name: www spec: accessModes: [ ReadWriteOnce ] resources: requests: storage: 1GiStatefulSet配置详解1. 基本配置apiVersion: apps/v1 kind: StatefulSet metadata: name: stateful-app labels: app: stateful-app spec: replicas: 3 selector: matchLabels: app: stateful-app serviceName: stateful-app-service template: metadata: labels: app: stateful-app spec: containers: - name: app image: myapp:latest ports: - containerPort: 8080 env: - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name2. 更新策略apiVersion: apps/v1 kind: StatefulSet metadata: name: stateful-app spec: updateStrategy: type: RollingUpdate rollingUpdate: partition: 1 template: spec: containers: - name: app image: myapp:v23. Pod管理策略apiVersion: apps/v1 kind: StatefulSet metadata: name: stateful-app spec: podManagementPolicy: Parallel replicas: 5StatefulSet实战部署MySQL集群1. 创建Headless ServiceapiVersion: v1 kind: Service metadata: name: mysql labels: app: mysql spec: ports: - port: 3306 name: mysql clusterIP: None selector: app: mysql --- apiVersion: v1 kind: Service metadata: name: mysql-read labels: app: mysql spec: ports: - port: 3306 name: mysql selector: app: mysql2. 创建StatefulSetapiVersion: apps/v1 kind: StatefulSet metadata: name: mysql spec: selector: matchLabels: app: mysql serviceName: mysql replicas: 3 template: metadata: labels: app: mysql spec: initContainers: - name: init-mysql image: mysql:8.0 command: - bash - -c - | set -ex # 获取pod序号 ordinal$(echo $HOSTNAME | awk -F- {print $2}) # 配置主从复制 if [ $ordinal -eq 0 ]; then echo [mysqld] /mnt/conf.d/server-id.cnf echo server-id1 /mnt/conf.d/server-id.cnf else echo [mysqld] /mnt/conf.d/server-id.cnf echo server-id$((100 $ordinal)) /mnt/conf.d/server-id.cnf echo read_only1 /mnt/conf.d/server-id.cnf fi volumeMounts: - name: conf mountPath: /mnt/conf.d containers: - name: mysql image: mysql:8.0 env: - name: MYSQL_ROOT_PASSWORD valueFrom: secretKeyRef: name: mysql-secret key: root-password ports: - containerPort: 3306 name: mysql volumeMounts: - name: data mountPath: /var/lib/mysql - name: conf mountPath: /etc/mysql/conf.d volumeClaimTemplates: - metadata: name: data spec: accessModes: [ ReadWriteOnce ] resources: requests: storage: 10Gi - metadata: name: conf spec: accessModes: [ ReadWriteOnce ] resources: requests: storage: 1Gi3. 配置主从复制# mysql-configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: mysql-config data: master.cnf: | [mysqld] log-binmysql-bin binlog-formatROW server-id1 slave.cnf: | [mysqld] log-binmysql-bin binlog-formatROW read_only1StatefulSet故障处理1. Pod故障恢复# 查看StatefulSet状态 kubectl get statefulset # 查看Pod状态 kubectl get pods -l appmysql # 删除故障Pod kubectl delete pod mysql-0 # 查看Pod重建 kubectl get pods -l appmysql -w2. 数据恢复# 从备份恢复 kubectl exec -it mysql-0 -- mysql -u root -p mysql source /backup/backup.sql; # 重新同步从节点 kubectl exec -it mysql-1 -- mysql -u root -p mysql CHANGE MASTER TO - MASTER_HOSTmysql-0.mysql.default.svc.cluster.local, - MASTER_USERrepl, - MASTER_PASSWORDreplpassword, - MASTER_LOG_FILEmysql-bin.000001, - MASTER_LOG_POS156; mysql START SLAVE;StatefulSet最佳实践1. 存储配置apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: fast-storage provisioner: kubernetes.io/aws-ebs parameters: type: gp3 fsType: ext4 reclaimPolicy: Retain allowVolumeExpansion: true2. 健康检查apiVersion: apps/v1 kind: StatefulSet metadata: name: stateful-app spec: template: spec: containers: - name: app image: myapp:latest ports: - containerPort: 8080 livenessProbe: exec: command: - cat - /tmp/healthy initialDelaySeconds: 10 periodSeconds: 5 readinessProbe: httpGet: path: /health port: 8080 initialDelaySeconds: 5 periodSeconds: 33. 资源限制apiVersion: apps/v1 kind: StatefulSet metadata: name: stateful-app spec: template: spec: containers: - name: app image: myapp:latest resources: requests: cpu: 100m memory: 256Mi limits: cpu: 500m memory: 512Mi4. 网络策略apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: stateful-app-policy spec: podSelector: matchLabels: app: stateful-app policyTypes: - Ingress ingress: - from: - podSelector: matchLabels: app: frontend ports: - protocol: TCP port: 8080StatefulSet vs Deployment特性StatefulSetDeploymentPod命名固定名称如web-0, web-1随机名称网络标识稳定的DNS名称不稳定存储持久化卷模板临时或持久化部署顺序有序部署并行部署伸缩顺序有序伸缩并行伸缩适用场景有状态应用数据库、消息队列无状态应用Web服务实战案例部署Redis集群架构设计┌─────────────────────────────────────────────────────────────────┐ │ Redis集群架构 │ ├─────────────────────────────────────────────────────────────────┤ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ redis-0 │ │ redis-1 │ │ redis-2 │ │ │ │ (Master) │────│ (Slave) │────│ (Slave) │ │ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │ │ │ │ │ │ ▼ ▼ ▼ │ │ ┌─────────────────────────────────────────────────────────┐ │ │ │ Headless Service │ │ │ │ redis.default.svc.cluster.local │ │ │ └─────────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────────┘实现步骤创建Headless Service为Redis集群提供稳定的DNS解析创建StatefulSet配置3个副本使用持久化存储配置主从复制通过initContainer初始化主从配置配置监控部署Prometheus监控Redis指标配置健康检查添加liveness和readiness探针总结StatefulSet是Kubernetes中管理有状态应用的核心资源。通过提供稳定的网络标识、有序部署和持久化存储StatefulSet使得在Kubernetes上部署数据库、消息队列等有状态应用成为可能。在实际应用中需要根据业务需求合理配置StatefulSet的各项参数包括副本数、存储类、更新策略等以确保应用的高可用性和数据安全性。掌握StatefulSet的核心概念和最佳实践对于构建和管理有状态的云原生应用至关重要。