开发者社区> 阚俊宝> 正文

K8S有状态服务-StatefulSet使用最佳实践

简介:
+关注继续查看

介绍

StatefulSet是一种给Pod提供唯一标志的控制器,它可以保证部署和扩展的顺序。

Pod一致性:包含次序(启动、停止次序)、网络一致性。此一致性与Pod相关,与被调度到哪个node节点无关。

稳定的次序:对于N个副本的StatefulSet,每个Pod都在[0,N)的范围内分配一个数字序号,且是唯一的。

稳定的网络:Pod的hostname模式为$(statefulset名称)-$(序号)。

稳定的存储:通过VolumeClaimTemplate为每个Pod创建一个PV。删除、减少副本,不会删除相关的卷。

阿里云云盘支持动态挂载的功能,可以通过VolumeClaimTemplate方式部署statefulset应用。

部署Statefulset服务

volumeClaimTemplates:表示一类PVC的模板,系统会根据Statefulset配置的replicas数量,创建相应数量的PVC。这些PVC除了名字不一样之外其他配置都是一样的。

下面storageClassName配置为alicloud-disk-ssd,表示使用阿里云SSD类型云盘。

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
---
apiVersion: apps/v1beta2
kind: StatefulSet
metadata:
  name: web
spec:
  selector:
    matchLabels:
      app: nginx
  serviceName: "nginx"
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: disk-ssd
          mountPath: /data
  volumeClaimTemplates:
  - metadata:
      name: disk-ssd
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "alicloud-disk-ssd"
      resources:
        requests:
          storage: 20Gi

验证服务伸缩性

创建Statefulset服务:


# kubectl create -f statefulset.yaml

# kubectl get pod
NAME      READY     STATUS    RESTARTS   AGE
web-0     1/1       Running   0          21m
web-1     1/1       Running   0          20m

# kubectl get pvc
NAME             STATUS    VOLUME                   CAPACITY   ACCESS MODES   STORAGECLASS        AGE
disk-ssd-web-0   Bound     d-2ze9k2rrtcy92e97d3ie   20Gi       RWO            alicloud-disk-ssd   21m
disk-ssd-web-1   Bound     d-2ze5dwq6gyjnvdcrmtwg   20Gi       RWO            alicloud-disk-ssd   21m

扩容服务到3个Pod,显示会创建新的云盘卷:

# kubectl scale sts web --replicas=3
statefulset.apps "web" scaled

# kubectl get pod
NAME      READY     STATUS    RESTARTS   AGE
web-0     1/1       Running   0          24m
web-1     1/1       Running   0          23m
web-2     1/1       Running   0          2m

# kubectl get pvc
NAME             STATUS    VOLUME                   CAPACITY   ACCESS MODES   STORAGECLASS        AGE
disk-ssd-web-0   Bound     d-2ze9k2rrtcy92e97d3ie   20Gi       RWO            alicloud-disk-ssd   24m
disk-ssd-web-1   Bound     d-2ze5dwq6gyjnvdcrmtwg   20Gi       RWO            alicloud-disk-ssd   24m
disk-ssd-web-2   Bound     d-2zea5iul9f4vgt82hxjj   20Gi       RWO            alicloud-disk-ssd   2m

缩容服务到2个Pod,显示pvc/pv并不会一同删除:


# kubectl scale sts web --replicas=2
statefulset.apps "web" scaled

# kubectl get pod
NAME      READY     STATUS    RESTARTS   AGE
web-0     1/1       Running   0          25m
web-1     1/1       Running   0          25m

# kubectl get pvc
NAME             STATUS    VOLUME                   CAPACITY   ACCESS MODES   STORAGECLASS        AGE
disk-ssd-web-0   Bound     d-2ze9k2rrtcy92e97d3ie   20Gi       RWO            alicloud-disk-ssd   25m
disk-ssd-web-1   Bound     d-2ze5dwq6gyjnvdcrmtwg   20Gi       RWO            alicloud-disk-ssd   25m
disk-ssd-web-2   Bound     d-2zea5iul9f4vgt82hxjj   20Gi       RWO            alicloud-disk-ssd   3m

再次扩容到3个Pod,新的pod会复用原来的PVC/PV:

# kubectl scale sts web --replicas=3
statefulset.apps "web" scaled

# kubectl get pod
NAME      READY     STATUS    RESTARTS   AGE
web-0     1/1       Running   0          27m
web-1     1/1       Running   0          27m
web-2     1/1       Running   0          2m

# kubectl get pvc
NAME             STATUS    VOLUME                   CAPACITY   ACCESS MODES   STORAGECLASS        AGE
disk-ssd-web-0   Bound     d-2ze9k2rrtcy92e97d3ie   20Gi       RWO            alicloud-disk-ssd   27m
disk-ssd-web-1   Bound     d-2ze5dwq6gyjnvdcrmtwg   20Gi       RWO            alicloud-disk-ssd   27m
disk-ssd-web-2   Bound     d-2zea5iul9f4vgt82hxjj   20Gi       RWO            alicloud-disk-ssd   5m

删除StatefulSet服务,PVC、PV并不会随着删除;

验证服务稳定性

删除一个Pod前,Pod引用PVC:disk-ssd-web-1

# kubectl describe pod web-1 | grep ClaimName
ClaimName:  disk-ssd-web-1

# kubectl delete pod web-1
pod "web-1" deleted

删除Pod后,重新创建的Pod名字与删除的一致,且使用同一个PVC:

# kubectl get pod
NAME      READY     STATUS    RESTARTS   AGE
web-0     1/1       Running   0          29m
web-1     1/1       Running   0          6s
web-2     1/1       Running   0          4m

# kubectl describe pod web-1 | grep ClaimName
ClaimName:  disk-ssd-web-1

验证服务高可用性

云盘中创建临时文件:

# kubectl exec web-1 ls /data
lost+found

# kubectl exec web-1 touch /data/statefulset
# kubectl exec web-1 ls /data
lost+found
statefulset

删除Pod,验证数据持久性:

# kubectl delete pod web-1
pod "web-1" deleted

# kubectl exec web-1 ls /data
lost+found
statefulset

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【云原生 | 从零开始学Kubernetes】kubernetes之StatefulSet详解
【云原生 | 从零开始学Kubernetes】kubernetes之StatefulSet详解
93 0
《基于阿里云K8S服务快速构建DevOps流水线 资料下载》电子版地址
基于阿里云K8S服务快速构建DevOps流水线 资料下载
93 0
非容器应用与 K8s 工作负载服务网格化实践|学习笔记(二)
快速学习非容器应用与 K8s 工作负载服务网格化实践
77 0
非容器应用与 k8s工作负载的服务网格化实践(二)|学习笔记
快速学习非容器应用与 k8s工作负载的服务网格化实践(二)
54 0
非容器应用与K8s工作负载的服务网格化实践|学习笔记
快速学习非容器应用与K8s工作负载的服务网格化实践
49 0
【云原生 | 从零开始学Kubernetes】二十三、Kubernetes控制器Statefulset
StatefulSet 是为了管理有状态服务的问题而设计的
79 0
k8s-服务(clusterIP/NodePort/LoadBanlance)
clusterIP 类型的服务 NodePort 类型的服务 LoadBanlance 类型的服务
373 0
八、kubernetes 核心技术-Controller(StatefulSet)
kubernetes 核心技术-Controller(StatefulSet)
74 0
+关注
阚俊宝
阿里云容器服务开发,专注Kubernetes、Docker、云存储;
文章
问答
视频
来源圈子
更多
容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级 Kubernetes 容器化应用的全生命周期管理。容器服务 Kubernetes 版简化集群的搭建和扩容等工作,整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳的 Kubernetes 容器化应用运行环境。
+ 订阅
相关文档: 容器服务Kubernetes版
文章排行榜
最热
最新
相关课程
更多
相关电子书
更多
Kubernetes在大规模场景下的service性能优化实战
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
相关镜像