MaxCloud User Docs
演示登录
  • Welcome
    • 介绍
    • 快速开始
  • 使用说明
    • 集群管理
      • 导入集群
      • 创建集群
      • 关联授权
      • 集群功能
    • 项目管理
      • 事件订阅
    • 应用管理
      • 创建应用
      • 灰度发布
      • 持续集成
  • 客户端工具
    • kubemax
    • kubectl
    • 自定义客户端
  • MrMax
    • MrMax客户端使用指南
    • Cybercore
    • SDK Release Version
  • 开发者指南
    • MaxLang语言基础
    • MaxLang内置方法
    • MaxLang操作资源示例
  • 社区活动
    • 技术交流
      • 2023/05/28 亚马逊云科技 Community Day 深圳站
    • 技术文章
      • 2023.5 记一次EKS 1.22->1.26 升级
      • 2023.8 创建EKS后要关注的几个事情
    • Kubernetes Workshop
      • 基础篇
        • Docker学习环境
        • 开始使用Docker
        • 开始使用Kubernetes
      • 实战篇
        • Pod:运行于Kubernetes中的容器
        • ReplicationController:部署托管的pods
        • Service:让客户端发现pod并与之通信
        • Volumes:给containers挂载磁盘
        • ConfigMap和Secret:配置应用程序
        • Deployment: 声明式地升级应用
        • StatefulSet:部署有状态的多副本应用
      • 实践篇
        • Helm Charts(上)
          • 什么是Helm和Chart?
          • 使用Helm
        • Helm Charts(中)
          • 创建自己的chart
          • Chart模版构造和语法
          • 使用仓库管理chart
        • Helm Charts(下)
          • 一个实际的项目
          • 最后,Helm不是必须的
        • 持续集成(Gitops)
由 GitBook 提供支持
在本页
  • 部署有状态的集群应用
  • 思考题

这有帮助吗?

  1. 社区活动
  2. Kubernetes Workshop
  3. 实战篇

StatefulSet:部署有状态的多副本应用

很高兴大家能做到这里,这是容器kubernetes内容最后一个章节了!而且非常简单,恭喜大家!

部署有状态的集群应用

针对有状态的应用,多数是数据有状态,例如mongodb副本集等,我们希望数据能够在pod扩容、缩容时磁盘数据不会被丢弃,能够复用磁盘。我们使用StatefulSet完成这些。

# cat kubia-statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet         #使用了stateful
metadata: 
  name: kubia
spec:
  serviceName: kubia
  replicas: 2
  selector:
    matchLabels:
     app: kubia
  template:
    metadata:
      labels:
        app: kubia
    spec:
      containers:
      - name: kubia
        image: luksa/kubia-pet
        ports:
        - name: http
          containerPort: 8080
        volumeMounts:
        - name: data
          mountPath: /var/data
  volumeClaimTemplates:   #为每个pod申请了磁盘  
  - metadata:
      name: data
    spec:
      resources:
        requests:
          storage: 20Gi
      accessModes:
      - ReadWriteOnce
      storageClassName: "alicloud-disk-available"

创建它看看,大家能够注意到,每个pod名字不再是随机码了,而是有了编号,他们也就是有了固定的名字了,所以对应的磁盘也是有了名字

$ k create -f kubia-statefulset.yaml
statefulset.apps/kubia created

$ k get all
NAME          READY   STATUS    RESTARTS   AGE
pod/kubia-0   1/1     Running   0          61s
pod/kubia-1   1/1     Running   0          46s

NAME                     READY   AGE
statefulset.apps/kubia   2/2     61s

$ k get pvc
NAME           STATUS   VOLUME                   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
data-kubia-0   Bound    d-j6c3dilgxismppu271ed   20Gi       RWO            disk           7m39s
data-kubia-1   Bound    d-j6c9x6t7z31woktn8jl3   20Gi       RWO            disk           7m24s

这样他们在随着容量变化时,总是能够对号入座,是不是很简单呢?另外StatefulSet相比ReplicaSet,操作基本都是相同的,所以扩缩容等管理我们就不重复了

# 如
$ kubectl scale statefulset kubia --replicas=3                                                                                                                                 1 ↵
statefulset.apps/kubia scaled

StatefulSet在缩容时,pod卸下的磁盘不会被清理掉,因为扩容时还会再被复用,这是固定的机制。大家要记得这个点。

Cool!其实StatefulSet是很简单的,但是很多服务都会用到它,需要多练习。

好了,课程到这里告一段落,再次恭喜大家完成了这么多的内容。

思考题

  • 谈谈你对ReplicaSet/StatefulSet的理解

  • Deployment和上面两个set有关联么,谈谈你的理解

  • 谈谈你对kubernetes的体验感受

上一页Deployment: 声明式地升级应用下一页实践篇

最后更新于2年前

这有帮助吗?