kubernetes Python客户端StatefulSet管理:有状态应用部署
在Kubernetes(K8s,容器编排系统)中,StatefulSet是管理有状态应用的核心资源,适用于需要稳定网络标识、持久化存储的场景。本文将通过Python客户端库,详解StatefulSet的创建、更新、回滚全流程,帮助运营人员快速掌握有状态应用部署技巧。
StatefulSet核心概念与应用场景
StatefulSet为每个Pod分配固定标识符,确保网络标识(DNS/主机名)和存储(VolumeClaims)的一致性。典型应用场景包括:
- 分布式数据库(如MySQL集群、MongoDB副本集)
- 分布式存储系统(如Ceph、GlusterFS)
- 消息队列(如Kafka、RabbitMQ)
官方定义文档:V1StatefulSet
环境准备与依赖安装
前置条件
- Kubernetes集群(v1.22+推荐,版本兼容性说明见examples/rollout-statefulset.py)
- Python 3.6+环境
- 集群配置文件(通常位于
~/.kube/config)
安装客户端库
pip install kubernetes==26.1.0
完整操作流程:以Redis集群为例
1. 创建Headless Service
无头服务为StatefulSet提供稳定网络标识,DNS格式为{pod-name}.{service-name}.{namespace}.svc.cluster.local。
from kubernetes import client, config
def create_service(core_v1_api):
body = client.V1Service(
api_version="v1",
kind="Service",
metadata=client.V1ObjectMeta(name="redis-test-svc"),
spec=client.V1ServiceSpec(
selector={"app": "redis"},
cluster_ip="None", # 无头服务标志
ports=[client.V1ServicePort(port=6379, target_port=6379)]
)
)
core_v1_api.create_namespaced_service(namespace="default", body=body)
完整实现:examples/rollout-statefulset.py
2. 定义StatefulSet对象
包含Pod模板、副本数、存储声明模板等关键配置。
def create_stateful_set_object():
container = client.V1Container(
name="sts-redis",
image="redis",
ports=[client.V1ContainerPort(container_port=6379)]
)
template = client.V1PodTemplateSpec(
metadata=client.V1ObjectMeta(labels={"app": "redis"}),
spec=client.V1PodSpec(containers=[container])
)
spec = client.V1StatefulSetSpec(
replicas=3, # 3节点集群
service_name="redis-test-svc", # 关联无头服务
selector=client.V1LabelSelector(match_labels={"app": "redis"}),
template=template,
# 存储声明模板(需提前创建StorageClass)
volume_claim_templates=[client.V1PersistentVolumeClaim(
metadata=client.V1ObjectMeta(name="redis-data"),
spec=client.V1PersistentVolumeClaimSpec(
access_modes=["ReadWriteOnce"],
resources=client.V1ResourceRequirements(
requests={"storage": "10Gi"}
)
)
)]
)
return client.V1StatefulSet(
api_version="apps/v1",
kind="StatefulSet",
metadata=client.V1ObjectMeta(name="statefulset-redis"),
spec=spec
)
核心配置类:V1StatefulSetSpec
3. 部署与更新StatefulSet
创建StatefulSet
apps_v1_api = client.AppsV1Api()
stateful_set_obj = create_stateful_set_object()
apps_v1_api.create_namespaced_stateful_set(namespace="default", body=stateful_set_obj)
版本更新(滚动更新策略)
def update_stateful_set(apps_v1_api, statefulset):
# 更新容器镜像版本
statefulset.spec.template.spec.containers[0].image = "redis:6.2"
apps_v1_api.patch_namespaced_stateful_set(
name=statefulset.metadata.name, namespace="default", body=statefulset
)
实现代码:examples/rollout-statefulset.py
4. 版本管理与回滚
查看控制器历史版本
def list_controller_revision(apps_v1_api, namespace, stateful_set_name):
revisions = []
for cr in apps_v1_api.list_namespaced_controller_revision(namespace).items:
if cr.metadata.owner_references[0].kind == "StatefulSet" and \
cr.metadata.owner_references[0].name == stateful_set_name:
revisions.append((cr.metadata.name, cr.revision))
return sorted(revisions, key=lambda x: x[1])
执行回滚操作
def rollout_namespaced_stateful_set(apps_v1_api, name, namespace, revision_name):
cr = apps_v1_api.read_namespaced_controller_revision(revision_name, namespace)
apps_v1_api.patch_namespaced_stateful_set(name, namespace, body=cr.data)
回滚实现:examples/rollout-statefulset.py
最佳实践与注意事项
存储配置
- 使用
volumeClaimTemplates自动创建PVC,需提前配置StorageClass - 生产环境推荐使用
ReadWriteOncePod访问模式(K8s 1.27+)
更新策略
- 默认滚动更新(
RollingUpdate),可通过partition控制灰度发布比例 - 如需蓝绿部署,可创建新StatefulSet+服务切换
监控与运维
- 通过
kubectl get sts statefulset-redis -o yaml查看当前状态 - 监控指标:
readyReplicas、currentRevision、updateRevision
完整示例代码与扩展阅读
- 完整操作示例:examples/rollout-statefulset.py
- 其他StatefulSet应用示例:examples/yaml_dir/
- 官方API文档:kubernetes/client/apps_v1/
提示:生产环境建议结合PodDisruptionBudget保障可用性,避免同时驱逐多个实例。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



