示例
下面是一个简单的StatefulSet示例,用于创建一个包含3个nginx Pod的有状态应用程序:
代码语言:javascript复制apiVersion: apps/v1
kind: StatefulSet
metadata:
name: nginx
spec:
replicas: 3
serviceName: nginx-headless
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
volumeMounts:
- name: nginx-persistent-storage
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: nginx-persistent-storage
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
在这个示例中,我们定义了一个名为nginx的StatefulSet,它包含了3个nginx Pod。这个StatefulSet使用了名为nginx-headless的Headless Service,用于为Pod提供服务发现。每个Pod使用了一个名为nginx-persistent-storage的磁盘卷,用于持久化存储nginx的HTML文件。
当我们创建这个StatefulSet时,Kubernetes会按照以下顺序创建3个Pod:
- 创建一个名为nginx-0的Pod,并为它分配一个唯一的标识符:nginx-0.nginx-headless.default.svc.cluster.local。
- 创建一个名为nginx-1的Pod,并为它分配一个唯一的标识符:nginx-1.nginx-headless.default.svc.cluster.local。在这个Pod启动之前,Kubernetes会等待nginx-0处于Running状态。
- 创建一个名为nginx-2的Pod,并为它分配一个唯一的标识符:nginx-2.nginx-headless.default.svc.cluster.local。在这个Pod启动之前,Kubernetes会等待nginx-1处于Running状态。当我们需要删除一个或多个Pod时,可以使用以下命令:
kubectl delete pod <pod-name>
如果我们需要删除整个StatefulSet及其所有Pod,可以使用以下命令:
代码语言:javascript复制kubectl delete statefulset <statefulset-name>
在删除StatefulSet时,Kubernetes会按照相反的顺序删除每个Pod,然后删除Headless Service和StatefulSet本身。如果我们想保留数据,可以在删除StatefulSet之前手动备份数据。
现在,假设我们想要删除nginx-0这个Pod。当我们运行以下命令时:
代码语言:javascript复制kubectl delete pod nginx-0
Kubernetes会按照以下顺序执行删除Pod的过程:
清除服务发现信息
StatefulSet会从Headless Service的Endpoints列表中移除nginx-0的IP地址和端口信息。
删除Pod
Kubernetes会停止nginx-0容器中的进程,并卸载nginx-0的磁盘卷。
删除磁盘卷
如果nginx-0中使用了磁盘卷,StatefulSet会在删除nginx-0后删除这些磁盘卷。
更新状态
StatefulSet会检查nginx-0的就绪状态,并将其设置为false。在这个示例中,StatefulSet会自动创建一个新的Pod来替换nginx-0。新的Pod的名称为nginx-0,但IP地址和端口号可能会不同。