PetSet首次在K8S1.4版本中,在1.5更名为StatefulSet。除了改了名字之外,这一API对象并没有太大变化。

注意:以下内容的验证环境为CentOS7、K8S版本1.5.2,并部署SkyDNS。

http://blog.csdn.net/liyingke112/article/details/76685794

概念

在云原生应用的体系里,有下面两组近义词;第一组是无状态(stateless)、牲畜(cattle)、无名(nameless)、可丢弃(disposable);第二组是有状态(stateful)、宠物(pet)、有名(having name)、不可丢弃(non-disposable)。

RC和RS主要是控制无状态服务,Pod的名字是随机设置的,重建后新的Pod名字变了,名字和部署在哪儿都不重要,重要的只是Pod总数。

PetSet/StatefulSet是用来部署和管理有状态服务。PetSet/StatefulSet中的每个Pod的名字都是事先确定的,不能更改,能提供固定的DNS名称、pod级别的持久化存储和有序pod,Pod名字是用来关联与该Pod对应的状态。

应用场景

有状态服务:数据库服务MySQL和PostgreSQL

集群化管理服务Zookeeper、etcd等有状态服务。

作为一种比普通容器更稳定可靠的模拟虚拟机的机制。传统的虚拟机正是一种有状态的宠物,运维人员需要不断地维护它,容器刚开始流行时,用容器来模拟虚拟机使用,所有状态都保存在容器里,而这已被证明是非常不安全、不可靠的。使用PetSet/StatefulSet,Pod仍然可以通过漂移到不同节点提供高可用,而存储也可以通过外挂的存储来提供高可靠性,PetSet/StatefulSet做的只是将确定的Pod与确定的存储关联起来保证状态的连续性。

特性

pod稳定的唯一网络标识

拥有固定的:pod名称、主机名、DNS域名等。注意pod的IP地址会变化的。

如果PetSet/StatefulSet名是web,replicas为2,则pod命名:web-0,web-1。并拥有固定的主机名和域名,完整域名格式为pod名.service名.namespace名.svc.域名。

当pod被迁移重新启动后,将保持原有的pod名称重新启动。例如web-0的Pod失败后,K8s将在集群中重启一个同名为web-0的pod。

该域名在集群内可用。这与k8s service的域名有所区别,带主机名的域名能定位到某一个pod主机,而service级别的域名只能定位到某一个服务。

通过一种叫HeadlessService的特殊Service来实现的。和普通Service相比,Headless Service没有Cluster IP,用于为一个集群内部的每个成员提供一个唯一的DNS名字,用于集群内部成员之间通信。

不部署HeadlessService的话,不是使用访问,但可以使用IP地址访问。

pod拥有稳定的持久存储

PetSet/StatefulSet内每一个pod都拥有各自的pvc持久化存储。

该特性能更好的支持分布式集群应用的数据同步,如类似etcd集群这样的有状态应用,节点间是需要进行数据同步的,当etcd集群的某个pod节点重启后,依然能够重新挂载原有的节点数据,重新保持数据复制、同步。

有序启动pod

PetSet/StatefulSet启动pod时,按固定的顺序去启动的,其总是优先启动数字编号更小的Pod。例如:web-0优先于web-1启动,web-1优先于web-2启动。

对于启动顺序有要求的有状态服务来说,该特性是非常重要的。

使用限制

必须部署PV和PVC

为了让pod拥有稳定的持久存储,必须使用持久化存储PV和PVC,增加了复杂性。

若PV使用nfs等无法通过调用API来创建存储的网络存储,PVC要在创建PetSet/StatefulSet1前静态创建,如果先创建PetSet/StatefulSet1,而没有创建PVC的话,将会自动创建PVC,但相关参数无法修改;

若为aws-ebs、vSphere、openstack Cinder等可以通过API调用来动态创建存储的虚拟存储,PVC除了可以通过静态的方式创建外,还可以通过StorageClass进行动态创建。

需要注意的是,动态创建出来的PV,默认的回收策略是delete,及在删除数据的同时,还会把虚拟存储卷删除。

删除或缩容PetSet/StatefulSet不会删除对应的存储卷容量。这是为了保证数据的安全,因为对待PetSet/StatefulSet的数据普通的做法比自动回收资源更实用。

必须部署Headless Service

和普通Service相比,Headless Service没有Cluster IP,在PetSet/StatefulSet中起到pod域名解析功能。

如果没有部署HeadlessService的话,PetSet/StatefulSet下的pod,无法通过域名进行访问。

必须手动更新pod

只能通过手动的方式升级PetSet/StatefulSet。

无法使用kubectl edit方式、类似与deployment(kubectl set image)和RC方式升级。能正常使用kubectledit编辑在线yaml文件,即使重启pod所在的node节点,也无法生效。

创建时命名规则有要求

如下面的例子:

StatefulSet:StatefulSet名称为lykops-sfs,卷名为pvc

PV:pv-lykops-sfs-{0,1}

PVC:pvc-lykops-sfs-{0,1}

规则如下:

PVC和PV的命名规则为:资源类型-StatefulSet名称-副本数序号(从0开始)

创建时PV和PVC的yaml规则有要求

除了命名规则外,还需要保证访问accessModes、resources这两个一样

按照以上规则创建后,可以看到PV和PVC能关联起来

扩容难

在扩容前,需要先部署好对应的PV和PVC

节点宕机,pod无法切换

当pod所在节点出现宕机,无法切换到其他node上运行。解决办法是恢复该节点工作。

创建范例

PV

cat << EOF > pv-lykops-sfs-0.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-lykops-sfs-0
labels:
type: nfs
app: pv
version: v1
spec:
capacity:
storage: 1Gi
accessModes:
-ReadWriteMany
persistentVolumeReclaimPolicy: Recycle
nfs:
path: /data
server: 192.168.20.128
readOnly: false
EOF
kubectl create -f pv-lykops-sfs-0.yaml

PVC

cat << EOF > pvc-lykops-sfs-0.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-lykops-sfs-0
labels:
type: nfs
app: pvc
version: v1
spec:
accessModes:
-ReadWriteMany
resources:
requests:
storage: 1Gi
EOF
kubectl create -f pvc-lykops-sfs-0.yaml

Headless Service

cat << EOF >lykops-sfs-headlessservice.yaml
apiVersion: v1
kind: Service
metadata:
name: lykops-sfs
labels:
software: apache
project: lykops
app: lykops-sfs
version: v1
spec:
ports:
-port: 80
name: apache
clusterIP: None
selector:
software: apache
project: lykops
app: lykops-sfs
version: v1
EOF
kubectl create -f lykops-sfs-headlessservice.yaml

StatefulSet

cat << EOF > lykops-sfs.yaml
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: lykops-sfs
labels:
software: apache
project: lykops
app: lykops-sfs
version: v1
spec:
serviceName: lykops-sfs
template:
metadata:
labels:
software: apache
project: lykops
app: lykops-sfs
version: v1
name: lykops-sfs
spec:
containers:
- name: lykops-sfs
image: web:apache
ports:
- containerPort: 80
name: apache
volumeMounts:
- name: pvc
mountPath: /data/
volumeClaimTemplates:
-metadata:
name: pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
EOF
kubectl create -f lykops-sfs.yaml

[置顶] kubernetes资源类型--PetSets/StatefulSet的更多相关文章

  1. [置顶] kubernetes资源类型--持久化存储Persistent Volume和Persistent Volume Claim

    概念 存储管理跟计算管理是两个不同的问题.理解每个存储系统是一件复杂的事情,特别是对于普通用户来说,有时并不需要关心各种存储实现,只希望能够安全可靠地存储数据. 为了简化对存储调度,K8S对存储的供应 ...

  2. [置顶] kubernetes资源类型--ingress

    Ingress在K8S1.1之前还没有. 概念 Ingress是一种HTTP方式的路由转发机制,为K8S服务配置HTTP负载均衡器,通常会将服务暴露给K8S群集外的客户端. Ingress是一个允许入 ...

  3. [置顶] kubernetes资源类型--secret和Service Account

    secret 概念 secret对象类型主要目的是保存和处理敏感信息/私密数据,比如密码,OAuth tokens,ssh keys等信息.将这些信息放在secret对象中比 直接放在pod或dock ...

  4. [置顶] kubernetes资源类型--DaemonSet

    概念 DaemonSet能够让所有(或者特定)的节点运行同一个pod. 当节点加入到K8S集群中,pod会被(DaemonSet)调度到该节点上运行,当节点从K8S集群中被移除,被DaemonSet调 ...

  5. [置顶] kubernetes资源类型--Volume

    在Docker的设计实现中,容器中的数据是临时的,即当容器被销毁时,其中的数据将会丢失.如果需要持久化数据,需要使用Docker数据卷挂载宿主机上的文件或者目录到容器中.在K8S中,当Pod重建的时候 ...

  6. [置顶] kubernetes资源类型--pod和job

    pod Pod是K8S的最小操作单元,一个Pod可以由一个或多个容器组成:整个K8S系统都是围绕着Pod展开的,比如如何部署运行Pod.如何保证Pod的数量.如何访问Pod等. 特点 Pod是能够被创 ...

  7. [置顶] kubernetes资源类型--RC和RS

    Replication Controller(RC) RC是K8S中的另一个核心概念,应用托管在K8S后,K8S需要保证应用能够持续运行,这是RC的工作内容. 主要功能 确保pod数量:RC用来管理正 ...

  8. [置顶] kubernetes资源类型--Service

    为了适应快速的业务需求,微服务架构已经逐渐成为主流,微服务架构的应用需要有非常好的服务编排支持.K8S中的核心要素Service便提供了一套简化的服务代理和发现机制,天然适应微服务架构. 实现原理 S ...

  9. [置顶] kubernetes资源类型--deployment

    Deployment(中文意思为部署.调度)提供了一种更加简单的更新RC和Pod的机制,K8S版本1.2实现的.通过在Deployment中描述所期望的集群状态,Deployment Controll ...

随机推荐

  1. Thread suspend()挂起resume()恢复

    import javax.swing.*;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.Actio ...

  2. hadoop2.5.2学习及实践笔记(六)—— Hadoop文件系统及其java接口

    文件系统概述 org.apache.hadoop.fs.FileSystem是hadoop的抽象文件系统,为不同的数据访问提供了统一的接口,并提供了大量具体文件系统的实现,满足hadoop上各种数据访 ...

  3. 【bzoj4884】[Lydsy2017年5月月赛]太空猫 dp

    原文地址:http://www.cnblogs.com/GXZlegend/p/6825431.html 题目描述 太空猫(SpaceCat)是一款画面精致.玩法有趣的休闲游戏,你需要控制一只坐在迷你 ...

  4. [Codeforces Round #513 by Barcelona Bootcamp (rated, Div. 1 + Div. 2) ](A~E)

    A: 题目大意:给你一个数字串,每个数字只可以用一次,求最多可以组成多少个电话号码(可以相同),电话号码第一个数字为$8$,且长度为$11$ 题解:限制为$8$的个数和总长度,直接求 卡点:无 C++ ...

  5. 【转】百度统计js被劫持用来DDOS Github

    原文链接:http://drops.wooyun.org/papers/5398 今天中午刷着全国最大的信息安全从业人员同性交友社区zone.wooyun.org的时候,忽然浏览器每隔2秒就不断的弹窗 ...

  6. 如何用js让表格的行也能拖动

    行拖动的实现思路非常简单,选中一行,往上拖就与上面的行交换位置,往下拖就与下面的行交换位置.问题是如何得到交换行.我见过一个非常详细的教程,它会把表格里的每一行的高度与Y坐标计算出来,换言之,都时是比 ...

  7. clips 前端 js 倒计时 获取验证码的按钮

    <a href="javascript:void(0);" onclick="get_captcha()" class="btn btn-def ...

  8. 用Sublime搭建Python开发环境(windows)

    1.安装Python 3 去官网下载Python 3,网址:https://www.python.org/downloads/release/python-363/ 双击安装,勾选添加到环境变量. 有 ...

  9. spring boot 2.0之后默认的连接池 HIkariCP介绍

    HIkariCP链接池比之传统的Tomcat JDBC datasource .c3p0 datasource 等传统链接池优势太大,在获取链接释放链接,执行效率上面高出很多,这个产品的口号是“快速. ...

  10. 【ZOJ4063】Tournament(构造)

    题意:n个人要打m轮比赛 每一轮每个人都要有一个对手.而且每个对手只能打一次.假设a与b打了,c与d打了, 那么后面的任意一轮如果a与c打了,那么b就必须和d打 问是否存在方案,输出字典序最小的一组, ...