0Pricing
DevOps Bootcamp · 课时

有状态应用的 StatefulSets

使用 StatefulSets 部署和管理数据库等有状态应用,确保稳定的网络标识和持久化存储。

有状态应用的 StatefulSets 是 CoddyKit 上的免费 DevOps Bootcamp 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 DevOps Bootcamp 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 DevOps Bootcamp 课程共包含 4 节课。

使用 StatefulSets 管理有状态应用

欢迎学习!本课将深入介绍 StatefulSets,这是 Kubernetes 中用于管理有状态应用的对象。

与无状态应用(易于扩展和替换)不同,有状态应用要求每个实例都具有唯一标识和持久化存储。例如数据库、消息队列,或需要在本地存储数据的自定义应用。

为什么需要有状态应用:面临的挑战

传统的部署非常适合无状态应用。如果一个容器组终止,系统会用新的容器组替换它,而具体由哪个容器组处理请求并不重要。

但对于有状态应用,每个副本通常都需要稳定且唯一的标识,以及专用存储。如果数据库容器组重启,它需要重新连接到属于自己的特定数据卷。

稳定的网络与容器组标识

StatefulSets 的一项重要功能,是为每个容器组提供稳定且唯一的网络标识符。

  • 容器组会以可预测且有序的方式命名(例如 web-0、web-1)。
  • 重启后,它们仍会保留原有的主机名。
  • 这样,其他服务就能可靠地连接到指定副本。

稳定且持久的存储

StatefulSets 确保每个容器组都拥有自己的稳定持久化存储。这通过持久卷声明(PVCs)实现。

创建 StatefulSet 容器组时,系统会根据 volumeClaimTemplates 定义自动创建 PVC。如果容器组终止并被重新创建,它会重新挂载同一个 PVC,从而继续使用原有数据。

StatefulSet YAML 的结构

StatefulSet 的 YAML 定义与部署类似,但增加了一些关键内容,其中包括:

  • apiVersion、kind、metadata
  • spec.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-app

VolumeClaimTemplates

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 导师)并解锁 DevOps Bootcamp 课程的其余内容,请升级到 CoddyKit PRO。 DevOps Bootcamp 课程共包含 4 节课。

「有状态应用的 StatefulSets」这节课中我会学到什么?

使用 StatefulSets 部署和管理数据库等有状态应用,确保稳定的网络标识和持久化存储。 你通过在浏览器中直接运行的动手代码来练习 DevOps Bootcamp,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 DevOps Bootcamp 需要有经验吗?

无需任何先前经验。CoddyKit 上的 DevOps Bootcamp 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「有状态应用的 StatefulSets」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 DevOps Bootcamp 课中编写并运行代码吗?

能。每节 DevOps Bootcamp 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 有状态应用的 StatefulSets
  2. 用于节点专属任务的 DaemonSets
  3. 了解 Kubernetes Operator
  4. 自定义资源定义(CRD)
← 返回 DevOps Bootcamp