1.概述

无状态应用更关注群体,任何一个成员都可以被取代,有状态应用关注的是个体。用deployment控制器管理的nginx、myapp等都属于无状态应用,像mysql、redis、zookeeper等都属于有状态应用,他们有的还有主从之分、先后顺序之分.

statefulset控制器能实现有状态应用的管理,但实现起来也是非常麻烦,需要把运维管理过程写成脚本并注入到statefulset中才能使用,虽然互联网上有人做好了stateful的脚本,但是还是建议大家不要轻易的把redis、mysql等这样有状态的应用迁移到k8s上.

在k8s中,statefulset管理的应用有以下特效:

  1. a).每一个Pod稳定且有唯一的网络标识符;
  2. b).稳定且持久的存储设备;
  3. c).要求有序、平滑的部署和扩展;
  4. d).要求有序、平滑的终止和删除;
  5. e).有序的滚动更新,应该先更新从节点,再更新主节点;

statefulset由三个组件组成:

  1. a).headless service(无头的服务,即没名字);
  2. b).statefulset控制器;
  3. c).volumeClaimTemplate(存储卷申请模板,因为每个pod要有专用存储卷,而不能共用存储卷)

2.创建StatefulSet控制器

  1. kubectl explain sts
  2.  
  3. cat stateful-demo.yaml
  4. apiVersion: v1
  5. kind: Service
  6. metadata:
  7. name: myapp-svc
  8. labels:
  9. app: myapp-svc
  10. spec:
  11. ports:
  12. - port: 80
  13. name: web
  14. clusterIP: None
  15. selector:
  16. app: myapp-pod
  17. ---
  18. apiVersion: apps/v1
  19. kind: StatefulSet
  20. metadata:
  21. name: myapp
  22. spec:
  23. serviceName: myapp-svc
  24. replicas: 2
  25. selector:
  26. matchLabels:
  27. app: myapp-pod
  28. template:
  29. metadata:
  30. labels:
  31. app: myapp-pod
  32. spec:
  33. containers:
  34. - name: myapp
  35. image: ikubernetes/myapp:v1
  36. ports:
  37. - containerPort: 80
  38. name: web
  39. volumeMounts:
  40. - name: myappdata
  41. mountPath: /usr/share/nginx/html
  42. volumeClaimTemplates:
  43. - metadata:
  44. name: myappdata
  45. spec:
  46. accessModes: ["ReadWriteOnce"]
  47. #storageClassName: "gluster-dynamic"
  48. resources:
  49. requests:
  50. storage: 5Gi

volumeClaimTemplates:存储卷申请模板,为每个pod定义volume;为pod所在的名称空间自动创建pvc.

  1. kubectl apply -f stateful-demo.yaml
  2. kubectl get pods
  3. NAME READY STATUS RESTARTS AGE
  4. myapp-0 1/1 Running 0 4m
  5. myapp-1 1/1 Running 0 4m
  6.  
  7. # pod和service会被删除,但是pvc不会被删,所以还能恢复.
  8. kubectl delete -f stateful-demo.yaml
  9.  
  10. # 解析pod时的格式:pod名.svc名.namespace名.svc.cluster.local
  11. kubectl exec -it myapp-0 -- /bin/sh
  12. / # nslookup myapp-0.myapp-svc.default.svc.cluster.local
  13. nslookup: can't resolve '(null)': Name does not resolve
  14. Name: myapp-0.myapp-svc.default.svc.cluster.local
  15. Address 1: 10.244.1.110 myapp-0.myapp-svc.default.svc.cluster.local
  16.  
  17. # 将pod为5个
  18. kubectl scale sts myapp --replicas=5
  19. # 也可以用patch打补丁的方法来进行扩容和缩容
  20. kubectl patch sts myapp -p '{"spec":{"replicas":2}}'
  21. # 更新策略
  22. kubectl explain sts.spec.updateStrategy.rollingUpdate
  23. 假设有4个pod(pod0,pod1,pod2,pod3),如果设置partition为5,那么说明大于等于5的pod更新,四个Pod就都不更新;
  24. 如果partition为4,那么说明大于等于4的pod更新,即pod3更新,其他pod都不更新;
  25. 如果partiton为3,那么说明大于等于3的pod更新,那么就是pod2和pod3更新,其他pod都不更新.
  26. kubectl patch sts myapp -p '{"spec":{"updateStrategy":{"rollingUpdate":{"partition":4}}}}'
  27. kubectl describe sts myapp
  28. Update Strategy: RollingUpdate
  29. Partition: 4
  30. # 把myapp升级为v2版本
  31. kubectl set image sts/myapp myapp=ikubernetes/myapp:v2
  32. kubectl get pods myapp-4 -o yaml
  33. containerStatuses:
  34. image: ikubernetes/myapp:v2

可以参考github上别人做好的有状态应用:github k8s statefulSet redis|mysql

参考博客:http://blog.itpub.net/28916011/viewspace-2215046/

k8s之statefulSet-有状态应用副本集控制器的更多相关文章

  1. k8s系列---stateful(有状态应用副本集)控制器

    http://blog.itpub.net/28916011/viewspace-2215046/ 在应用程序中,可以分为有状态应用和无状态应用. 无状态的应用更关注于群体,任何一个成员都可以被取代. ...

  2. mongodb生产环境(副本集模式)集群搭建配置

    mongodb副本集模式由如下几部分组成: 1.路由实例mongos 2.配置实例configsvr 3.副本集集群replset(一主多从) tips: 1.以上实例都是mongod守护进程 2.以 ...

  3. Mongo--03 mongo副本集、备份与恢复

    目录 一.mongo副本集配置 二.查看副本集状态 三.副本集权重调整 四.创建节点 五.仲裁节点 六.mongo备份与恢复 七.准备测试数据 一.mongo副本集配置 1.创建节点目录和数据目录 # ...

  4. k8s入坑之路(15)kubernetes共享存储与StatefulSet有状态

    共享存储 docker默认是无状态,当有状态服务时需要用到共享存储 为什么需要共享存储: 1.最常见有状态服务,本地存储有些程序会把文件保存在服务器目录中,如果容器重新启停则会丢失. 2.如果使用vo ...

  5. k8s初面考点ReplicaSet副本集极限9连击你懂了吗?

    k8s初面考点ReplicaSet副本集极限9连击你懂了吗? k8s考点灵魂拷问9连击 考点之简单描述一下k8s副本集ReplicaSet有什么作用? 考点之为什么ReplicaSet将取代Repli ...

  6. 以实现MongoDB副本集状态的监控为例,看Telegraf系统中Exec输入插件如何编写部署

    既有的Telegraf 关于MongoDB的输入插件很难实现对副本集节点状态的监控,副本集节点状态有 PRIMARY.SECONDARY.RECOVERYING.ARBITER 等.现在我们尝试通过  ...

  7. 容器编排系统K8s之StatefulSet控制器

    前文我们聊到了k8s的configmap和secret资源的说明和相关使用示例,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14194944.html:今天 ...

  8. kubernetes上安装MongoDB-3.6.5集群副本集方式

    一.安装部署: 想直接一步创建集群的小伙伴直接按以下步骤安装(再往后是记录自己出过的错): 1.生成docker镜像: docker build -t 144.202.127.156/library/ ...

  9. k8s之StatefulSet介绍(六)

    复制有状态的Pod replicaSet通过一个pod模版创建多个pod副本.这些副本除了它们的名字和IP地址不同外,没有别的差异.如果pod模版里描述了一个关联到特定持久卷声明的数据卷,那么Repl ...

随机推荐

  1. Linux下出现Permission denied解决

    今天不想写前言,直接写解决办法 输入命令设置root密码 sudo passwd 得到的答复是 We trust you have received the usual lecture from th ...

  2. js判断滚动条是否已到页面最底部或顶部实例

    原文 本文实例讲述了js判断滚动条是否已到页面最底部或顶部的方法.分享给大家供大家参考.具体分析如下: 我们经常会看到很多的网站一个返回顶部效果就是当我们滚动条到指定位置时返回顶部出来了,否则就自动隐 ...

  3. 树状数组优化dp,一维排序,一维离散化

    #include<iostream> #include<cstdio> #include<algorithm> #include<vector> #in ...

  4. cast()、decimal(M,D) --SQL对查询字段保留小数位操作

    参考:http://database.51cto.com/art/201005/201651.htm http://www.lai18.com/content/1693593.html 直接上例子,以 ...

  5. Qt 串口通信 高速发送出错的解决方法总结

    使用网上的qextserialport-1.2类,自行开发多线程串口通信.开发的过程中,出现两个问题:   问题1:我用信号槽跨线程调用串口类MyCom 发送和接收数据,中间运行的时候,会内存错误,Q ...

  6. 最新create-react-native-app搭建rn教程

    一.前置条件: 1.nodeJS环境 2.npm 3.yarn 二.安装及项目初始化 1.安装脚手架 npm install -g create-react-native-app 2.用脚手架初始化创 ...

  7. docker网络(3)

    docker网络介绍 大量的互联网应用服务需要多个服务组件,这往往需要多个容器之间通过网络通信进行相互配合. docker 网络从覆盖范围可分为单个 host 上的容器网络和跨多个 host 的网络. ...

  8. uni-app相关

    uni-app 中以下组件的高度是固定的,不可修改: 导航栏高度固定为 44pxtabBar 高度固定为 56px 状态栏比较特殊,是一个变量 .status_bar{ height: var(--s ...

  9. Metasploit-初篇

    Metasploit metasploit 是一款开源的安全漏洞检测工具 渗透测试的操作系统 无需赘言,kali Linux发行版是目前最流行的安全操作系统;基于Debian的操作系统附带了600多个 ...

  10. 自然语言处理NLP学习笔记一:概念与模型初探

    前言 先来看一些demo,来一些直观的了解. 自然语言处理: 可以做中文分词,词性分析,文本摘要等,为后面的知识图谱做准备. http://xiaosi.trs.cn/demo/rs/demo 知识图 ...