StatefulSet是为了解决有状态服务的问题而设计,对应Deployments和ReplicaSets是为无状态服务。
statefulSetName-{0..N-1}.serviceName.namespace.svc.cluster.local
kubectl apply -f /root/test3/nginx-service.yaml
kubectl delete -f /root/test3/nginx-service.yaml
kubectl apply -f /root/test3/statefulset-nginx.yaml
kubectl delete -f /root/test3/statefulset-nginx.yaml
kubectl get svc nginx-service
kubectl describe svc nginx-service
kubectl get pods -w -l la_nginx=nginx
vi /root/test3/nginx-service.yaml
内容
apiVersion: v1
kind: Service
metadata:
name: nginx-service
labels:
la_nginx-service: nginx
spec:
ports:
- port: 80
name: nginx-port
clusterIP: None
selector:
la-nginx: nginx
vi /root/test3/statefulset-nginx.yaml
内容
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: statefulset-nginx
spec:
selector:
matchLabels:
la_nginx: nginx
serviceName: "nginx"
replicas: 2
template:
metadata:
labels:
la_nginx: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
name: nginx
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 100Mi

需要创建pv和pvc。
[root@master1 test3]# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
statefulset-nginx-0 1/1 Running 0 64m controller-revision-hash=statefulset-nginx-59bd4967d6,la_nginx=nginx,statefulset.kubernetes.io/pod-name=statefulset-nginx-0
statefulset-nginx-1 1/1 Running 0 64m controller-revision-hash=statefulset-nginx-59bd4967d6,la_nginx=nginx,statefulset.kubernetes.io/pod-name=statefulset-nginx-1
kubectl get pods -w -l la_nginx=nginx

kubectl get svc nginx-service

kubectl get statefulset statefulset-nginx

kubectl get pvc -l la_nginx=nginx

StatefulSet控制器 自动创建了2个PersistentVolumeClaims,自动绑定到2个PersistentVolumes。

Pod拥有一个唯一的顺序索引和稳定的网络身份标识

StatefulSet控制器分配给每个Pod的唯一顺序索引,Pod的名称的形式如下
-
举例:上面StatefulSet拥有两个副本,所以它创建了两个Pod:nginx-0和nginx-1
# 获取pod的主机名
kubectl exec statefulset-nginx-0 -- sh -c 'hostname';
kubectl exec statefulset-nginx-1 -- sh -c 'hostname';

# 查看集群内部的DNS地址
kubectl exec statefulset-nginx-0 -- hostname -f
kubectl exec statefulset-nginx-1 -- hostname -f

kubectl get pods -w -l la_nginx=nginx
kubectl delete Pod -l la_nginx=nginx


https://kubernetes.io/docs/tasks/run-application/force-delete-stateful-set-pod/
假设部署POD数量为3,对应的名称如下
statefulset-nginx-0
statefulset-nginx-1
statefulset-nginx-2
statefulset-nginx被创建后,会按照statefulset-nginx-0、statefulset-nginx-1、statefulset-nginx-2的顺序部署Pod。
在 statefulset-nginx-0 进入 Running 和 Ready 状态前不会部署 statefulset-nginx-1。
在 statefulset-nginx-1 进入 Running 和 Ready 状态前不会部署 statefulset-nginx-2。
如果 statefulset-nginx-1 已经处于 Running 和 Ready 状态,而 statefulset-nginx-2 尚未部署,在此期间发生了 statefulset-nginx-0 运行失败,那么 statefulset-nginx-2 将不会被部署,要等到 statefulset-nginx-0 部署完成并进入 Running 和 Ready 状态后,才会部署 statefulset-nginx-2。
必须设置StatefulSet的.spec.selector字段,使之匹配其在.spec.template.metadata.labels中设置的标签。

StatefulSet中的每个Pod根据StatefulSet的名称和Pod的序号派生出它的主机名。
2. 组合主机名格式:
(
S
t
a
t
e
f
u
l
S
e
t
名称
)
−
(StatefulSet名称)-
(StatefulSet名称)−(序号)。
StatefulSet可以使用headless服务 控制它的Pod的网络域。
一旦每个Pod创建成功,就会得到一个匹配的DNS子域
案例:下面给出一些选择集群域、服务名、StatefulSet名、及其怎样影响StatefulSet的Pod上的DNS名称的示例

注意: 集群域会被设置为 cluster.local,除非有其他配置。
让StatefulSet控制器并行的启动或终止所有的Pod,启动或者终止其他Pod前,无需等待Pod进入Running和ready或者完全停止状态。
通过.spec.updateStrategy让你可以配置和禁用掉自动滚动更新Pod的容器、标签、资源请求或限制、以及注解。