Kubernetes 的有状态和无状态服务

news2024/11/10 15:36:24

k8s-LAB

Author:rab


目录

    • 前言
    • 一、无状态服务案例
      • 1.1 yml 案例
      • 1.2 扩容与缩容
        • 1.2.1 扩容
        • 1.2.2 缩容
      • 1.3 暂停与恢复
        • 1.3.1 暂停
        • 1.3.2 恢复
      • 1.4 回滚
    • 二、有状态服务案例
      • 2.1 yml 案例
      • 2.2 扩容与缩容
        • 2.2.1 扩容
        • 2.2.2 缩容
    • 总结


前言

在 Kubernetes(k8s)中,有状态服务和无状态服务是两种不同类型的应用程序部署方式,它们在容器编排和管理方面有一些关键区别。

1、无状态服务(Stateless Services)

  • 无状态服务是指应用程序不依赖于本地状态,并且对于每个请求都能以相同的方式处理。这意味着无状态服务的任何一个实例都可以处理来自客户端的请求,而请求之间没有关联。
  • 无状态服务的典型示例包括 Web 服务器、API 服务、负载均衡器等,这些服务可以水平扩展,即可以通过添加更多的副本来处理更多的请求流量。
  • 无状态服务通常适合使用 Kubernetes 中的 Deployment 进行部署。因为它们的实例可以随意启动和停止,而不会影响应用程序的状态或数据。

2、有状态服务(Stateful Services)

  • 有状态服务是指应用程序依赖于本地状态,通常需要稳定的标识和数据。这意味着每个实例都有唯一的标识,如数据库服务器或消息队列,它们需要在启动、停止或故障转移时保留其数据和状态。
  • 有状态服务的典型示例包括数据库系统(如 MySQL、PostgreSQL)、消息队列(如 RabbitMQ、Kafka)等,这些服务通常需要持久性存储和网络标识的稳定性。
  • Kubernetes 提供 StatefulSet 来部署有状态服务。StatefulSet 具有管理有状态应用程序的能力,为每个 Pod 提供唯一的标识,以及稳定的网络标识,从而支持有状态服务的稳定性。

一、无状态服务案例

1.1 yml 案例

比如我们可以举个 Nginx 负载均衡的例子,那此时这个负载均衡可以归为无状态服务,任何一个 Nginx 实例都可以处理来自客户端的请求。因此我们可以采用 Kubernetes 中的 Deployment 进行部署。

vim Stateless.yml
apiVersion: v1
kind: Namespace
metadata:
  name: myweb
  labels:
    name: ops
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: myweb
  labels:
    app: stateless
spec:
  replicas: 3
  selector:
    matchLabels:
      app: demo
  template:
    metadata:
      labels:
        app: demo
    spec:
      containers:
      - name: nginx
        image: nginx:1.21.4
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-srv
  namespace: myweb
spec:
  selector:
    app: demo
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
      nodePort: 30333
  type: NodePort

注意:Service 的 selector 标签选择器的值一定要和 Deployment 的 selector 标签选择器的值保持一致,否则外部 Client 的请求就无法路由到 Pod 资源。

kubectl apply -f Stateless.yml

本地浏览器访问:

http://192.168.56.160:30333/

image-20231025153300073

1.2 扩容与缩容

1.2.1 扩容

扩容的方式有很多,以下是常见的扩容方式。

1、修改 yml 文件方式

vim Stateless.yml    # 只需修改replicas值即可
...
spec:
  replicas: 5
  ...

修改完成后执行扩展(更新)

kubectl apply -f Stateless.yml

2、Shell 命令行方式

  • 法1

    kubectl scale --replicas=5 deploy nginx -n myweb
    
    # 说明:deploy是deployment的缩写,写deployment也是没问题的
    
  • 法2

    kubectl edit deployment nginx -n myweb
    
    # 这会以交互式的方式进入yml配置文件,进去后修改replicas的值后保存退出即可实现扩容
    

说明:与直接修改 yml 文件不同的是,该命令执行完后即可升级,而无需执行 kubectl apply -f Stateless.yml

1.2.2 缩容

与扩容没有任何区别,操作一模一样,所谓的缩容就是当你设置的 replicas 值小于当前 replicas 值时就是缩容的概念。

注意:但要注意的是,我们说动态扩容和缩容不会触发上线(即不会产生新的 replicaset)

1.3 暂停与恢复

注意的是,这个暂停和恢复不是说暂停了我的程序就不对外提供服务了,而是用于当你使用 kubectl set ... 命令来更新时使用。其大概流程就是:当你暂停后,允许你执行多个 kubectl set ... 更新命令,但每条指令执行完后不是立即生效,而是当你恢复 deployment 时你执行的那些 kubectl set ... 才会生效。

1.3.1 暂停

1、暂停服务

kubectl rollout pause deployment nginx -n myweb

2、执行第一条更新指令

kubectl set image deploy nginx nginx=nginx:1.20.0 -n myweb

3、执行第二条更新指令

kubectl set resources deploy nginx -c nginx --limits=cpu=200m,memory=128Mi --requests=cpu=10m,memory=16Mi -n myweb

如下图,以上这两条更新指令都是未生效的,从 nginx 镜像版本没变化就可证明。

image-20231025170727008

1.3.2 恢复

那要如何是我们执行过的 kubectl set ... 指令生效呢?恢复即可。

kubectl rollout resume deploy nginx -n myweb

如下图,恢复后我们在暂停期间执行的 kubectl set ... 指令就生效了。

image-20231025171200713

当然了,如果你想使用 kubectl set 来更新服务,但又不想暂停,你完全可以直接执行 kubectl set 指令即可,执行完后,就会立马更新。

kubectl set image deploy nginx nginx=nginx:1.18.0 -n myweb

image-20231025171428065

1.4 回滚

如果我们以上的一系列更新最终的测试验证出问题了,需要回滚到最初(或更新前)的状态或中间某个版本状态,那此时就需要使用到 K8s 的回滚功能了,具体的操作如下。

1、先查看更新的版本

默认情况下,K8s 只会保留近 10 个的 revision,我们可以在 Deployment 配置文件中使用 revisionHistoryLimit 字段来指定 revision 的保留数量。

kubectl rollout history deploy nginx -n myweb

# 下图中这三个版本编号中,1表示最初版本状态,3表示当前的版本状态

image-20231025172113126

2、再查看每个版本对应的详情(因为上图根本看不出来)

kubectl rollout history deployment nginx --revision=1 -n myweb

# 我们来看看第一个版本详情

image-20231025172640153

3、回滚到我们指定的版本状态

kubectl rollout undo deployment nginx --to-revision=1 -n myweb

image-20231025172836324

4、最后来验证一下是否回滚成功

kubectl get deployment nginx -o wide -n myweb

image-20231025173029086

这个时候我们再来看看历史版本号:

image-20231025173140455

你会发现,历史版本为 1 的编号消失了,为什么呢?因为已经被我们回滚了(此时你就要记住了,如果你又执行了多次更新操作后,又想回到最初的状态的话,只能回到 4 这个版本,因为 4 此时才是我们最初的状态,而 2 并不是)。

二、有状态服务案例

2.1 yml 案例

上面说到,像 MySQL、RabbitMQ 等这类服务实际上就是属于有状态服务,对于这类服务我们一般会要求每个 Pod 具有唯一的标识,以及稳定的网络标识。例如 MySQL 就是一个典型的有状态应用程序,因为每个 MySQL 实例需要唯一的标识,并且通常依赖于稳定的网络标识。

vim Stateful.yml
apiVersion: v1
kind: Namespace
metadata:
  name: myweb-2
  labels:
    name: ops
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: nginx
  namespace: myweb-2
  labels:
    app: stateful
spec:
  serviceName: myweb-2
  replicas: 3
  selector:
    matchLabels:
      app: demo-2
  template:
    metadata:
      labels:
        app: demo-2
    spec:
      containers:
      - name: nginx
        image: nginx:1.21.4
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-srv
  namespace: myweb-2
spec:
  selector:
    app: demo-2
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
      nodePort: 30334
  type: NodePort
kubectl apply -f Stateful.yml

对于如何查看 deployment 资源,我想你已经会了,那 statefulset 资源如何查看呢?其实都是一样的套路:

kubectl get statefulset -n myweb-2

# 或
kubectl get sts -n myweb-2

image-20231025175454025

本地浏览器访问:

http://192.168.56.160:30334/

image-20231025175657501

2.2 扩容与缩容

2.2.1 扩容
kubectl scale --replicas=5 sts nginx -n myweb-2
2.2.2 缩容
kubectl scale --replicas=2 sts nginx -n myweb-2

说明:暂停、恢复、回滚套路和 deployment 保持一致的,这里就不再重复造轮子了。

总结

  • 无状态服务适用于可以随意扩展并处理请求而不依赖本地状态的应用程序,而有状态服务适用于需要稳定的标识和数据的应用程序。

  • 在 Kubernetes 中,我们可以使用不同的控制器(例如 Deployment 和 StatefulSet)来适应这两种不同类型的服务。

  • 有状态服务通常需要考虑持久性存储和数据备份策略,以确保数据的可靠性和可用性。

说明:以上案例均未配置持久化存储,后面会提到。

—END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1132852.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言找出一个二维数组中的鞍点,即该位置上的元素在该行上最大,在该列上最小,也可能没有鞍点

完整代码&#xff1a; /*找出一个二维数组中的鞍点&#xff0c;即该位置上的元素在该行上最大&#xff0c;在该列上最小&#xff0c;也可能 没有鞍点*/ #include<stdio.h> #include<stdlib.h> int main(){int n0;printf("请输入矩阵的行数:");scanf(&qu…

中国区域2013-2021年森林地上生物量产品

该数据集包括中国陆地区域2013-2021年30m分辨率森林地上生物量产品。每年的产品存放在以年份数字命名的文件夹中&#xff0c;有2013-2021共9个文件夹。 每个文件夹内包括分块的产品和vrt文件。 产品命名方式为分区名年份数字.tif。 不同的分区名称如下&#xff1a; cold te…

第2篇 机器学习基础 —(1)机器学习概念和方式

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。机器学习是一种人工智能的分支&#xff0c;它使用算法和数学模型来使计算机系统能够从经验数据中学习和改进&#xff0c;而无需显式地编程。机器学习的目标是通过从数据中发现模式和规律&#xff0c;从而使计算机能够自动进…

高速公路安全监测预警系统的功能优势

实时监测和预警&#xff1a;高速公路安全监测预警系统能够实时监测高速公路的路基、桥梁、隧道等结构的位移变化情况&#xff0c;并通过数据分析及时发出预警&#xff0c;有效预防和减少交通事故的发生。 高精度测量&#xff1a;高速公路安全监测预警系统能够实现高精度的位移…

光影之梦2:动画渲染前后对比,揭示视觉艺术的惊人转变!

动画渲染是影视艺术中不可或缺的一环&#xff0c;它赋予了角色和场景鲜活的生命。渲染过程中的光影、色彩、材质等元素&#xff0c;像是画家的调色板&#xff0c;将平淡无奇的线条和形状转化为充满韵味与情感的画面。动画角色仿佛拥有了自己的灵魂&#xff0c;无论是一颦一笑&a…

C# Winform编程(8)GDI+绘图

GDI绘图 简介System.Drawing命名空间System.Drawing命名空间中的常用类&#xff1a;System.Drawing命名空间中的常用结构&#xff1a; Graphics 类Pen类Brush类Font类PictureBox图像控件Bitmap类 简介 GDI(Graphics Device Interface)图像设备接口&#xff0c;属于绘图方面的A…

进阶课3——神经网络

1.定义与分类 神经网络是一种模仿动物神经网络行为特征&#xff0c;进行分布式并行信息处理的算法数学模型。它由大量的节点&#xff08;或神经元&#xff09;相互关联而成&#xff0c;每个节点代表一种特定的输出函数&#xff08;或称为运算&#xff09;&#xff0c;称为激励…

高等数学啃书汇总重难点(七)微分方程

同济高数上册的最后一章&#xff0c;总的来说&#xff0c;这篇章内容依旧是偏记忆为主&#xff0c;说难不难说简单不简单&#xff1a; 简单的是题型比较死&#xff0c;基本上就是记公式&#xff0c;不会出现不定积分一般花样繁多的情况&#xff1b;然而也就是背公式并不是想的…

Java-枚举

文章目录 枚举使用优缺点 方法 枚举 Java中的枚举是一种特殊的类&#xff0c;它用于定义一组有限的常量。 枚举在Java中被视为数据类型&#xff0c;你可以使用它们来创建枚举类型的变量&#xff0c;然后使用那些变量等。 枚举类使用enum关键字进行定义。 例如&#xff1a;在…

一篇了解springboot3请求参数种类及接口测试

SpringBoot3数据请求&#xff1a; 原始数据请求&#xff1a; //原始方式RequestMapping("/simpleParam")public String simpleParam(HttpServletRequest request){//获取请求参数String name request.getParameter("name");String age request.getParam…

我的前端笔记

HTML ./当前文件夹 ../返回上一级 ../../返回上上级 如果点击链接需要在新标签中打开<a href"#" target"_blank"> 网页中音频和视频都是默认不会自动播放的&#xff0c;视频得配合muted&#xff08;静音&#xff09;和autoplay配合使用 无语义…

Peter算法小课堂—球盒问题

球盒问题有8类&#xff0c;分别如下图 相同的球放入相同的盒子 根据上一篇Peter算法小课堂—正整数拆分-CSDN博客 简单来说&#xff0c;就这样&#x1f447; 将相同的球放入相同的盒子&#xff0c;其实相当于将正整数i分为j个正整数的个数 cin>>n>>m; if(n<…

Java|学习|多线程

1.多线程的一些概念 进程&#xff1a;是正在运行的程序 是系统进行资源分配和调用的独立单位 每一个进程都有它自己的内存空间和系统资源。 线程&#xff1a;是进程中的单个顺序控制流&#xff0c;是一条执行路径。 单线程&#xff1a;一个进程如果只有一条执行路径&#xff0…

前端,CSS,背景颜色跟随轮播图片改变而改变(附源码)

首先看效果&#xff01; 比如轮播图时红色&#xff0c;那么背景的底色也是红色&#xff0c;轮播图时黄色&#xff0c;背景的底色也是黄色&#xff0c;这就是根据轮播图的图片切换&#xff0c;而改变背景颜色随轮播图颜色一致 话不多说&#xff0c;直接上代码&#xff01;非常简…

Linux系统编程学习 NO.8 ——make和Makefile、进度条程序

前言 今天是1024程序员节&#xff0c;不知不觉离第一次写博客已经过去了一年了。在此祝各位程序员不写bug&#xff0c;不再秃头。 make和Makefile 什么是make和Makefile&#xff1f; make和Makefile是软件开发时所用到的工具和文件。make是一个指令工具。Makefile是一个当前…

避雷!新增2本期刊被标记为「On Hold」,1区TOP刊仍在调查中!

近期小编在Master Journal List上查询期刊时偶然发现&#xff0c;又有2本期刊被科睿唯安标记为「On Hold」&#xff01; 这2本期刊分别为MIGRATION LETTERS和REVISTA DE GESTAO E SECRETARIADO-GESEC. 此外还有6本期刊被标记为「On Hold」&#xff0c;目前共计8本期刊被「On …

Fedora系统的部署与MobaXterm的使用

Fedora Fedora简介 Fedora&#xff0c;Fedora Linux&#xff08;第七版以前为Fedora Core&#xff09;是由Fedora项目社区开发、红帽公司赞助&#xff0c;目标是创建一套新颖、多功能并且自由&#xff08;开放源代码&#xff09;的操作系统。Fedora是商业化的Red Hat Enterpr…

Bwapp靶场下载安装

bwapp安装 bWAPP&#xff08;Buggy Web Application&#xff09;是一个用于学习和测试Web应用程序安全的漏洞性Web应用程序。bWAPP通过提供多种常见Web应用程序漏洞&#xff08;例如跨站点脚本&#xff08;XSS&#xff09;、SQL注入、文件包含等&#xff09;来帮助用户了解和熟…

可观察性支柱:探索日志、指标和跟踪

通过检查系统输出来测量系统内部状态的能力称为可观察性。当可以仅使用输出信息&#xff08;即传感器数据&#xff09;来估计当前状态时&#xff0c;系统就变得“可观察”。您可以使用来自 Observability 的数据来识别和解决问题、优化性能并提高安全性。 在接下来的几节中&am…