k8s—StatefulSet
-
StatefulSet给所有的Pod进行了编号,编号规则是:
$(statefulset名称)-$(序号)
,从0开始。 -
Pod被删除后重建,重建Pod的网络标识也不会改变,Pod的拓扑状态按照Pod的“名字+编号”的方式固定下来,并且为每个Pod提供了一个固定且唯一的访问入口,即Pod对应的DNS记录。
-
StatefulSet所控制的节点必须通过控制器指定副本数量进行增加或回收。
-
StatefulSet所控制的节点启动与回收都是按顺序进行。
StatefulSet如何通过Headless Service维持Pod的拓扑状态
创建headless 无头服务
[root@server1 head]# cat headless.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
- kubectl apply -f headless.yaml
[root@server1 head]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-svc ClusterIP None <none> 80/TCP 12s
创建statefulset服务配置文件
[root@server1 head]# cat statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
serviceName: "nginx-svc"
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: myapp:v1
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
storageClassName: managed-nfs-storage
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: myapp:v1
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
storageClassName: managed-nfs-storage
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
- kubectl apply -f statefulset.yaml
- kubectl get pod -w
成功运行镜像之后,会建立响应数量的pv与pvc - kubectl get pv
- kubevtl get pvc
查看statefulset控制器 - kubectl get statefulsets.apps
此时在nfs服务端可以看到建立起来的pv目录
分别在目录中建立index.html,用于测试DNS解析与负载均衡
在master端,运行busybox镜像,测试地址解析与负载均衡。
- kubectl run demo --image=busyboxplus -it
通过nginx-svc可以成功解析到svc中的pod,并且访问时默认负载均衡