有状态应用的 StatefulSets
使用 StatefulSets 部署和管理数据库等有状态应用,确保稳定的网络标识和持久化存储。
有状态应用的 StatefulSets 是 CoddyKit 上的免费 Kubernetes Basics 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Kubernetes Basics 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Kubernetes Basics 课程共包含 4 节课。
使用 StatefulSets 管理有状态应用
欢迎学习!本课将深入介绍 StatefulSets,这是 Kubernetes 中用于管理有状态应用的对象。
与无状态应用(易于扩展和替换)不同,有状态应用要求每个实例都具有唯一标识和持久化存储。例如数据库、消息队列,或需要在本地存储数据的自定义应用。
为什么需要有状态应用:面临的挑战
传统的部署非常适合无状态应用。如果一个容器组终止,系统会用新的容器组替换它,而具体由哪个容器组处理请求并不重要。
但对于有状态应用,每个副本通常都需要稳定且唯一的标识,以及专用存储。如果数据库容器组重启,它需要重新连接到属于自己的特定数据卷。
稳定的网络与容器组标识
StatefulSets 的一项重要功能,是为每个容器组提供稳定且唯一的网络标识符。
- 容器组会以可预测且有序的方式命名(例如
web-0、web-1)。 - 重启后,它们仍会保留原有的主机名。
- 这样,其他服务就能可靠地连接到指定副本。
稳定且持久的存储
StatefulSets 确保每个容器组都拥有自己的稳定持久化存储。这通过持久卷声明(PVCs)实现。
创建 StatefulSet 容器组时,系统会根据 volumeClaimTemplates 定义自动创建 PVC。如果容器组终止并被重新创建,它会重新挂载同一个 PVC,从而继续使用原有数据。
StatefulSet YAML 的结构
StatefulSet 的 YAML 定义与部署类似,但增加了一些关键内容,其中包括:
apiVersion、kind、metadataspec.replicas、spec.selector、spec.template(与部署中的相同)spec.serviceName:连接到无头服务。spec.volumeClaimTemplates:定义如何为每个容器组创建 PVC。
用于稳定标识的无头服务
StatefulSets 要提供稳定的网络标识,需要使用无头服务。无头服务没有集群 IP,而是直接返回其选择的容器组的 IP 地址。
StatefulSet 使用此服务为每个容器组注册 DNS 条目(例如 pod-0.my-service.my-namespace.svc.cluster.local)。
apiVersion: v1
kind: Service
metadata:
name: my-app-headless
spec:
ports:
- port: 80
name: web
clusterIP: None # This makes it a headless service
selector:
app: my-appVolumeClaimTemplates
volumeClaimTemplates 部分是 StatefulSets 特有的。它是为每个副本创建的持久卷声明(PVCs)模板。
StatefulSet 中的每个容器组(例如 my-app-0、my-app-1)都会根据此模板获得自己的 PVC(例如 data-my-app-0、data-my-app-1),从而确保拥有专用存储。
volumeClaimTemplates:
- metadata:
name: data # This name is used in Pod's volumeMounts
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: standard
resources:
requests:
storage: 1Gi完整的 StatefulSet 示例
下面是一个简单 Nginx StatefulSet 的完整示例。请注意,其中的 serviceName 连接到了无头服务,并使用了 volumeClaimTemplates。
要部署它,请将内容保存为 nginx-statefulset.yaml,然后运行 kubectl apply -f nginx-statefulset.yaml。
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
serviceName: "nginx-headless" # Must match headless service name
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: k8s.gcr.io/nginx-slim:0.8
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www # Mounts the volume from the PVC
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www # This name links to volumeMounts.name
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: standard
resources:
requests:
storage: 1Gi
---
apiVersion: v1
kind: Service
metadata:
name: nginx-headless
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx容器组命名与排序
部署完成后,您会看到类似 web-0、web-1 的容器组名称。这些索引稳定且唯一。
StatefulSets 会对扩缩容操作实施严格的顺序控制。容器组按顺序(0、1、2……)创建,并按相反顺序(……、2、1、0)终止。
对于许多分布式有状态系统来说,这种有序方式对于保持一致性至关重要。
扩缩容与滚动更新
您可以像操作部署一样,通过 kubectl scale statefulset web --replicas=3 为 StatefulSet 扩缩容。
滚动更新同样可用,但会遵循相同的有序保证:容器组按序号从大到小逐个更新,只有前一个容器组就绪后,才会更新下一个容器组。
这种谨慎的编排方式可以最大限度地减少对有状态应用的干扰。
检查您的理解
以下哪些是 Kubernetes StatefulSets 的关键特征或要求?
回顾:StatefulSets 实战
做得很好!本课介绍了 StatefulSets,这是 Kubernetes 中用于管理有状态应用的强大对象。
- 它们提供稳定的网络标识,并按顺序执行操作。
- 它们使用
volumeClaimTemplates为每个副本提供专用的持久化存储。 - 要获得稳定的网络标识,无头服务不可或缺。
StatefulSets 是在 Kubernetes 上可靠运行数据库及其他关键有状态工作负载的基础。
常见问题解答
「有状态应用的 StatefulSets」课时是免费的吗?
是的 — 「有状态应用的 StatefulSets」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Kubernetes Basics 课程的其余内容,请升级到 CoddyKit PRO。 Kubernetes Basics 课程共包含 4 节课。
「有状态应用的 StatefulSets」这节课中我会学到什么?
使用 StatefulSets 部署和管理数据库等有状态应用,确保稳定的网络标识和持久化存储。 你通过在浏览器中直接运行的动手代码来练习 Kubernetes Basics,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Kubernetes Basics 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Kubernetes Basics 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「有状态应用的 StatefulSets」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Kubernetes Basics 课中编写并运行代码吗?
能。每节 Kubernetes Basics 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 有状态应用的 StatefulSets
- 用于节点专属任务的 DaemonSets
- 了解 Kubernetes Operator
- 自定义资源定义(CRD)