一  了解Statefulset

  1.1  对比statefulset与RS以及RC的区别以及相同点

    • Statefulset是有状态的,而RC以及RS等是没有状态的
    • Statefulset是有序的,拥有规则的主机名和名称,而RS以及RC是无序的
    • 通常为Statefulset提供的服务一般都是创建headless service,通过headless service可以为statefulset提供唯一的DNS记录,例如一个在default的命名空间里面名为A-0的pod,提供服务的为foo的headless service,我们则可以使用a-0.foo.default.svc.cluster.local,而在ReplicaSet是行不通的
    • 当一个Statefulset管理的pod异常消失后,Statefulset会创建一个与之一摸一样的pod,包括名称,pod名称,以及后端引用的pvc等(但是新的pod不要求调度到之前pod所在的节点上)

 

    1.2  Statefulset扩所容方面的差别 

    • Statefulset的扩缩容方面,扩容方面,一般都是按照正顺往上叠加,例如已经存在2个pod它们的序号分别为0,1那么在扩容的时候下一个被增加的就是2
    • 缩容方面,可以指定哪个索引的pod被缩容,没指定就会从最高的索引删除

  1.3  Statefulset的存储方面

    • 在statefulset中每个pod都会有自己的存储,所以需要存储与pod强解耦合,可以使用之前学习到的pv以及pvc,并且每个pod都需要创建一个pvc并有一个pv与之对
    • statefulset的做法是在创建的配置的时候就创建一个或者多个pvc,而声明的pv可以由管理员提前创建也可以由系统里面的配置程序提前配置
    • 在pod扩容这块,当扩容一个pod的时候需要创建不仅仅是pod的资源包括持久化存储等
    • 到pod缩容这块,删除pod的时候不能将其关联的存储也一并删除了,这样的话在重新扩容的时候,之前pod的持久化存储的数据就无法再恢复    

  

  1.4  statefulset的保障

    • 由于statefulset的特殊性,它需要自己去独占很多系统资源或者kubernets资源,所以有一项是必须保证的,就是有2个完全相同的标记不能同时出现,一个pod必须保证statefulset的at-most-one的定义

二   创建statefulset

  2.1  一个statefulset的mainifest的配置如下所示

  

  1. apiVersion: apps/v1beta1
  2. kind: StatefulSet
  3. metadata:
  4. name: kubia
  5. spec:
  6. serviceName: kubia
  7. replicas: 2
  8. template:
  9. metadata:
  10. labels:
  11. app: kubia
  12. spec:
  13. containers:
  14. - name: kubia
  15. image: luksa/kubia-pet
  16. ports:
  17. - name: http
  18. containerPort: 8080
  19. volumeMounts:
  20. - name: data
  21. mountPath: /var/data
  22. volumeClaimTemplates:
  23. - metadata:
  24. name: data
  25. spec:
  26. resources:
  27. requests:
  28. storage: 1Mi
  29. accessModes:
  30. - ReadWriteOnce
  • statefulset基本和RC,RS,Deployment很类似拥有副本数量模版以及标签并且还可以定义关联的headless的svc
  • 同时在下面引入了一个新的字段用来定义statefulset的每个pod的pvc 

  

  2.2  创建三个hostpath类型的pvc

  1. kind: List
  2. apiVersion: v1
  3. items:
  4. - apiVersion: v1
  5. kind: PersistentVolume
  6. metadata:
  7. name: pv-a
  8. labels:
  9. type: local
  10. spec:
  11. capacity:
  12. storage: 10Mi
  13. accessModes:
  14. - ReadWriteOnce
  15. persistentVolumeReclaimPolicy: Recycle
  16. hostPath:
  17. path: "/tmp/pv-a"
  18. - apiVersion: v1
  19. kind: PersistentVolume
  20. metadata:
  21. name: pv-b
  22. labels:
  23. type: local
  24. spec:
  25. capacity:
  26. storage: 10Mi
  27. accessModes:
  28. - ReadWriteOnce
  29. persistentVolumeReclaimPolicy: Recycle
  30. hostPath:
  31. path: "/tmp/pv-b"
  32. - apiVersion: v1
  33. kind: PersistentVolume
  34. metadata:
  35. name: pv-c
  36. labels:
  37. type: local
  38. spec:
  39. capacity:
  40. storage: 10Mi
  41. accessModes:
  42. - ReadWriteOnce
  43. persistentVolumeReclaimPolicy: Recycle
  44. hostPath:
  45. path: "/tmp/pv-c"
  • 这里创建了一个pvc列表,里面包含了三个创建的pv
  • metadata里面有个type类型的字段如果为local,则statefulset的pv只会出现在pod被调度到的节点上面
  • 每个pv里面都包含该卷的大小,访问模式
  • 如果是hostpath类型的卷,需要添加一个hostPath参数,并且指定hostpath的存储路径

  2.3  为了方便我们对statefulset的访问,我们同时创建了一个clusterIp的service以及headless的IP,其mainifest分别如下所示

    2.3.1  clusterIP的service的mainifest

  1. [root@node01 Chapter10]# cat kubia-service-public.yml
  2. apiVersion: v1
  3. kind: Service
  4. metadata:
  5. name: kubia-service
  6. spec:
  7. selector:
  8. app: kubia
  9. ports:
  10. - port: 80
  11. targetPort: 8080

    2.3.2  headless的service的mainifest

  1. [root@node01 Chapter10]# cat kubia-service-public.yml
  2. apiVersion: v1
  3. kind: Service
  4. metadata:
  5. name: kubia-service
  6. spec:
  7. selector:
  8. app: kubia
  9. ports:
  10. - port: 80
  11. targetPort: 8080

  2.4  这下所有需要的资源全部都已经创建好了,我们现在来看一下集群中资源的状况

  1. [root@node01 Chapter10]# k get pv
  2. NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
  3. pv-a 10Mi RWO Recycle Bound default/data-kubia-1 110m
  4. pv-b 10Mi RWO Recycle Bound default/data-kubia-2 110m
  5. pv-c 10Mi RWO Recycle Bound default/data-kubia-0 110m
  6.  
  7. [root@node01 Chapter10]# k get pvc
  8. NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
  9. data-kubia-0 Bound pv-c 10Mi RWO 106m
  10. data-kubia-1 Bound pv-a 10Mi RWO 105m
  11. data-kubia-2 Bound pv-b 10Mi RWO 35m
  12.  
  13. [root@node01 Chapter10]# k get svc
  14. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  15. kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 21d
  16. kubia ClusterIP None <none> 80/TCP 46m
  17. kubia-service ClusterIP 10.110.201.9 <none> 80/TCP 67m
  18.  
  19. [root@node01 Chapter10]# k get statefulset
  20. NAME READY AGE
  21. kubia 3/3 106m
  22.  
  23. [root@node01 Chapter10]# tree /tmp/
  24. /tmp/
  25. ├── pv-a
  26.    └── kubia.txt
  27. ├── pv-b
  28.    └── kubia.txt
  29. └── pv-c
  • 第一个是我们创建的所有pv
  • 第二个是statefulset创建的pvc,并且与我们创建的pv相绑定了
  • 第三个是我们创建的2个svc
  • 第四个是我们在业务在一些列运行之后产生的存储实际所在的位置

  2.6 与statefulset关联的pod进行通信

 之前提到过我们可以通过k proxy来进行与pod通信,也可以直接与api服务器进行通信从而,我们依旧使用k proxy与pod通信,具体方案如下

  1. curl -X POST -d "the sun is not shining" localhost:8001/api/v1/namespaces/default/services/kubia-service/proxy/

  2.7 删除pod以及缩容扩容statefulset里面的pod

  由于statefulset管理也是的pod,这里我只阐述其中几点与RS/RC以及deployment不同的地方,其余的没提到不出意外的话都是一样的

  • 扩容pod的时候一般都是从索引的最高数添加,缩容的时候也是同样,如果指定的话就会删除指定的pod
  • 扩容pod的时候,如果有存储的话,同时也需要添加pv以及pvc
  • 缩容pod的时候,不需要删除pv以及pvc,因为一旦删除之后,之前那个pod的数据持久化就不存在了
  • 当出现无法删除的时候我们需要使用强制删除的命令,将其删除  
  1. k delete po kubia-0 --force --grace-period 0

  2.8 一个需要注意的地方就是,犹如statefulset的特殊性,集群内部部署pod之间并无法直接通信,如果一个客户端需要拿到它们存储的数据所有数据的话,就需要对所有的pod都拿一次数据,并且由于后端挂载的servicde会随机的请求落到不同的pod上,实际上一个pod在不借助任何的外部工具下拿到所有的pod比上面描述的要男的多,这里提供一种比较好的方法用来拿到集群里面所有pod的数据方法,原理图如下所示

  • 每个pod里面需要运行一个支持headless服务的SRV的记录查询
  • 请求落到任意的pod的时候,该pod会去访问所有pod的数据
  • 之后将数据统一的回复给客户端

  2.9 下面来介绍一下SRV的记录

  srv记录用来指向提供服务的服务器主机名和端口号,kubernets通过一个headless service创建SRV记录来指向pod的主机名,创建一个记录如下所示

  1. k run -it srvlookup --image=tutum/dnsutils --rm --restart=Never --dig SRV kubia.default.svc.cluster.local

  

       

kubernets之statefulset资源的更多相关文章

  1. 二十六、StatefulSet资源控制器

    StatefulSet资源控制器 一.statefulset介绍 StatefulSet 是为了解决有状态服务的问题而设计的资源控制器. 匹配 Pod name ( 网络标识 ) 的模式为:(stat ...

  2. kubernets之Deployment资源

    一  声明式的升级应用 1.1  回顾一下kubernets集群里面部署一个应用的形态应该是什么样子的,通过一副简单的图来描述一下 通过RC或者RS里面的模板创建了三个pod,之后通过一个servci ...

  3. kubernets之secret资源

    一  对于一些保密度比较高的文件,k8s又是如何存储的呢? 针对那些保密度比较高的配置文件,例如证书以及一些认证配置不能直接存储在configmap中,而是需要存储在另外一种资源中,需要对存储在里面的 ...

  4. kubernets之Ingress资源

    一  Ingress集中式的kubernets服务转发控制器 1.1  认识Ingress的工作原理 注意:图片来源于kubernets in action一书,如若觉得侵权,请第一时间联系博主进行删 ...

  5. kubernets之服务资源

    一  服务集群内部或者客户端与pod的通信桥梁   kubernets集群的内部pod访问为啥不能使用传统的IP:PORT的形式? pod是短暂的,它们会随时启动或者关闭,原因可能是pod所在的节点下 ...

  6. kubernets之job资源

    一  介绍job资源 1.1   前面介绍的RC,RS,DS等等,管控的pod都是需要长期持久的运行的应用,但是尝试考虑另外一种场景,在微服务的场景下,有些pod的作用就是需要 执行完一些命令之后正常 ...

  7. kubernets之计算资源

    一  为pod分配cpu,内存以及其他的资源 1.1  创建一个pod,同时为这个pod分配内存以及cpu的资源请求量 apiVersion: v1 kind: Pod metadata: name: ...

  8. kubernetes 基本概念和资源对象汇总

    kubernetes 基本概念和知识点脑图 基本概念 kubernetes 中的绝大部分概念都抽象成kubernets管理的资源对象,主要有以下类别: Master : Master节点是kubern ...

  9. 14.statefulset服务

    有状态的控制器有以下几个特点 稳定,独特的网络标识符. 稳定,持久的存储. 有序,优雅的部署和扩展. 有序的自动滚动更新. 使用限制 StatefulSet是1.9之前的beta资源,在1.5之前的任 ...

随机推荐

  1. Spring Boot 的2020最后一击:2.4.1、2.3.7、2.2.12 发布

    近日,Spring Boot官方发布了本年度最后一次版本更新,主要针对目前维护的三个版本: 2.4.x:第一个bug修复版本 2.4.1 2.3.x:常规维护版本 2.3.7 2.2.x:常规维护版本 ...

  2. Elasticsearch 新机型发布,性能提升30%

    跨年迎双节,2020 年最后一次囤货的机会来啦! Elasticsearch Service 星星海新机型发布,更高性能,更低价格. 爆款机型限时特惠,帮助您顺畅体验 Elasticsearch 云上 ...

  3. Clickhouse 在大数据分析平台 - 留存分析上的应用

    导语 | 本文实践了对于千万级别的用户,操作总数达万级别,每日几十亿操作流水的留存分析工具秒级别查询的数据构建方案.同时,除了留存分析,对于用户群分析,事件分析等也可以尝试用此方案来解决. 文章作者: ...

  4. maven-assembly-plugin插件打jar包时排出指定的依赖

    pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...

  5. 一段小代码秒懂C++右值引用和RVO(返回值优化)的误区

    关于C++右值引用的参考文档里面有明确提到,右值引用可以延长临时变量的周期.如: std::string&& r3 = s1 + s1; // okay: rvalue referen ...

  6. Spark性能调优篇八之shuffle调优

    1 task的内存缓冲调节参数 2 reduce端聚合内存占比 spark.shuffle.file.buffer                     map task的内存缓冲调节参数,默认是3 ...

  7. sqli-labs第5关布尔盲注pyhton脚本

    import requests import os #此函数先判断数据库长度 def length(url,str): num = 1 while True: str_num = '%d' %num ...

  8. Thymeleaf是个什么东东?

    Thymeleaf是面向Web和独立环境的现代服务器端Java模板引擎,能够处理HTML,XML,JavaScript,CSS甚至纯文本. Thymeleaf的主要目标是提供一个优雅和高度可维护的创建 ...

  9. prim algorithm

    function re=biaoji(j,biao) %判断j点是否已被标记 l=length(biao); for i=1:l if j==biao(i) re=1; return; end end ...

  10. C# 生成6位短信验证码

    1 private string VerifyCode() 2 { 3 Random random = new Random(); 4 return random.Next(100000, 99999 ...