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--部署有状态的多副本应用的更多相关文章

  1. Kubernetes 学习笔记(一):基础概念

    个人笔记,仅本人查阅使用,不保证正确. 零.微服务 微服务架构专注于应用解耦合,通过将应用彻底地组件化和服务化,每个微服务只包含一个非常小的功能,比如权限管理.日志收集等等.由这一组微服务组合起来,提 ...

  2. Kubernetes学习笔记(八):Deployment--声明式的升级应用

    概述 本文核心问题是:如何升级应用. 对于Pod的更新有两种策略: 一是删除全部旧Pod之后再创建新Pod.好处是,同一时间只会有一个版本的应用存在:缺点是,应用有一段时间不可用. 二是先创建新Pod ...

  3. 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 ...

  4. ActionBarSherlock学习笔记 第一篇——部署

    ActionBarSherlock学习笔记 第一篇--部署          ActionBarSherlock是JakeWharton编写的一个开源框架,使用这个框架,可以实现在所有的Android ...

  5. 多线程学习笔记九之ThreadLocal

    目录 多线程学习笔记九之ThreadLocal 简介 类结构 源码分析 ThreadLocalMap set(T value) get() remove() 为什么ThreadLocalMap的键是W ...

  6. MDX导航结构层次:《Microsoft SQL Server 2008 MDX Step by Step》学习笔记九

    <Microsoft SQL Server 2008 MDX Step by Step>学习笔记九:导航结构层次   SQL Server 2008中SQL应用系列及BI笔记系列--目录索 ...

  7. python3.4学习笔记(九) Python GUI桌面应用开发工具选择

    python3.4学习笔记(九) Python GUI桌面应用开发工具选择 Python GUI开发工具选择 - WEB开发者http://www.admin10000.com/document/96 ...

  8. Go语言学习笔记九: 指针

    Go语言学习笔记九: 指针 指针的概念是当时学C语言时了解的.Go语言的指针感觉与C语言的没啥不同. 指针定义与使用 指针变量是保存内存地址的变量.其他变量保存的是数值,而指针变量保存的是内存地址.这 ...

  9. go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin)

    目录 go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin) zipkin使用demo 数据持久化 go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin ...

随机推荐

  1. 面向对象案例-学生信息管理系统V0.6

    更新版本 面向对象案例 - 学生信息管理系统V1.0 项目要求: 实体类: 学生类: id, 姓名,年龄,性别,成绩 需要使用数组保存学生信息 Student[] allStu 需要完成的方法 1. ...

  2. [JavaWeb基础] 026.JAVA中使用Axis搭建webservice-环境搭建(一)

    在实际的项目开发过程中,我们经常会使用第三方交互,特别是在前后端语言不一致的情况下,相信webservice这个第三方控件大家都清楚.后面会慢慢带大家来学习它的使用方式,下面就先讲讲它的工具搭建. 一 ...

  3. java基础-HelloWorld

    public class HelloWorld{//源文件中只能有一类声明为public , 且类名和源文件名得一样 //main方法,程序的入口 public static void main(St ...

  4. idea创建maven项目慢的原因以及解决方案

    问题分析;在idea中maven项目所依赖的jar包,默认是从中央仓库直接下载jar包,不管jar包是否在本地仓库存在,所以导致idea创建maven项目速度慢,那么要解决这个问题,那么将idea设置 ...

  5. AD17无法复制原理图到Word的解决方法

    标题: 解决AD17无法复制原理图到WORD 作者: 梦幻之心星 347369787@QQ.com 标签: [AD, Word, 原理图] 目录: 软件 日期: 2019-3-17 目录 前提说明: ...

  6. 【JVM】垃圾回收的四大算法

    GC垃圾回收 JVM大部分时候回收的都是新生代(伊甸区+幸存0区+幸存1区).按照回收的区域可以分成两种类型:Minor GC和Full GC(MajorGC). Minor GC:只针对新生代区域的 ...

  7. WEB APPLICATION PENETRATION TESTING NOTES

    此文转载 XXE VALID USE CASE This is a nonmalicious example of how external entities are used: <?xml v ...

  8. JVM系列.JVM内存模型

    <Java虚拟机规范>将虚拟机的内存分为以下几个区域: 堆区:堆区是JVM中最大的一块内存区域,按照垃圾分代收集的角度划分,又可以分成年轻代和老年代,而年轻代内存又被分成三部分,Eden空 ...

  9. jchdl - RTL实例 - Adder4Carry

    https://mp.weixin.qq.com/s/j4zLmjKgau2vRXVNfm0SIA   带进位的加法.   参考链接 https://github.com/wjcdx/jchdl/bl ...

  10. Jmeter之Json提取器详解(史上最全)

    参考资料:https://www.bbsmax.com/A/D854lmBw5E/ Jsonpath在线测试:http://jsonpath.com/ 实际工作中用到的一些场景: 提取某个特定的值 提 ...