一、StatefulSet概述

RC、Deployment、DaemonSet都是面向无状态的服务,它们所管理的Pod的IP、名字,启停顺序等都是随机的,而StatefulSet管理所有有状态的服务,比如MySQL、MongoDB集群等。
StatefulSet所管理的Pod拥有固定的Pod名称,启停顺序,在StatefulSet中,Pod名字称为网络标识(hostname),还必须要用到共享存储。
在Deployment中,与之对应的服务是service,而在StatefulSet中与之对应的headless service,headless service,即无头服务,与service的区别就是它没有Cluster IP,解析它的名称时将返回该Headless Service对应的全部Pod的Endpoint列表。

  StatefulSet其应用场景包括:

  • 稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现;
  • 稳定的网络标志,即Pod重新调度后其PodName和HostName不变,基于Headless Service(即没有Cluster IP的Service)来实现;
  • 有序部署,有序扩展,即Pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依次依次进行(即从0到N-1,在下一个Pod运行之前所有之前的Pod必须都是Running和Ready状态),基于init containers来实现;
  • 有序收缩,有序删除(即从N-1到0);

从上面的应用场景可以发现,StatefulSet由以下几个部分组成:

  • 用于定义网络标志(DNS domain)的Headless Service
  • 用于创建PersistentVolumes的volumeClaimTemplates
  • 定义具体应用的StatefulSet

二、组件

  三个组件:headless service、StatefulSet、volumeClaimTemplate

  (1)headless service

在deployment中,每一个pod是没有名称,是无序的;而statefulset中要求是必须有序的,每一个pod的名称必须是固定的。当节点挂了、删了,重建之后的标识符是不变的,每一个节点的节点名称是不能改变的。pod名称是作为识别pod的唯一标识符,必须保证其标识符的稳定持久有效;

为了实现标识符的稳定唯一,就需要一个headless service 解析直达后端pod的ip地址,它还会还给每个pod配置一个唯一的名称。

  (2)volumeClaimTemplate

大部分有状态副本集都会用到持久存储,但是因为数据是不一样的,每个节点都需要自己专用的存储。在deployment中pod模板中创建的存储卷是一个共享的存储卷,多个pod使用同一个存储卷,而statefulset作为面向有状态的服务,定义中的每一个pod都不能使用同一个存储卷,由此基于pod模板创建pod是不适用的,这就需要引入volumeClainTemplate,当在使用statefulset创建pod时,会自动生成一个PVC,从而请求绑定一个PV,从而有自己专用的存储卷。

实验环境:四台主机  

    192.168.3.100   master
    192.168.3.101    node01
    192.168.3.102    node02
    192.168.3.103    store

  

三、statefulSet使用

  查看资源定义清单字段:

  [root@master ~]# kubectl explain statefulset

  [root@master ~]# kubectl explain statefulset.spec
  KIND: StatefulSet
  VERSION: apps/v1

  RESOURCE: spec <Object>

  DESCRIPTION:
    Spec defines the desired identities of pods in this set.

    A StatefulSetSpec is the specification of a StatefulSet.

  FIELDS:

    podManagementPolicy <string>     #Pod管理策略
    replicas <integer>           #副本数量
    revisionHistoryLimit <integer>        #历史版本限制
    selector <Object> -required-          #选择器,必选项
    serviceName <string> -required-      #服务名称,必选项
    template <Object> -required-         #模板,必选项
    updateStrategy <Object>          #更新策略
    volumeClaimTemplates <[]Object>      #存储卷申请模板,列表对象形式

  1、创建pv

  先清除之前的pvc、pv、deploy、pod、svc...

  (1)pv资源定义清单:

  [root@master volumes]# vim pv-demo.yaml

  

  

  

  (2)创建

  [root@master volumes]# kubectl apply -f pv-demo.yaml

  

  (2)创建stateful

  (1)资源定义清单

  [root@master statefulset]# vim stateful-demo.yaml

  

  

  (2)创建

  [root@master statefulset]# kubectl apply -f stateful-demo.yaml

  

  查看:

  

  

  (3)删除

   现在有3个pod,删除的时候是从myapp-2开始进行删除的(2-1-0),关闭是逆向关闭(0-1-2);

   现在开两个连接,一个删pod,另一个监控pod状态;

  

  

  然后,现在开两个连接,一个创建pod,另一个监控pod状态;

  

  

  此时PVC不会删除,仍然是存在的,只要还是同一个statefulset,再重新创建pod时,依旧会重新去绑定原来的pvc;

  

  (3)滚动更新、扩展伸缩、版本升级

  (1)

  这里每一个pod的名称都是可以解析的;

   解析格式:

    pod_name.service_name.ns_name.cluster.local

  

  (2)pod的规模扩展、缩容

  扩展:顺序;

  [root@master statefulset]# kubectl scale sts myapp --replicas=5  #扩容至5个

  [root@master ~]# kubectl get pods -w  #动态监控pod,可见先创建myapp-3,再创建myapp-4

  

  

  缩容:逆序;

  [root@master statefulset]# kubectl patch sts myapp -p '{"spec":{"replicas":2}}'  #向配置文件打补丁的方式缩容,缩容至2个;

  

  

  (3)更新策略和版本升级

  查看资源定义清单字段:

  [root@master statefulset]# kubectl explain sts.spec.updateStrategy.rollingUpdate.partition

  以partition方式进行更新,如果更新值为2,只有myapp编号大于等于2的才会进行更新,实现类似于金丝雀部署方式,partition默认为0;

  更新时逆序进行;

  a、重新扩容至5个

  [root@master statefulset]# kubectl patch sts myapp -p '{"spec":{"replicas":5}}'

  

  b、修改更新策略

  [root@master ~]# kubectl patch sts myapp -p '{"spec":{"updateStrategy":{"rollingUpdate":{"partition":4}}}}'  #更新partition大于等于4的;

  c、更新版本

  [root@master ~]# kubectl set image sts/myapp myapp=ikubernetes/myapp:v2

  查看:

  

  

  可见,编号大于等于4的已经更新了,小于4的没有更新;

  (4)将剩余的其他Pod也更新版本

    只需要将更新策略的partition值改为0即可;

  [root@master ~]# kubectl patch sts myapp -p '{"spec":{"updateStrategy":{"rollingUpdate":{"partition":0}}}}'

  

  可见已经都已经更新;

k8s-StatefulSet控制器-十四的更多相关文章

  1. k8s StatefulSet控制器-独立存储

    k8s-StatefulSet控制器-独立存储 1. StatefulSet控制器-独立存储 独享存储:StatefulSet的存储卷使用VolumeClaimTemplate创建,称为卷申请模板,当 ...

  2. 5.深入k8s:StatefulSet控制器

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 在上一篇中,讲解了容器持久化存储,从中我们知道什么是PV和PVC,这一篇我们讲通过Sta ...

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

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

  4. thinkPHP 空模块和空操作、前置操作和后置操作 详细介绍(十四)

    原文:thinkPHP 空模块和空操作.前置操作和后置操作 详细介绍(十四) 本章节:介绍 TP 空模块和空操作.前置操作和后置操作 详细介绍 一.空模块和空操作 1.空操作 function _em ...

  5. 【转】花开正当时,十四款120/128GB SSD横向评测

    原文地址:http://www.expreview.com/19604-all.html SSD横评是最具消费指导意义的评测文章,也是各类热门SSD固态硬盘的决斗疆场.SSD评测在行业内已经有不少网站 ...

  6. Linux时间子系统之(十四):tick broadcast framework

    专题文档汇总目录 Notes:BroadcastTick作为cpuidle的waker,硬件基础.BroadcastTick嵌入在当前系统Tick框架中.BroadcastTick设备初始化:周期性T ...

  7. 第十四章——循环神经网络(Recurrent Neural Networks)(第二部分)

    本章共两部分,这是第二部分: 第十四章--循环神经网络(Recurrent Neural Networks)(第一部分) 第十四章--循环神经网络(Recurrent Neural Networks) ...

  8. 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 十四 ║ VUE 计划书 & 我的前后端开发简史

    ---新内容开始--- 番外 大家周一好呀,又是元气满满的一个周一呀!感谢大家在周一这个着急改Bug的黄金时期,抽出时间来看我的博文哈哈哈,时间真快,已经到第十四篇博文了,也很顺顺(跌跌)利利 (撞撞 ...

  9. 实验十四 第九组 张燕~杨蓉庆~杨玲 Swing图形界面组件

    实验十四  Swing图形界面组件 8-11-29 理论知识 Swing和MVC设计模式 (1)设计模式(Design pattern)是设计者一种流行的 思考设计问题的方法,是一套被反复使用,多数人 ...

随机推荐

  1. docker日志输出文件大小设置以及文件个数限制

    问题描述: 今天有同事运行了一个docker容器,不多时就导致宿主机硬盘直接撑爆,消耗了120G,发生的很是突然. 问题排查: 后续查阅资料,发现是因为docker中的某个进程一直在持续输出,而这些输 ...

  2. ViewPager 无限循环遇到的坑 viewpager.setOffscreenPageLimit(2);

    viewpager.setOffscreenPageLimit(limit);这个方法,是表示viewpage除了当前显示的页面外,左右个预加载的页面个数,也就是 为limit=2时表示当前一共加载了 ...

  3. SQL存储过程实例详解

    本文用3个题目,从建立数据库到创建存储过程,详细讲解数据库的功能. 题目1         学校图书馆借书信息管理系统建立三个表:         学生信息表:student 字段名称 数据类型 说明 ...

  4. 图片异步载入之 Android-Universal-Image-Loader

    今天在做项目的时候用了之前写的图片载入类.尽管也能实现缓存什么的.可是在载入大图的时候非常慢非常慢.于是上网找解决方式,准备优化一下,无意中发现了Android-Universal-Image-Loa ...

  5. firebug console说明

    控制台(Console)是Firebug的第一个面板,也是最重要的面板,主要作用是显示网页加载过程中产生各类信息. 一.显示信息的命令 Firebug内置一个console对象,提供5种方法,用来显示 ...

  6. 一个能自己主动搜索源文件并自己主动推导的Makefile

    今天看了一天的makefile的写法.东拼西凑.好不easy写出了一个makefile.颇有成就感,记录下来,以备温习之用. 如果有两个头文件文件夹 header1,header2;两个cpp文件文件 ...

  7. C++简单实现对象引用计数示例(转)

    C++简单实现对象引用计数示例 #include <iostream> #include <stdio.h> using namespace std; class String ...

  8. eImage(仅两行代码实现输出从数据库中查询到的二进制字段)标签

    功能: 专门用于向浏览器输出从数据库中查询到的二进制字段.支持通用的几十种文件类型 别名为edoc 使用方法: <chtml><eimage id=书包名type=类型>key ...

  9. LeetCode_3Sum

    一.题目 3Sum Total Accepted: 45112 Total Submissions: 267165My Submissions Given an array S of n intege ...

  10. 12.怎样自学Struts2发送邮件和验证补充[视频]

    12.怎样自学Struts2发送邮件和验证补充[视频] 之前写了一篇"打算做一个视频教程探讨怎样自学计算机相关的技术",优酷上传不了,仅仅好传到百度云上: http://pan.b ...