介绍
在 Kubernetes 中,StatefulSets 用于管理有状态应用。与传统的无状态应用不同,有状态应用需要稳定的、唯一的网络标识符和持久化存储。在本实验中,我们将学习如何在 Kubernetes 中使用 StatefulSets 来建模稳定性。
在 Kubernetes 中,StatefulSets 用于管理有状态应用。与传统的无状态应用不同,有状态应用需要稳定的、唯一的网络标识符和持久化存储。在本实验中,我们将学习如何在 Kubernetes 中使用 StatefulSets 来建模稳定性。
在创建资源之前,你需要一个正在运行的 Kubernetes 集群。Minikube 是一个轻量级的 Kubernetes 环境,可以在你的本地机器上运行。
导航到工作目录:
打开终端并导航到默认的项目文件夹:
cd /home/labex/project
启动 Minikube:
启动 Minikube 以初始化一个 Kubernetes 集群:
minikube start
验证 Minikube 是否正在运行:
检查 Minikube 集群的状态:
minikube status
kubelet
和 apiserver
等组件是否显示为 Running
。minikube start
。如果启动 Minikube 时遇到问题,可以使用 minikube delete
来重置环境(如有需要)。
第一步是创建一个带有持久卷(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.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!
在 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!
在 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!
在 Kubernetes 中,你可以通过运行以下命令删除 StatefulSet:
kubectl delete statefulset web
这将删除 web
StatefulSet 及其所有 Pod。
恭喜,你已完成关于在 Kubernetes 中使用 StatefulSet 建模稳定性的实验!
在本实验中,我们学习了如何在 Kubernetes 中使用 StatefulSet 建模稳定性。我们创建了一个 StatefulSet,更新了一个 StatefulSet,扩展了一个 StatefulSet,并删除了一个 StatefulSet。这些是你在 Kubernetes 中操作 StatefulSet 时需要执行的基本操作。