[置顶] kubernetes资源类型--PetSets/StatefulSet
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的更多相关文章
- [置顶]
kubernetes资源类型--持久化存储Persistent Volume和Persistent Volume Claim
概念 存储管理跟计算管理是两个不同的问题.理解每个存储系统是一件复杂的事情,特别是对于普通用户来说,有时并不需要关心各种存储实现,只希望能够安全可靠地存储数据. 为了简化对存储调度,K8S对存储的供应 ...
- [置顶]
kubernetes资源类型--ingress
Ingress在K8S1.1之前还没有. 概念 Ingress是一种HTTP方式的路由转发机制,为K8S服务配置HTTP负载均衡器,通常会将服务暴露给K8S群集外的客户端. Ingress是一个允许入 ...
- [置顶]
kubernetes资源类型--secret和Service Account
secret 概念 secret对象类型主要目的是保存和处理敏感信息/私密数据,比如密码,OAuth tokens,ssh keys等信息.将这些信息放在secret对象中比 直接放在pod或dock ...
- [置顶]
kubernetes资源类型--DaemonSet
概念 DaemonSet能够让所有(或者特定)的节点运行同一个pod. 当节点加入到K8S集群中,pod会被(DaemonSet)调度到该节点上运行,当节点从K8S集群中被移除,被DaemonSet调 ...
- [置顶]
kubernetes资源类型--Volume
在Docker的设计实现中,容器中的数据是临时的,即当容器被销毁时,其中的数据将会丢失.如果需要持久化数据,需要使用Docker数据卷挂载宿主机上的文件或者目录到容器中.在K8S中,当Pod重建的时候 ...
- [置顶]
kubernetes资源类型--pod和job
pod Pod是K8S的最小操作单元,一个Pod可以由一个或多个容器组成:整个K8S系统都是围绕着Pod展开的,比如如何部署运行Pod.如何保证Pod的数量.如何访问Pod等. 特点 Pod是能够被创 ...
- [置顶]
kubernetes资源类型--RC和RS
Replication Controller(RC) RC是K8S中的另一个核心概念,应用托管在K8S后,K8S需要保证应用能够持续运行,这是RC的工作内容. 主要功能 确保pod数量:RC用来管理正 ...
- [置顶]
kubernetes资源类型--Service
为了适应快速的业务需求,微服务架构已经逐渐成为主流,微服务架构的应用需要有非常好的服务编排支持.K8S中的核心要素Service便提供了一套简化的服务代理和发现机制,天然适应微服务架构. 实现原理 S ...
- [置顶]
kubernetes资源类型--deployment
Deployment(中文意思为部署.调度)提供了一种更加简单的更新RC和Pod的机制,K8S版本1.2实现的.通过在Deployment中描述所期望的集群状态,Deployment Controll ...
随机推荐
- Thread suspend()挂起resume()恢复
import javax.swing.*;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.Actio ...
- hadoop2.5.2学习及实践笔记(六)—— Hadoop文件系统及其java接口
文件系统概述 org.apache.hadoop.fs.FileSystem是hadoop的抽象文件系统,为不同的数据访问提供了统一的接口,并提供了大量具体文件系统的实现,满足hadoop上各种数据访 ...
- 【bzoj4884】[Lydsy2017年5月月赛]太空猫 dp
原文地址:http://www.cnblogs.com/GXZlegend/p/6825431.html 题目描述 太空猫(SpaceCat)是一款画面精致.玩法有趣的休闲游戏,你需要控制一只坐在迷你 ...
- [Codeforces Round #513 by Barcelona Bootcamp (rated, Div. 1 + Div. 2) ](A~E)
A: 题目大意:给你一个数字串,每个数字只可以用一次,求最多可以组成多少个电话号码(可以相同),电话号码第一个数字为$8$,且长度为$11$ 题解:限制为$8$的个数和总长度,直接求 卡点:无 C++ ...
- 【转】百度统计js被劫持用来DDOS Github
原文链接:http://drops.wooyun.org/papers/5398 今天中午刷着全国最大的信息安全从业人员同性交友社区zone.wooyun.org的时候,忽然浏览器每隔2秒就不断的弹窗 ...
- 如何用js让表格的行也能拖动
行拖动的实现思路非常简单,选中一行,往上拖就与上面的行交换位置,往下拖就与下面的行交换位置.问题是如何得到交换行.我见过一个非常详细的教程,它会把表格里的每一行的高度与Y坐标计算出来,换言之,都时是比 ...
- clips 前端 js 倒计时 获取验证码的按钮
<a href="javascript:void(0);" onclick="get_captcha()" class="btn btn-def ...
- 用Sublime搭建Python开发环境(windows)
1.安装Python 3 去官网下载Python 3,网址:https://www.python.org/downloads/release/python-363/ 双击安装,勾选添加到环境变量. 有 ...
- spring boot 2.0之后默认的连接池 HIkariCP介绍
HIkariCP链接池比之传统的Tomcat JDBC datasource .c3p0 datasource 等传统链接池优势太大,在获取链接释放链接,执行效率上面高出很多,这个产品的口号是“快速. ...
- 【ZOJ4063】Tournament(构造)
题意:n个人要打m轮比赛 每一轮每个人都要有一个对手.而且每个对手只能打一次.假设a与b打了,c与d打了, 那么后面的任意一轮如果a与c打了,那么b就必须和d打 问是否存在方案,输出字典序最小的一组, ...