[置顶] 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 ...
随机推荐
- 【linxu】部署docker容器虚拟化平台
实验所涉内容 Docker 概述 部署 docker 容器虚拟化平台 docker 平台基本使用方法 创建docker镜像和发布镜像方法 Container 容器端口映射 一 Docker 概述 Do ...
- 雅礼集训 Day6 T2 Equation 解题报告
Equation 题目描述 有一棵\(n\)个点的以\(1\)为根的树,以及\(n\)个整数变量\(x_i\).树上\(i\)的父亲是\(f_i\),每条边\((i,f_i)\)有一个权值\(w_i\ ...
- 《c程序设计语言》读书笔记-4.1-判断字符串在另一个字符串中的位置
#include <io.h> #include <stdio.h> #include <string.h> #include <stdlib.h> # ...
- bzoj 3309 DZY Loves Math 莫比乌斯反演
DZY Loves Math Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1303 Solved: 819[Submit][Status][Dis ...
- Eclipse Tomcat 配置问题
问题描述: Tomcat能启动,ecplise的Console无报错,但是打开http://localhost:8080/报404错误 端口是8080没错,地址也没错,重启了tomcat还是报错,但是 ...
- AGC019-E Shuffle and Swap
给定两个长度为\(n\le 10^5\)的\(01\)串 \(A, B\), 满足 \(1\) 的数量相等 求通过下列方式将\(A\)变成\(B\)的概率 (mod意义下) 构造序列\(a,b\). ...
- 经典js框架
http://requirejs.org/ http://durandaljs.com/ http://knockoutjs.com/index.html http://www.jeasyui.com ...
- 生成一个空白BMP的简单代码【转】
转自:http://blog.chinaunix.net/uid-15063109-id-4275395.html 做图像处理时,有时需要临时生成图使用.以下是生成320x240 24位图的一个简单的 ...
- 解决win10下微信开发者工具点击错位问题
在系统设置->显示->更改文本.应用等项目的大小选项中将百分比改为100%即可.
- (1)OracleClient数据库操作(淘汰)
一.数据库连接 Oracle 数据提供程序,位于System.Data.OracleClient 命名空间.( .NET 4 以后的版本,会将不在维护和更新了) 第一步:引入命名空间 在程序的开头写上 ...