Kubernetes中的StatefulSet应用实践

张开发
2026/4/5 20:14:15 15 分钟阅读

分享文章

Kubernetes中的StatefulSet应用实践
Kubernetes中的StatefulSet应用实践引言StatefulSet的重要性哥们别整那些花里胡哨的作为一个前端开发兼摇滚鼓手我最烦的就是有状态应用的部署问题。在云原生时代StatefulSet是管理有状态应用的关键。今天我就给你们整一套硬核的Kubernetes StatefulSet应用实践方案直接上代码不玩虚的一、StatefulSet基础1. StatefulSet的概念StatefulSet管理有状态应用的控制器有状态应用需要稳定网络标识和持久存储的应用稳定网络标识Pod有稳定的主机名和IP地址持久存储Pod有持久的存储卷2. StatefulSet的特点有序部署按顺序创建Pod有序删除按顺序删除Pod有序扩缩容按顺序扩缩容Pod稳定网络标识Pod有稳定的主机名和DNS记录持久存储每个Pod有自己的持久存储卷3. StatefulSet的使用场景数据库MySQL、PostgreSQL等缓存Redis、Memcached等消息队列Kafka、RabbitMQ等有状态服务需要稳定标识的服务二、StatefulSet配置1. 基本配置Service为StatefulSet创建Headless ServiceVolumeClaimTemplates定义持久存储卷模板PodTemplate定义Pod模板配置示例# Headless Service apiVersion: v1 kind: Service metadata: name: mysql namespace: default spec: selector: app: mysql clusterIP: None ports: - port: 3306 name: mysql # StatefulSet apiVersion: apps/v1 kind: StatefulSet metadata: name: mysql namespace: default spec: serviceName: mysql replicas: 3 selector: matchLabels: app: mysql template: metadata: labels: app: mysql spec: containers: - name: mysql image: mysql:8.0 env: - name: MYSQL_ROOT_PASSWORD valueFrom: secretKeyRef: name: mysql-secret key: password ports: - containerPort: 3306 name: mysql volumeMounts: - name: mysql-data mountPath: /var/lib/mysql volumeClaimTemplates: - metadata: name: mysql-data spec: accessModes: [ReadWriteOnce] resources: requests: storage: 10Gi storageClassName: standard2. 存储配置PersistentVolume持久存储卷PersistentVolumeClaim持久存储卷声明StorageClass存储类动态卷供应动态创建存储卷配置示例# StorageClass apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: standard provisioner: kubernetes.io/aws-ebs parameters: type: gp2 reclaimPolicy: Retain allowVolumeExpansion: true volumeBindingMode: WaitForFirstConsumer # PersistentVolume apiVersion: v1 kind: PersistentVolume metadata: name: pv-mysql-1 spec: capacity: storage: 10Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: standard awsElasticBlockStore: volumeID: vol-0123456789abcdef0 fsType: ext43. 网络配置Headless Service为StatefulSet提供稳定的网络标识DNS记录Pod有稳定的DNS记录网络策略配置网络策略配置示例# Headless Service apiVersion: v1 kind: Service metadata: name: redis namespace: default spec: selector: app: redis clusterIP: None ports: - port: 6379 name: redis # StatefulSet apiVersion: apps/v1 kind: StatefulSet metadata: name: redis namespace: default spec: serviceName: redis replicas: 3 selector: matchLabels: app: redis template: metadata: labels: app: redis spec: containers: - name: redis image: redis:6.2 ports: - containerPort: 6379 name: redis volumeMounts: - name: redis-data mountPath: /data volumeClaimTemplates: - metadata: name: redis-data spec: accessModes: [ReadWriteOnce] resources: requests: storage: 5Gi storageClassName: standard4. 扩缩容配置水平扩缩容增加或减少Pod数量有序扩缩容按顺序扩缩

更多文章