一  了解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的配置如下所示

  

apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: kubia
spec:
serviceName: kubia
replicas: 2
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:
- metadata:
name: data
spec:
resources:
requests:
storage: 1Mi
accessModes:
- ReadWriteOnce
  • statefulset基本和RC,RS,Deployment很类似拥有副本数量模版以及标签并且还可以定义关联的headless的svc
  • 同时在下面引入了一个新的字段用来定义statefulset的每个pod的pvc 

  

  2.2  创建三个hostpath类型的pvc

kind: List
apiVersion: v1
items:
- apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-a
labels:
type: local
spec:
capacity:
storage: 10Mi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
hostPath:
path: "/tmp/pv-a"
- apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-b
labels:
type: local
spec:
capacity:
storage: 10Mi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
hostPath:
path: "/tmp/pv-b"
- apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-c
labels:
type: local
spec:
capacity:
storage: 10Mi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
hostPath:
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

[root@node01 Chapter10]# cat kubia-service-public.yml
apiVersion: v1
kind: Service
metadata:
name: kubia-service
spec:
selector:
app: kubia
ports:
- port: 80
targetPort: 8080

    2.3.2  headless的service的mainifest

[root@node01 Chapter10]# cat kubia-service-public.yml
apiVersion: v1
kind: Service
metadata:
name: kubia-service
spec:
selector:
app: kubia
ports:
- port: 80
targetPort: 8080

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

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

  2.6 与statefulset关联的pod进行通信

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

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的数据持久化就不存在了
  • 当出现无法删除的时候我们需要使用强制删除的命令,将其删除  
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的主机名,创建一个记录如下所示

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. 双端口RAM和多模块存储器

    目录 双端口RAM 存取周期 双端口RAM 多模块存储器 普通存储器 单体多字存储器 多体并行的存储器 高位交叉编址的多体存储器 低位交叉编址的多提存储器 为什么要这么弄? 高位 低位 流水线(考试常 ...

  2. 【jenkins】构建工作集

    构建工作集,参数化工作任务 1.New Item 2.配置新的工作任务 3.关联测试用例的远程仓库 4.添加任务构建后,触发发送报告信息 5.新建单个测试套件 6.添加触发轮询任务 7.关联测试集 8 ...

  3. C#数据结构-线索化二叉树

    为什么线索化二叉树? 对于二叉树的遍历,我们知道每个节点的前驱与后继,但是这是建立在遍历的基础上,否则我们只知道后续的左右子树.现在我们充分利用二叉树左右子树的空节点,分别指向当前节点的前驱.后继,便 ...

  4. 学习Python之数据类型

    格式化字符串 字符串格式化是一种非常简洁的特性,它能让我们动态更新字符串中的内容.假设我们有从服务器获取的用户信息,并希望根据该信息显示自定义消息,第一个想法是应用字符串连接之类的东西. first_ ...

  5. 寻找两个数组中的公共元素Java程序代码

    package lianxi; import java.util.*; public class UnionSearch { public static void main(String[] args ...

  6. 从零开始手把手教你使用javascript+canvas开发一个塔防游戏01地图创建

    项目演示 项目演示地址: 体验一下 项目源码: 项目源码 代码结构 本节做完效果 游戏主页面 index.html <!DOCTYPE html PUBLIC "-//W3C//DTD ...

  7. 使用aspnet_compiler对web程序进行预编译

    前言 本例使用的是asp.net中的webform项目,使用.net框架为.net3.5 操作步骤 正常的web项目发布步骤 发布方法:文件系统 目标位置:发布后的项目文件的路径,可自定义. 打开wi ...

  8. 管理Windows上的路由表

    路由器获取目录帮助手册: route /? 修改路由的时候最高以管理员运行cmd程序 默认路由只是临时生效的,只要管理员禁用在启用网卡,默认路由就消失了(重启计算机默认路由也会消失),可以在后面添加一 ...

  9. Zookeeper什么,它可以做什么?看了这篇就懂了

    前言 什么是ZooKeeper,你真的了解它吗.我们一起来看看吧~ 什么是 ZooKeeper ZooKeeper 是 Apache 的一个顶级项目,为分布式应用提供高效.高可用的分布式协调服务,提供 ...

  10. Abp(net core)+easyui+efcore实现仓储管理系统——出库管理之八(五十七)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统--ABP总体介绍(一) abp(net core)+ ...