使用 StatefulSet 控制器

KubernetesKubernetesBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

介绍

在 Kubernetes 中,StatefulSets 用于管理有状态应用。与传统的无状态应用不同,有状态应用需要稳定的、唯一的网络标识符和持久化存储。在本实验中,我们将学习如何在 Kubernetes 中使用 StatefulSets 来建模稳定性。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL kubernetes(("`Kubernetes`")) -.-> kubernetes/BasicsGroup(["`Basics`"]) kubernetes(("`Kubernetes`")) -.-> kubernetes/BasicCommandsGroup(["`Basic Commands`"]) kubernetes(("`Kubernetes`")) -.-> kubernetes/AdvancedCommandsGroup(["`Advanced Commands`"]) kubernetes(("`Kubernetes`")) -.-> kubernetes/AdvancedDeploymentGroup(["`Advanced Deployment`"]) kubernetes(("`Kubernetes`")) -.-> kubernetes/TroubleshootingandDebuggingCommandsGroup(["`Troubleshooting and Debugging Commands`"]) kubernetes/BasicsGroup -.-> kubernetes/initialization("`Initialization`") kubernetes/BasicCommandsGroup -.-> kubernetes/get("`Get`") kubernetes/BasicCommandsGroup -.-> kubernetes/create("`Create`") kubernetes/BasicCommandsGroup -.-> kubernetes/delete("`Delete`") kubernetes/AdvancedCommandsGroup -.-> kubernetes/apply("`Apply`") kubernetes/AdvancedDeploymentGroup -.-> kubernetes/scale("`Scale`") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/describe("`Describe`") subgraph Lab Skills kubernetes/initialization -.-> lab-9205{{"`使用 StatefulSet 控制器`"}} kubernetes/get -.-> lab-9205{{"`使用 StatefulSet 控制器`"}} kubernetes/create -.-> lab-9205{{"`使用 StatefulSet 控制器`"}} kubernetes/delete -.-> lab-9205{{"`使用 StatefulSet 控制器`"}} kubernetes/apply -.-> lab-9205{{"`使用 StatefulSet 控制器`"}} kubernetes/scale -.-> lab-9205{{"`使用 StatefulSet 控制器`"}} kubernetes/describe -.-> lab-9205{{"`使用 StatefulSet 控制器`"}} end

启动 Minikube 集群

在创建资源之前,你需要一个正在运行的 Kubernetes 集群。Minikube 是一个轻量级的 Kubernetes 环境,可以在你的本地机器上运行。

  1. 导航到工作目录

    打开终端并导航到默认的项目文件夹:

    cd /home/labex/project
  2. 启动 Minikube

    启动 Minikube 以初始化一个 Kubernetes 集群:

    minikube start
    • 此命令将在你的本地机器上设置一个单节点的 Kubernetes 集群。
    • 根据系统性能,Minikube 可能需要几分钟才能启动。
  3. 验证 Minikube 是否正在运行

    检查 Minikube 集群的状态:

    minikube status
    • 查找 kubeletapiserver 等组件是否显示为 Running
    • 如果集群未运行,请重新运行 minikube start

如果启动 Minikube 时遇到问题,可以使用 minikube delete 来重置环境(如有需要)。

创建 PV 和 PVC

第一步是创建一个带有持久卷(Persistent Volume, PV)和持久卷声明(Persistent Volume Claim, PVC)的 Pod。PV 和 PVC 用于在 Pod 重启时持久化存储和访问数据。

为此,你需要首先创建一个 PV。

apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-pv
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data"

将上述代码保存到名为 pv.yaml 的文件中,并执行以下命令:

kubectl apply -f pv.yaml

此命令将创建一个名为 my-pv 的 PV,容量为 1Gi,主机路径为 /mnt/data

接下来,你将创建一个 PVC,从 PV 中请求 1Gi 的存储空间。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

将上述代码保存到名为 pvc.yaml 的文件中,并执行以下命令:

kubectl apply -f pvc.yaml

此命令将创建一个名为 my-pvc 的 PVC,请求 1Gi 的存储空间。

创建 StatefulSet

创建一个名为 statefulset.yaml 的文件,内容如下:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  serviceName: "web"
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.19.7
          ports:
            - containerPort: 80
          volumeMounts:
            - name: www
              mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
    - metadata:
        name: www
      spec:
        accessModes: ["ReadWriteOnce"]
        resources:
          requests:
            storage: 1Gi

在此文件中,我们定义了一个名为 web 的 StatefulSet,它会创建三个 NGINX Pod 的副本。我们还定义了一个名为 web 的服务,使用 app: nginx 标签选择 NGINX Pod。最后,我们为 NGINX Pod 的数据定义了一个持久卷声明模板。

要创建 StatefulSet,请运行以下命令:

kubectl apply -f statefulset.yaml

你可以通过运行以下命令检查 StatefulSet 的状态:

kubectl get statefulsets

一旦 StatefulSet 运行起来,你可以通过运行以下命令访问 NGINX Pod:

kubectl get pods
kubectl exec -it web-0 -- /bin/bash

web-0 替换为 StatefulSet 创建的任何 NGINX Pod 的名称。

恭喜,你已成功在 Kubernetes 中创建了一个 StatefulSet!

更新 StatefulSet

在 Kubernetes 中,你可以通过更新 StatefulSet 的模板来更新其 Pod。让我们更新 statefulset.yaml 文件,以使用 NGINX 版本 1.20.0。

statefulset.yaml 文件更新为以下内容:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  serviceName: "web"
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.20.0
          ports:
            - containerPort: 80
          volumeMounts:
            - name: www
              mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
    - metadata:
        name: www
      spec:
        accessModes: ["ReadWriteOnce"]
        resources:
          requests:
            storage: 1Gi

要更新 StatefulSet,请运行以下命令:

kubectl apply -f statefulset.yaml

你可以通过运行以下命令检查 StatefulSet 的状态:

kubectl get statefulsets

恭喜,你已成功在 Kubernetes 中更新了一个 StatefulSet!

扩展 StatefulSet

在 Kubernetes 中,你可以通过更改 replicas 字段来扩展或缩减 StatefulSet。让我们将 web StatefulSet 扩展到五个副本。

statefulset.yaml 文件更新为以下内容:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  serviceName: "web"
  replicas: 5
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.20.0
          ports:
            - containerPort: 80
          volumeMounts:
            - name: www
              mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
    - metadata:
        name: www
      spec:
        accessModes: ["ReadWriteOnce"]
        resources:
          requests:
            storage: 1Gi

要更新 StatefulSet,请运行以下命令:

kubectl apply -f statefulset.yaml

你可以通过运行以下命令检查 StatefulSet 的状态:

kubectl get statefulsets

恭喜,你已成功在 Kubernetes 中扩展了一个 StatefulSet!

删除 StatefulSet

在 Kubernetes 中,你可以通过运行以下命令删除 StatefulSet:

kubectl delete statefulset web

这将删除 web StatefulSet 及其所有 Pod。

恭喜,你已完成关于在 Kubernetes 中使用 StatefulSet 建模稳定性的实验!

总结

在本实验中,我们学习了如何在 Kubernetes 中使用 StatefulSet 建模稳定性。我们创建了一个 StatefulSet,更新了一个 StatefulSet,扩展了一个 StatefulSet,并删除了一个 StatefulSet。这些是你在 Kubernetes 中操作 StatefulSet 时需要执行的基本操作。

您可能感兴趣的其他 Kubernetes 教程