使用 StatefulSet 控制器

KubernetesBeginner
立即练习

介绍

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

这是一个实验(Guided Lab),提供逐步指导来帮助你学习和实践。请仔细按照说明完成每个步骤,获得实际操作经验。根据历史数据,这是一个 初级 级别的实验,完成率为 92%。获得了学习者 90% 的好评率。

启动 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 时需要执行的基本操作。