k8sStatefulSet控制器
一、StatefulSet概述
应用程序存在有状态和无状态两种类别,因为无状态类应用的pod资源可按需增加、减少或重构,而不会对由其提供的服务产生除了并发相应能力之外的其他严重影响。pod资源的常用控制器中,deployment、replicaset和daemonset等常用于管理无状态应用。但实际情况是,应用本身就是分布式的集群,各应用实例彼此之间存在着关联关系,甚至是次序、角色方面的相关性,其中的每个实例都有其自身的独特性而无法轻易由其他实例所取代。
1、stateful应用和stateless应用
应用程序与用户、设备、其他应用程序或外部组件进行通信时,根据其是否需要记录前一次或多次通信中的相关信息以作为下一次通信的分类标准,可以将那些需要记录信息的应用程序称为有状态(stateful)应用,而无须记录的则称为无状态(stateless)应用。
状态是进程的时间属性。无状态意味着一个进程不必跟踪过去的交互操作,本质上可以说它是一个纯粹的功能性行为。相应地,有状态则意味着进程存储了以前交互过程的记录,并且可以基于它对新的请求进行响应。至于状态信息被保存在内存中。
存储是表述持久保存数据的方法,现今通常是指机械硬盘或ssd设备。若进程仅需操作内存中的数据,则表示其无须进行磁盘I/O操作;如果产生了I/O操作,则通常意味着数据的只读访问或读写访问行为。
2、statefulset的特性
statefulset简称sts,是pod资源控制器的一种实现,用于部署和扩展有状态应用的pod资源,确保他们的运行顺序及每个pod资源的唯一性。其与ReplicaSet控制器不同的是,虽然所有pod对象都基于同一个spec配置所创建,但statefulset需要为每个pod维持一个唯一且固定的标识符,必要时还要为其创建专用的存储卷。StatefulSet主要适用于那些依赖于下列类型资源的应用程序:
稳定且唯一的网络标识符
稳定且持久的存储
有序、优雅地部署和扩展
有序、优雅地删除和终止
有序而自动地滚动更新。
一般来说,一个典型、完整可用的StatefulSet通常由三个组件构成:Headless Service、StatefulSet和volumeClaimTemplate。其中,Headless Service用于为pod资源标识符生成可解析的DNS资源记录,StatefulSet用于管控pod资源,volumeClaimTemplate则基于静态或动态的PV供给方式为pod资源提供专有且固定的存储。
二、StatefulSet基础应用
1、创建statefulset对象
一个完整得分statefulset控制器需要由一个headless service、一个statefulset和一个volumeClaimTemplate组成。其中,Headless Service用于为pod资源标识符生成可解析的DNS资源记录,statefulset用于管控pod资源,volumeClaimTemplate则基于静态或动态的pv供给方式为pod资源提供专有且固定的存储:
apiVersion: v1
kind: Service
metadata:
name: demo-svc
labels:
app: myapp-svc
spec:
ports:
- port:
name: web
clusterIP: None
selector:
app: myapp-pod
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: myapp
spec:
serviceName: myapp-svc
replicas:
selector:
matchLabels:
app: myapp-pod
template:
metadata:
labels:
app: myapp-pod
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v5
ports:
- containerPort:
name: web
volumeMounts:
- name: myappdata
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: myappdata
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: "managed-nfs-storage"
resources:
requests:
storage: 2Gi
2、pod资源标识符及存储卷
由StatefulSet控制器创建的pod资源拥有固定、唯一的标识符和专用存储卷,即便重新调度或终止后重建,其名称也依然保持不变,且此前的存储卷及其数据不会丢失。
pod资源的固定标识符:
[root@master stateful]# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
myapp- / Running 22h app=myapp-pod,controller-revision-hash=myapp-6c6b4f98d5,statefulset.kubernetes.io/pod-name=myapp-
myapp- / Running 22h app=myapp-pod,controller-revision-hash=myapp-6c6b4f98d5,statefulset.kubernetes.io/pod-name=myapp-
pod资源的主机名同其资源名称相同,这些名称标识会由StatefulSet资源相关的Headless Service资源创建为dns资源记录,其域名格式为$(service_name).$(namespace).svc.cluster.local。
Headless Service资源借助于SRV记录来引用真正提供服务的后端pod资源的主机名称,进行指向包含pod IP地址的记录条目。此外,由statefulset控制器管控的pod资源终止后会有控制器自动进行重建,虽然其IP地址存在变化的可能性,但它的名称标识在重建后会保持不变。因此,当客户端尝试向statefulset资源的pod成员发出访问请求时,应该针对Headless Service资源的CNAME记录进行,它指向的SRV记录包含了当前处于就绪状态的pod资源,考虑到名称标识固定不变,也可以让客户端直接向SRV资源记录发出请求。
k8sStatefulSet控制器的更多相关文章
- k8s-StatefulSet控制器-十四
		
一.StatefulSet概述 RC.Deployment.DaemonSet都是面向无状态的服务,它们所管理的Pod的IP.名字,启停顺序等都是随机的,而StatefulSet管理所有有状态的服务, ...
 - k8s StatefulSet控制器-独立存储
		
k8s-StatefulSet控制器-独立存储 1. StatefulSet控制器-独立存储 独享存储:StatefulSet的存储卷使用VolumeClaimTemplate创建,称为卷申请模板,当 ...
 - ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库
		
在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...
 - ABP文档 - Mvc 控制器
		
文档目录 本节内容: 简介 AbpController基类 本地化 其它 过滤 异常处理和结果包装 审计日志 验证 授权 工作单元 反伪造 模型绑定器 简介 ABP通过nuget包Abp.Web.Mv ...
 - 关于VS2015 ASP.NET MVC添加控制器的时候报错
		
调试环境:VS2015 数据库Mysql WIN10 在调试过程中出现类似下两图的同学们,注意啦. 其实也是在学习的过程中遇到这个问题的,找了很多资料都没有正面的解决添加控制器的时候报错的问题,还是 ...
 - ASP.NET Core 中文文档 第四章 MVC(4.2)控制器操作的路由
		
原文:Routing to Controller Actions 作者:Ryan Nowak.Rick Anderson 翻译:娄宇(Lyrics) 校对:何镇汐.姚阿勇(Dr.Yao) ASP.NE ...
 - ASP.NET Core 中文文档 第四章 MVC(4.5)测试控制器逻辑
		
原文: Testing Controller Logic 作者: Steve Smith 翻译: 姚阿勇(Dr.Yao) 校对: 高嵩(Jack) ASP.NET MVC 应用程序的控制器应当小巧并专 ...
 - ASP.NET Core 中文文档 第四章 MVC(4.4)依赖注入和控制器
		
原文: Dependency Injection and Controllers 作者: Steve Smith 翻译: 刘浩杨 校对: 孟帅洋(书缘) ASP.NET Core MVC 控制器应通过 ...
 - AngularJS 第四天----控制器
		
控制器的作用 今天和大家学习AngularJS中控制器方面的知识,本文会给出一些例子来说明如何使用AngularJS的控制器.在开始我们的例子之前,首先说说AngularJS控制器的作用.简单的来说A ...
 
随机推荐
- vue60秒倒计时
			
wait:"60", content:"验证码", canClick: true, daojishi(){ if(!this.canClick) return ...
 - Prefix and Suffix Search
			
Given many words, words[i] has weight i. Design a class WordFilter that supports one function, WordF ...
 - HTML+CSS常用代码(笔记)
			
注释标签:对代码进行说明 <!-- 单行注释,也可以对多行文字进行注释 --> 常用格式标签 <b>加粗</b> <i>斜体</i> < ...
 - Lazy的SDL教程 翻译----Lesson 22 Timing
			
原文:http://lazyfoo.net/tutorials/SDL/22_timing/index.php Timing 计时 Last Updated 3/10/14 Another impor ...
 - WPF 异步加载窗体
			
加载某个界面时,需要获取数据,而数据返回的时间比较长,这个时候可以异步加载界面. 1.在该窗体的加载事件(Load)中编写以下代码: new Thread(p=>{DataBinding();} ...
 - CentOS7-部署kubernetes
			
1 环境准备 节点 主机名 IP OS Master k8s-master 192.168.57.1 centos 7 Node1 k8s-nod ...
 - Codeforces 1236C. Labs
			
传送门 注意到 $f(X,Y)+f(Y,X)$ 是一个定值(因为每个元素都不相同) 所以如果能让 $f(X,Y)$ 与 $f(Y,X)$ 尽可能接近,那么一定是最优的 所以可以这样构造:把 $n^2$ ...
 - JavaScript设计模式(策略模式)
			
策略模式的定义是:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换.将不变的部分和变化的部分隔开是每个设计模式的主题,策略模式也不例外,策略模式的目的就是将算法的使用与算法的实现分离开来 ...
 - tracert命令详解_tracert结果详解_tracert命令使用详解
			
17:06:40 正在等待客服售后工程师令狐冲接入,您可以先简单描述所要咨询的问题,如果长时间没有响应,您也可以 重新选择客服 . 17:06:42 您好,客服售后工程师令狐冲为您服务.售后工程师令狐 ...
 - HTML5中新增加的结构元素、网页元素和全局属性
			
HTML5新增的结构元素(新增的都是块元素,独占一行) 1) header 定义了文档的头部区域 <header> <h1>网站标题<h1> </header ...