一、Statefulset控制器:概念、原理解读
StatefulSet 是 Kubernetes 中的一种控制器(Controller),用于管理有状态应用程序的部署。与
Deployment 控制器不同,StatefulSet 为每个 Pod 实例分配了一个唯一的标识符,并确保这些标识符
在 Pod 重新创建时保持不变。这为有状态应用程序提供了一些关键的功能和保证,例如稳定的网络标识
符、有序的部署和扩展以及持久化存储。
下面是 StatefulSet 的一些基本介绍:
1、唯一标识符:每个 StatefulSet 管理的 Pod 实例都被分配了一个唯一的标识符,通常是一个整数索引。这个标识符可以用于在网络中唯一的标识每个 Pod 实例。
2、稳定的网络标识符:StatefulSet 中的每个 Pod 实例都有一个稳定的网络标识符,通常是一个DNS 名称。这使得其他应用程序可以通过名称轻松地访问特定的 Pod 实例,而不需要关注其具体的 IP地址变化。
3、有序的部署和扩展:StatefulSet 控制器确保 Pod 实例按照定义的顺序逐个启动和关闭。这对于依赖先前实例状态的应用程序非常重要。此外,扩展 StatefulSet 时,新的 Pod 实例也会按照指定的顺序逐个创建。
4、持久化存储:StatefulSet 允许每个 Pod 实例关联一个持久化卷(Persistent Volume),这使得有状态应用程序可以在 Pod 重新创建时保留其数据。这为应用程序提供了持久化存储的能力,使得数据不会丢失或重置。
二、yaml文件编写技巧
1、查看 StatefulSet 资源的字段定义,使用以下命令:kubectl explain statefulset
字段说明:
• apiVersion:定义 StatefulSet 资源需要使用的 API 版本。
• kind:定义资源类型。
• metadata:元数据对象,包含 StatefulSet 的描述信息。
• spec:容器相关的信息,定义了 StatefulSet 中 Pod 的期望标识。
2、查看 StatefulSet 的 spec 字段如何定义,使用以下命令:kubectl explain
statefulset.spec
字段说明:
• podManagementPolicy:Pod 的管理策略。
• replicas:副本数,定义 StatefulSet 中 Pod 的数量。
• revisionHistoryLimit:保留的历史版本数。
• selector:标签选择器,用于选择与之关联的 Pod。
• serviceName:Headless Service 的名称。
• template:生成 Pod 的模板,用于描述将创建的 Pod 的属性。
• updateStrategy:更新策略,定义如何更新 Pod。
• volumeClaimTemplates:存储卷申请模板,定义 Pod 使用的存储卷。
3、查看 StatefulSet 的 spec.template 字段如何定义,使用以下命令:kubectl explain
statefulset.spec.template
字段说明:
• metadata:元数据对象,包含 Pod 模板的描述信息。
• spec:定义 Pod 的属性和配置。
三、使用StatefulSet部署web节点
#做这个实验要先确保nfs-provisioner制备器安装好
创建存储类
vim nfs-web.yaml
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-web
provisioner: example.com/nfs
reclaimPolicy: Retain
更新资源清单
查看存储类是否创建成功
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
nfs example.com/nfs Delete Immediate false 6h1m
nfs-web example.com/nfs Retain Immediate false 5h15m
创建service和StatefulSet控制器
vim StatefulSet.yaml
---
apiVersion: v1
kind: Service
metadata:
name: statefulset-dis
labels:
app: web
spec:
clusterIP: None
ports:
name: web
selector:
app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: statefulset
spec:
selector:
matchLabels:
app: nginx
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
containers:
image: nginx
imagePullPolicy: IfNotPresent
volumeMounts:
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
name: app
spec:
storageClassName: nfs-web
accessModes: ["ReadWriteMany"]
resources:
requests:
storage: 1Gi
更新资源清单
查看service是否创建成功
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 443/TCP 34d
mysql ClusterIP 10.105.22.22 3306/TCP 5d23h
查看StatefulSet是否创建成功
kubectl get sts
NAME READY AGE
statefulset 2/2 4h52m
测试:
kubectl run busybox --image busybox:1.28 --restart=Never --rm -it -- sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
Server: 10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
Name: statefulset-dis.default.svc.cluster.local
Address 1: 10.246.71.106 10-246-71-106.statefulset-dis.default.svc.cluster.local
Address 2: 10.247.66.165 10-247-66-165.statefulset-dis.default.svc.cluster.local
四、扩容、缩容和更新
扩容:
修改replicas: 2为replicas: 3
kubectl apply -f StatefulSet.yaml
查看:
[root@lx100 statefulset]# kubectl get sts
NAME READY AGE
statefulset 3/3 4h57m
[root@lx100 statefulset]# kubectl get pod -l app=nginx
NAME READY STATUS RESTARTS AGE
statefulset-0 1/1 Running 0 4h57m
statefulset-1 1/1 Running 0 4h57m
statefulset-2 1/1 Running 0 2m25s
缩容:
修改replicas: 3为replicas: 2
kubectl apply -f statefulset.yaml
查看
[root@lx100 statefulset]# kubectl get sts
NAME READY AGE
statefulset 2/2 4h58m
[root@lx100 statefulset]# kubectl get pod -l app=nginx
NAME READY STATUS RESTARTS AGE
statefulset-0 1/1 Running 0 4h58m
statefulset-1 1/1 Running 0 4h58m
更新:
修改image: nginx为image: docker.io/janakiramm/myapp:v1
重新开一个终端动态监控pod
[root@lx100 ~]# kubectl get pod -w -l app=nginx
NAME READY STATUS RESTARTS AGE
statefulset-0 1/1 Running 0 5m14s
statefulset-1 1/1 Running 0 5m12s
statefulset-1 1/1 Terminating 0 5m18s
statefulset-1 1/1 Terminating 0 5m18s
statefulset-1 0/1 Terminating 0 5m19s
statefulset-1 0/1 Terminating 0 5m19s
statefulset-1 0/1 Terminating 0 5m19s
statefulset-1 0/1 Pending 0 0s
statefulset-1 0/1 Pending 0 0s
statefulset-1 0/1 ContainerCreating 0 0s
statefulset-1 0/1 ContainerCreating 0 0s
statefulset-1 1/1 Running 0 1s
statefulset-0 1/1 Terminating 0 5m22s
statefulset-0 1/1 Terminating 0 5m22s
statefulset-0 0/1 Terminating 0 5m23s
statefulset-0 0/1 Terminating 0 5m23s
statefulset-0 0/1 Terminating 0 5m23s
statefulset-0 0/1 Pending 0 0s
statefulset-0 0/1 Pending 0 0s
statefulset-0 0/1 ContainerCreating 0 0s
statefulset-0 0/1 ContainerCreating 0 1s
statefulset-0 1/1 Running 0 29s
statefulset-1 1/1 Running 0 33s
statefulset-0 1/1 Running 0 46s
更新资源清单
kubectl apply -f StatefulSet.yaml