Kubernetes学习笔记(九):StatefulSet--部署有状态的多副本应用
StatefulSet如何提供稳定的网络标识和状态
ReplicaSet中的Pod都是无状态,可随意替代的。又因为ReplicaSet中的Pod是根据模板生成的多副本,无法对每个副本都指定单独的PVC。
来看一下StatefulSet如何解决的。
提供稳定的网络标识
StatefulSet创建Pod都有一个从零开始的顺序索引,这会体现在Pod的名称和主机名上,同样也会体现在Pod对应的固定存储上。所以这些名字是可预先知道的,不同于ReplicaSet的随机生成名字。
因为他们的名字都是固定的,而且彼此状态都不同,通常会操作他们其中的一个。如此情况,一般都会创建一个与之对应的headless Service,通过这个Service,每个Pod将拥有独立的DNS记录。
扩容一个StatefulSet会使用下一个顺序索引创建一个新的Pod,缩容会删除索引值最高的。并且缩容任何时候只会操作一个Pod。
如何提供稳定的存储
StatefulSet可以拥有一个或多个PVC模板,这些PVC会在创建Pod前创建出来,绑定到一个Pod实例上。
扩容的时候会创建一个Pod以及若干个PVC,删除的时候只会删除Pod。StatefulSet缩容时不会删除PVC,扩容时会重新挂上。
使用StatefulSet
定义三个PV
定义pv-(a|b|c)
# stateful-pv-list.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-a
spec:
capacity:
storage: 1Mi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
hostPath:
path: /tmp/pva
---
apiVersion: v1
kind: PersistentVolume
# 以下忽略
headless的Service
# stateful-service-headless.yaml
apiVersion: v1
kind: Service
metadata:
name: rwfile
spec:
clusterIP: None
selector:
app: rwfile
ports:
- port: 80
定义StatefulSet
先创建两个Pod副本。使用volumeClaimTemplates定义了PVC模板。
# stateful.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: rwfile
spec:
replicas: 2
serviceName: rwfile
selector:
matchLabels:
app: rwfile
template:
metadata:
labels:
app: rwfile
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/orzi/rwfile
name: rwfile
ports:
- containerPort: 8000
volumeMounts:
- name: data
mountPath: /tmp/data
volumeClaimTemplates:
- metadata:
name: data
spec:
resources:
requests:
storage: 1Mi
accessModes:
- ReadWriteOnce
创建三个PV,一个headless的Service,一个StatefulSet
-> [root@kube0.vm] [~] k create -f stateful-pv-list.yaml
persistentvolume/pv-a created
persistentvolume/pv-b created
persistentvolume/pv-c created
-> [root@kube0.vm] [~] k create -f stateful-service-headless.yaml
service/rwfile created
-> [root@kube0.vm] [~] k create -f stateful.yaml
statefulset.apps/rwfile created
查看
-> [root@kube0.vm] [~] k get all -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/rwfile-0 1/1 Running 0 12s 10.244.1.52 kube1.vm <none> <none>
pod/rwfile-1 1/1 Running 0 8s 10.244.2.56 kube2.vm <none> <none>
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 81s <none>
service/rwfile ClusterIP None <none> 80/TCP 23s app=rwfile
NAME READY AGE CONTAINERS IMAGES
statefulset.apps/rwfile 2/2 12s rwfile registry.cn-hangzhou.aliyuncs.com/orzi/rwfile
查看PV和PVC,可以看到已经有两个PVC绑定了PV
-> [root@kube0.vm] [~] k get pv,pvc -o wide
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE VOLUMEMODE
persistentvolume/pv-a 1Mi RWO Recycle Bound default/data-rwfile-0 7m20s Filesystem
persistentvolume/pv-b 1Mi RWO Recycle Bound default/data-rwfile-1 7m20s Filesystem
persistentvolume/pv-c 1Mi RWO Recycle Available 7m20s Filesystem
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE VOLUMEMODE
persistentvolumeclaim/data-rwfile-0 Bound pv-a 1Mi RWO 6m55s Filesystem
persistentvolumeclaim/data-rwfile-1 Bound pv-b 1Mi RWO 6m51s Filesystem
请求Pod
启动代理
-> [root@kube0.vm] [~] k proxy
Starting to serve on 127.0.0.1:8001
发送请求
-> [root@kube0.vm] [~] curl http://localhost:8001/api/v1/namespaces/default/pods/rwfile-0/proxy/ -d "a=123"
data stored in : rwfile-0
-> [root@kube0.vm] [~] curl http://localhost:8001/api/v1/namespaces/default/pods/rwfile-0/proxy/
a=123
删除测试
删除rwfile-0,然后查看,从时间上看确实是被删除重建的。
-> [root@kube0.vm] [~] k delete po rwfile-0
pod "rwfile-0" deleted
-> [root@kube0.vm] [~] k get po
NAME READY STATUS RESTARTS AGE
rwfile-0 1/1 Running 0 7s
rwfile-1 1/1 Running 0 19m
看一下之前存储的数据还在不在
-> [root@kube0.vm] [~] curl http://localhost:8001/api/v1/namespaces/default/pods/rwfile-0/proxy/
a=123
还是在的,此次测试实际上也证明了StatefulSet提供了稳定的网络标识和存储。
发现StatefulSet的伙伴节点
使用DNS解析headless的Service的FQDN。
例子以后再写吧。。
如何处理节点失效
除非确定节点无法运行或者不会在访问,否则不要强制删除有状态的Pod
k delete pod rwfile-0 --force --grace-period 0
小结
- StatefulSet创建Pod都有一个从零开始的顺序索引
- 通常会创建一个与StatefulSet对应的headless Service。
- 扩容一个StatefulSet会使用下一个顺序索引创建一个新的Pod,缩容会删除索引值最高的。
- 新建StatefulSet需要指定headless ServiceName和volumeClaimTemplates。
- 使用DNS发现StatefulSet的伙伴节点
- 强制删除:
k delete pod rwfile-0 --force --grace-period 0
Kubernetes学习笔记(九):StatefulSet--部署有状态的多副本应用的更多相关文章
- Kubernetes 学习笔记(一):基础概念
个人笔记,仅本人查阅使用,不保证正确. 零.微服务 微服务架构专注于应用解耦合,通过将应用彻底地组件化和服务化,每个微服务只包含一个非常小的功能,比如权限管理.日志收集等等.由这一组微服务组合起来,提 ...
- Kubernetes学习笔记(八):Deployment--声明式的升级应用
概述 本文核心问题是:如何升级应用. 对于Pod的更新有两种策略: 一是删除全部旧Pod之后再创建新Pod.好处是,同一时间只会有一个版本的应用存在:缺点是,应用有一段时间不可用. 二是先创建新Pod ...
- OGG学习笔记04-OGG复制部署快速参考
OGG学习笔记04-OGG复制部署快速参考 源端:Oracle 10.2.0.5 RAC + ASM 节点1 Public IP地址:192.168.1.27 目标端:Oracle 10.2.0.5 ...
- ActionBarSherlock学习笔记 第一篇——部署
ActionBarSherlock学习笔记 第一篇--部署 ActionBarSherlock是JakeWharton编写的一个开源框架,使用这个框架,可以实现在所有的Android ...
- 多线程学习笔记九之ThreadLocal
目录 多线程学习笔记九之ThreadLocal 简介 类结构 源码分析 ThreadLocalMap set(T value) get() remove() 为什么ThreadLocalMap的键是W ...
- MDX导航结构层次:《Microsoft SQL Server 2008 MDX Step by Step》学习笔记九
<Microsoft SQL Server 2008 MDX Step by Step>学习笔记九:导航结构层次 SQL Server 2008中SQL应用系列及BI笔记系列--目录索 ...
- python3.4学习笔记(九) Python GUI桌面应用开发工具选择
python3.4学习笔记(九) Python GUI桌面应用开发工具选择 Python GUI开发工具选择 - WEB开发者http://www.admin10000.com/document/96 ...
- Go语言学习笔记九: 指针
Go语言学习笔记九: 指针 指针的概念是当时学C语言时了解的.Go语言的指针感觉与C语言的没啥不同. 指针定义与使用 指针变量是保存内存地址的变量.其他变量保存的是数值,而指针变量保存的是内存地址.这 ...
- go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin)
目录 go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin) zipkin使用demo 数据持久化 go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin ...
随机推荐
- MP4视频流base64数据转成Blob对象
网上一大堆对图片base64转Blob.File的方法 很少有视频mp4转的,可能是因为原理相同的原因吧!但在项目中针对视频流base64转Blob对象时,花了好长时间才成功,特专门记录一下! APP ...
- 创建HttpFilter与理解多个Filter代码的执行顺序
1.自定义的HttpFilter,实现Filter接口 HttpFilter package com.aff.filter; import java.io.IOException; import ja ...
- JAVA自学笔记(2)
Java跳跃级知识储备 1.Mathod新篇章 1.0进制转化(方法中的参数其实就是局部变量,在方法中定义的变量要赋初值) import java.util.Scanner; public class ...
- 一、【python】机器学习基础
专有名词 机器学习 (machine learning) 预测分析 (predictive analytics) 统计学习 (statistical learning) 监督学习 (supervise ...
- 【HBase】安装与使用
下载HBase(注意下载与您使用的hadoop版本兼容的版本) 前提:hadoop HA,zookeeper是正常的. 1.解压 tar -zxvf hbase压缩包 -C 解压后存储路径 2.配置环 ...
- Java实现 删数字
删数字 时间限制: 1 Sec 内存限制: 128 MB 题目描述 奶牛在数学课上学习了整除的概念.农夫Farmer John为了考验它的数学水平,于是在白纸上写了正整数T.由于农夫不喜欢数字0,所以 ...
- Java实现 蓝桥杯VIP 算法训练 麦森数
算法训练 麦森数 时间限制:1.0s 内存限制:256.0MB 问题描述 形如2P-1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果P是个素数,2P-1不一定也是素数.到1998年底, ...
- Java实现 LeetCode 104 二叉树的最大深度
104. 二叉树的最大深度 给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. 示例: 给定二叉树 [3,9,20,nu ...
- Java实现蓝桥杯 算法训练 大等于n的最小完全平方数
试题 算法训练 大等于n的最小完全平方数 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 输出大等于n的最小的完全平方数. 若一个数能表示成某个自然数的平方的形式,则称这个数为完全平 ...
- java实现排列为平方数
** 排列为平方数** 若干不同的数字,排列组合后能产生多少个平方数? 下面的代码解决了这个问题. 对于:1,6,9 排列后,可产生3个平方数: 169 196 961 请阅读下面的代码,填写缺失的部 ...