当前位置: 首页 > news >正文

【K8S系列】有状态服务 VS 无状态服务

目录

序言: 

1.无状态服务介绍

2 有状态服务介绍

2.1 稳定的网络标识

2.2  稳定持久化存储

3 总结


序言: 

昨天有位大佬,问我这个问题,一时哑口无言,没回答上来,但内心却想挣扎一下

   

结果  依然   被怼的很惨

   

 ………………………………………………

发愤图强学习研究下,下次再battle

 

决定学习之后,有了这篇文章.

1.无状态服务介绍

1.数据方面:无状态服务不会在本地存储持久化数据.多个实例可以共享相同的持久化数据

2.结果方面:多个服务实例对于同一个用户请求的响应结果是完全一致

3.关系方面:这种多服务实例之间是没有依赖关系

4.影响方面:在k8s控制器 中动态启停无状态服务的pod并不会对其它的pod产生影响

5.示例方面:nginx实例,tomcat实例,web应用

6.资源方面:相关的k8s资源有:ReplicaSet、ReplicationController、Deployment

7.创建方式Deployment被设计用来管理无状态服务的pod

每个pod完全一致,原因如下:

  • 无状态服务内的多个Pod创建的顺序是没有顺序
  • 无状态服务内的多个Pod的名称是随机的.pod被重新启动调度后,它的名称与IP都会发生变化
  • 无状态服务内的多个Pod背后是共享存储的

8.缩容方式随机缩容

        由于是无状态服务,所以这些控制器创建的pod序号都是随机值。并且在缩容也是随机,并不会明确缩容某一个pod。因为所有实例得到的返回值都是一样,所以缩容任何一个pod都可以

2 有状态服务介绍

1.数据方面:有状态服务需要在本地存储持久化数据,典型的是分布式数据库的应

2.结果方面:实例之间,请求结果可能存在不一致

3.关系方面分布式节点实例之间有依赖的拓扑关系.比如,主从关系.

4.影响方面:如果K8S停止分布式集群中任 一实例pod,就可能会导致数据丢失或者集群的crash.

5.示例方面:mysql数据库、kafka、zookeeper、Redis主从架构

6.资源方面statefulSet

7.创建方式:statefulSet管理

    Pod的特点

  • 唯一性: 每个Pod会被分配一个唯一序号
  • 顺序性: Pod启动,更新,销毁是线性的,按顺序进行
  • 稳定的网络标识: Pod主机名,DNS地址不会随着Pod被重新调度而发生变化.
  • 稳定的持久化存储: Pod被重新调度后,仍然能挂载原有的PV,从而保证了数据的完整性和一致性.

8.缩容方式:有顺序的缩容

        StatefulSet 缩容只会操作 一个 pod 实例,因此有状态应用的缩容相对于无状态的缩容速度会慢。

举例来说, 一个分布式存储应用若同时下线多个节点 ,则可能导致其数据丢失

比如说,一个数据项副本数设置为 2 的数据存储应用, 若同时有两个节点下线,如果一份数据它正好保存在这两个节点上,这份数据就会丢失

因此缩容是线性的 ,则分布式存储应用需要时间把丢失的副本复制到其他节点 ,从而保证数据不会丢失。其实,这也是第七点中所讲的顺序性。

2.1 稳定的网络标识

如何理解稳定的网络标识?以redis为例:可以这样理解:

例如:需要创建名为test-redis-podStateful模型,

根据配置的Replica=3的设置,K8S会创建三个Pod,依次命名为:

  1. test-redis-pod-0
  2. test-redis-pod-1
  3. test-redis-pod-2

K8S为有状态的服务Pod分配稳定的网络标识,具体实现基于test-redis-pod-0名称,借助Headless DNS进行如下解析,获取后端其中一个Pod的地址.

$(pod name).$(service name).$(namespace).svc.cluster.local

下面通过Pod名称访问Redis集群的Master节点地址的方法.

session.save_path = "tcp://test-redis-pod-0.test-redis-service.default.svc.cluster.local:6379"

在Redis Pod内部,主从节点之间数据同步的需求,Slave节点对应的配置文件中需要一个稳定的Master地址.

下边脚本通过稳定访问test-redis-pod-0 名称来间接获得Redis Master节点IP地址,

然后写入到Redis Slave的配置文件中,这样后续Slave节点与Master节点可以完成增量数据的同步.

if [ "${server_host}" != "test-redis-pod-0" ];then
        #echo "server-count: ${server_counts}" >> /data/redistest.log

        while [ -z "${master_address}" ];do
            echo "master_address is not available, ${master_address} waiting for redis master..." >> /data/redistest.log
            master_address=$(replication_master_address)
            sleep 1s
        done
    fi

    echo "master_address: $(master_address)" >> /data/redistest.log
    if [ ! -z "$master_address" ]; then
        printf "\nslaveof %s 6379\n" "$master_address" >> $conf
    fi

在Redis Pod外部, 可以这样来访问具体的Pod服务.

$(pod name).$(service name).$(namespace).svc.cluster.local

2.2  稳定持久化存储

如何理解稳定的持久化存储,可以参考下图:

如图:

1.唯一:每个Redis Pod对应一个PVC/PV.当Pod发生调度时,需要在别的节点启动时,根据Pod背后关联的存储信息,可以保证其名称的稳定性.

2.复用Pod还是会attach挂载到原来的PV/PVC中,从而确定每个Pod有自己专用的存储卷.

3 总结

主要介绍了无状态和有状态服务的基础概念,从八个方面介绍了两者的区别,

并以redis集群为例,详细讲解了稳定的网络标识和稳定的持久化存储

  

介绍了:

  • Deployment部署无状态服务
  • Stateful新的部署组件.

  

Stateful 主要是通过支持Pod一些特性

  • 名称唯一性
  • 稳定的网络标识
  • 稳定的持久化存储

  

从而实现在K8S中部署运维有状态服务

相关文章:

  • Android通知监听服务之NotificationListenerService使用篇
  • java编程计算机网页项目jsp高校体育竞技赛系统myeclipse开发Mysql数据库web结构
  • 【前端】Vue+Element UI案例:通用后台管理系统-导航栏
  • 【线性代数】三、特征值和特征向量
  • 基于 BP 神经网络特征提取的指纹识别应用(Matlab代码实现)
  • 渗透测试CTF-图片隐写的详细教程(干货)
  • 全栈性能测试详解
  • 子网掩码的作用是什么?VLSM又是怎么实现的
  • string类详解
  • Yolov5:强大到你难以想象──新冠疫情下的口罩检测
  • 四大含金量高的算法证书考试
  • 前端小游戏——植物大战僵尸
  • 网鼎杯网络安全大赛玄武组-SSRFME
  • 【计算机组成原理】第二章单元测试
  • 仿黑马点评-redis整合【二——商户查询缓存】——缓存穿透、缓存击穿的解决
  • 分享一款快速APP功能测试工具
  • [笔记] php常见简单功能及函数
  • golang中接口赋值与方法集
  • Linux下的乱码问题
  • maya建模与骨骼动画快速实现人工鱼
  • PHP的类修饰符与访问修饰符
  • scala基础语法(二)
  • select2 取值 遍历 设置默认值
  • Webpack 4x 之路 ( 四 )
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 编写高质量JavaScript代码之并发
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 收藏好这篇,别再只说“数据劫持”了
  • 推荐一个React的管理后台框架
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • # 数据结构
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • (done) 两个矩阵 “相似” 是什么意思?
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (TOJ2804)Even? Odd?
  • (独孤九剑)--文件系统
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .net core控制台应用程序初识
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .Net Web项目创建比较不错的参考文章
  • .net(C#)中String.Format如何使用
  • .NET/C# 的字符串暂存池
  • .net下简单快捷的数值高低位切换
  • .php文件都打不开,打不开php文件怎么办
  • [ C++ ] 继承
  • [C++] Boost智能指针——boost::scoped_ptr(使用及原理分析)
  • [CDOJ 1343] 卿学姐失恋了