推荐答案
// www.javascriptcn.com code example
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
serviceName: "nginx"
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.19
ports:
- containerPort: 80
name: web
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi本题详细解读
1. StatefulSet 的基本概念
StatefulSet 是 Kubernetes 中用于管理有状态应用的工作负载 API 对象。与 Deployment 不同,StatefulSet 为每个 Pod 维护一个唯一的标识符,并且 Pod 的创建和删除是有序的。StatefulSet 通常用于需要稳定网络标识符和持久存储的应用,如数据库、分布式存储系统等。
2. StatefulSet 的关键字段
- apiVersion: 指定 API 版本,通常为
apps/v1。 - kind: 指定资源类型为
StatefulSet。 - metadata: 包含 StatefulSet 的元数据,如名称。
- spec: 定义 StatefulSet 的规格。
- serviceName: 指定与 StatefulSet 关联的 Headless Service 名称。
- replicas: 指定 Pod 的副本数。
- selector: 定义 StatefulSet 如何选择要管理的 Pod。
- template: 定义 Pod 的模板,包括 Pod 的元数据和规格。
- volumeClaimTemplates: 定义持久卷声明模板,用于为每个 Pod 创建独立的持久卷。
3. 示例解析
- serviceName: 设置为
"nginx",表示 StatefulSet 将与名为nginx的 Headless Service 关联。 - replicas: 设置为
3,表示将创建 3 个 Pod。 - selector: 使用
matchLabels选择标签为app: nginx的 Pod。 - template: 定义了 Pod 的模板,其中包含一个名为
nginx的容器,使用nginx:1.19镜像,并暴露 80 端口。 - volumeClaimTemplates: 定义了一个持久卷声明模板,名称为
www,请求 1Gi 的存储空间,访问模式为ReadWriteOnce。
4. 创建 StatefulSet
将上述 YAML 文件保存为 statefulset.yaml,然后使用以下命令创建 StatefulSet:
kubectl apply -f statefulset.yaml
5. 验证 StatefulSet
使用以下命令查看 StatefulSet 的状态:
kubectl get statefulset web
使用以下命令查看 Pod 的状态:
kubectl get pods -l app=nginx
6. 删除 StatefulSet
如果需要删除 StatefulSet,可以使用以下命令:
kubectl delete statefulset web
这将删除 StatefulSet 及其管理的所有 Pod。