【K8S系列】深入解析K8S服务的无状态与有状态

在这里插入图片描述

在容器编排领域,Kubernetes(K8S)无疑是占据主导地位的工具。它提供了强大的功能来管理和部署容器化应用程序,其中服务分类是理解和有效使用K8S的关键。K8S中的服务主要分为无状态服务和有状态服务,这两种类型在基础概念、原理、优势以及应用场景等方面都存在显著差异。

一、基础概念

无状态服务

无状态服务是指那些不依赖于特定实例状态的服务。每个实例都是独立的,对请求的处理不依赖于之前的请求或实例的历史状态。例如,一个简单的Web应用程序,它可以接收来自不同用户的请求并独立处理,而不需要记住用户的历史交互。在K8S中,无状态服务通常由Deployment或ReplicaSet来管理,这些资源可以轻松地创建、扩展或缩减服务的副本数量。

有状态服务

有状态服务则与无状态服务相反,它依赖于实例的状态。这些服务需要记住特定的信息,例如用户的会话数据、事务状态或持久化存储的数据。典型的有状态服务包括数据库、消息队列等。在K8S中,有状态服务由StatefulSet来管理,StatefulSet为每个实例提供了唯一的标识和稳定的网络标识,确保每个实例的状态能够被正确地维护和管理。

二、原理

无状态服务原理

无状态服务在K8S中的运行原理基于负载均衡和副本管理。当一个请求到达时,K8S的服务代理(如kube-proxy)会将请求均匀地分配到各个可用的副本上。由于每个副本都是独立的,因此可以随意地创建或销毁副本,而不会影响整个服务的运行。Deployment和ReplicaSet通过监控副本的状态来确保所需的副本数量始终存在,并且在节点故障或实例崩溃时自动重新创建副本。

有状态服务原理

有状态服务的运行原理则更为复杂。StatefulSet为每个实例分配一个唯一的标识符(如Pod名称),并且确保每个实例的网络标识和存储卷是稳定的。这意味着即使实例被重新调度到不同的节点上,它仍然能够访问到相同的存储数据和使用相同的网络地址。StatefulSet还会按照顺序创建和删除实例,以确保数据的一致性和服务的可用性。

三、优势

无状态服务的优势

  1. 易于扩展:由于每个副本都是独立的,因此可以轻松地扩展或缩减副本数量,以应对不同的负载需求。K8S可以自动根据资源使用情况或用户定义的策略来调整副本数量。
  2. 高可用性:通过创建多个副本,无状态服务可以在单个实例故障时仍然保持可用。K8S会自动检测故障实例并重新创建它们,确保服务的连续性。
  3. 简单管理:无状态服务的管理相对简单,因为不需要考虑实例之间的状态一致性。可以随意地升级、回滚或替换副本,而不会对整个服务造成影响。

有状态服务的优势

  1. 数据一致性:有状态服务能够确保数据的一致性,因为每个实例都有自己的稳定状态和存储。这对于需要处理事务或保存用户特定数据的应用程序非常重要。
  2. 精确控制:StatefulSet提供了对实例的精确控制,包括实例的创建顺序、网络标识和存储卷的管理。这使得有状态服务能够满足更复杂的应用需求。
  3. 可靠性:有状态服务在处理有状态数据时提供了更高的可靠性,因为它能够确保数据的持久性和一致性。即使在节点故障或实例重新调度的情况下,数据仍然能够被正确地访问和处理。

四、应用场景

无状态服务的应用场景

  1. Web应用程序:大多数Web应用程序都是无状态的,它们可以接收来自不同用户的请求并独立处理。例如,一个新闻网站、电子商务平台或博客系统都可以作为无状态服务部署在K8S上。
  2. 微服务架构:在微服务架构中,许多服务都是无状态的,它们可以通过轻量级的通信协议(如RESTful API)进行交互。这些无状态服务可以独立地进行扩展和部署,以提高整个系统的性能和可用性。
  3. 批处理任务:批处理任务通常不需要维护状态,它们可以在不同的节点上并行运行,以提高处理效率。例如,数据处理、图像渲染或日志分析等任务都可以作为无状态服务在K8S上运行。

有状态服务的应用场景

  1. 数据库服务:数据库是典型的有状态服务,它需要保存和管理数据的状态。例如,MySQL、PostgreSQL等关系型数据库,以及MongoDB、Redis等非关系型数据库都可以作为有状态服务部署在K8S上。
  2. 消息队列:消息队列用于在不同的应用程序之间传递消息,它需要维护消息的顺序和状态。例如,Kafka、RabbitMQ等消息队列系统都可以作为有状态服务在K8S上运行。
  3. 分布式缓存:分布式缓存用于存储和管理缓存数据,它需要确保数据的一致性和可用性。例如,Memcached、Redis等分布式缓存系统都可以作为有状态服务在K8S上运行。

五、项目代码应用示例

无状态服务示例:简单的Web应用

我们以一个简单的Python Flask Web应用为例,展示如何在K8S上部署无状态服务。

1. 编写Flask应用代码(app.py)
from flask import Flask

app = Flask(__name__)


@app.route('/')
def hello_world():
    return 'Hello, this is a stateless service!'


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
2. 创建Dockerfile
FROM python:3.9-slim

WORKDIR /app

COPY requirements.txt.
RUN pip install -r requirements.txt

COPY.

EXPOSE 5000

CMD ["python", "app.py"]
3. 创建K8S Deployment和Service配置文件(stateless-deployment.yaml)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: stateless-web-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: stateless-web-app
  template:
    metadata:
      labels:
        app: stateless-web-app
    spec:
      containers:
        - name: stateless-web-container
          image: your_docker_image:tag
          ports:
            - containerPort: 5000
---
apiVersion: v1
kind: Service
metadata:
  name: stateless-web-service
spec:
  selector:
    app: stateless-web-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 5000
  type: LoadBalancer

在上述配置文件中:

  • Deployment定义了一个名为stateless-web-app的无状态服务,副本数为3。每个副本使用指定的Docker镜像运行Flask应用。
  • Service定义了一个负载均衡服务,将外部流量(端口80)转发到容器的5000端口。

有状态服务示例:MySQL数据库

接下来,我们展示如何在K8S上部署一个有状态的MySQL数据库。

1. 创建K8S StatefulSet和Service配置文件(statefulset-mysql.yaml)
apiVersion: v1
kind: Service
metadata:
  name: mysql
  labels:
    app: mysql
spec:
  ports:
    - port: 3306
  selector:
    app: mysql
    tier: db
  clusterIP: None
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
spec:
  serviceName: mysql
  replicas: 1
  selector:
    matchLabels:
      app: mysql
      tier: db
  template:
    metadata:
      labels:
        app: mysql
        tier: db
    spec:
      containers:
        - name: mysql
          image: mysql:8.0
          env:
            - name: MYSQL_ROOT_PASSWORD
              value: rootpassword
            - name: MYSQL_DATABASE
              value: testdb
            - name: MYSQL_USER
              value: testuser
            - name: MYSQL_PASSWORD
              value: testpassword
          ports:
            - containerPort: 3306
          volumeMounts:
            - name: mysql-persistent-storage
              mountPath: /var/lib/mysql
  volumeClaimTemplates:
    - metadata:
        name: mysql-persistent-storage
      spec:
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: 1Gi

在上述配置文件中:

  • 首先定义了一个无头服务(clusterIP: None),用于为StatefulSet提供稳定的网络标识。
  • StatefulSet定义了一个名为mysql的有状态服务,副本数为1。每个实例使用MySQL官方镜像运行,并通过volumeClaimTemplates声明了一个持久化存储卷,用于保存数据库数据。

六、总结

K8S中的无状态服务和有状态服务各有其特点和优势,适用于不同的应用场景。无状态服务适用于那些不需要维护状态、易于扩展和管理的应用程序;而有状态服务则适用于那些需要处理有状态数据、确保数据一致性和可靠性的应用程序。通过上述项目代码示例,我们可以更直观地了解如何在K8S中部署和管理这两种类型的服务。无论是构建简单的Web应用还是复杂的分布式系统,合理选择和使用无状态服务与有状态服务都是实现高效、可靠应用的关键。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux第100步_Linux之设置LCD作为终端控制台和LCD背光调节

KMS是Kemmel Mode Setting的缩写,内核显示模式设置。它主要负责显示的控制,包括屏幕分辨率、屏幕刷新率和颜色深度等等。 CRTC是指显示控制器,在DRM里有多个显存,通过操作CRTC来控制要显示那个显存。 KMS包含了FB框架。DRM驱动默…

3_TCP/IP连接三次握手与断开四次挥手

TCP/IP 通信是网络通信的基础协议,分为以下主要步骤: 1、建立连接(三次握手) 目的:保证双方建立可靠的通信连接。 过程: 1>客户端发送 SYN:客户端向服务器发送一个 SYN(同步&…

SpringCloud 系列教程:微服务的未来(三)IService接口的业务实现

本文将介绍 IService 接口的基本业务操作、复杂业务操作、Lambda 方法的使用以及批量增加操作,帮助开发者深入了解如何高效地利用 MyBatis-Plus 提供的功能进行数据库操作。无论是简单的单表查询,还是复杂的多表联动,甚至是大数据量的批量操作…

kubernetes学习-集群搭建部署(一)

一、开三台虚拟机进行试验(centos7) 1、初始操作 # 关闭防火墙 systemctl stop firewalld systemctl disable firewalld# 关闭selinux sudo sed -i s/enforcing/disabled/ /etc/selinux/config # 永久 setenforce 0 # 临时# 关闭swap sudo swapoff -a # 临时 s…

【AUTOSAR 基础软件】Can模块详解(Can栈之驱动模块)

文章包含了AUTOSAR基础软件(BSW)中Can模块相关的内容详解。本文从AUTOSAR规范解析,ISOLAR-AB配置以及模块相关代码三个维度来帮读者清晰的认识和了解Can驱动软件模块。文中涉及的ISOLAR-AB配置以及生成的ARXML均依托于ETAS工具链,…

Vite内网ip访问,两种配置方式和修改端口号教程

目录 问题 两种解决方式 结果 总结 preview.host preview.port 问题 使用vite运行项目的时候,控制台会只出现127.0.0.1(localhost)本地地址访问项目。不可以通过公司内网ip访问,其他团队成员无法访问,这是因为没…

【maven】什么是坐标(依赖)继承与模块、web项目启动访问

目录 2. Maven 基础 2.1 坐标 2.1.0 什么是坐标(依赖) 2.1.1 获得坐标 2.1.2 使用坐标 2.1.3 依赖范围 2.1.4 依赖传递 2.1.5 依赖冲突&调节原则 2.1.6 依赖排除 2.1.7 使用第三方jar包 2.2 继承与模块 2.2.1 概述 2.2.2 分析 2.2.3 实…

【面试系列】深入浅出 Spring Boot

熟悉SpringBoot,对常用注解、自动装配原理、Jar启动流程、自定义Starter有一定的理解; 面试题 Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?Spring Boot的自动配置原理是什么?你如何理解 Spring Boot 配置…

VS Code AI开发之Copilot配置和使用详解

随着AI开发工具的迅速发展,GitHub Copilot在Cursor、Winsuf、V0等一众工具的冲击下,推出了免费版本。接下来,我将为大家介绍GitHub Copilot的配置和使用方法。GitHub Copilot基于OpenAI Codex模型,旨在为软件开发者提供智能化的代…

meshy的文本到3d的使用

Meshy官方网站: 中文官网: Meshy官网中文站 ​编辑 Opens in a new window ​编辑www.meshycn.com Meshy AI 中文官网首页 英文官网: Meshy目前似乎还没有单独的英文官网,但您可以在中文官网上找到英文界面或相关英文资料。 链…

快速打造智能应用:从设计到上线的全流程指南

随着人工智能技术的快速发展,如何将大模型技术转化为实际应用成为了各行业关注的焦点。本文将以一个经典的 RAG(检索增强生成)知识问答系统为例,详细介绍从智能体设计到最终应用部署的全流程。通过结合阿里云的魔笔低代码平台和丰…

影刀进阶指令 | liblib反推 (SD AI绘图反推)

文章目录 影刀进阶指令 | liblib反推 (SD AI绘图反推)一. 需求二. 流程三. 实现3.1 流程概览3.2 流程步骤讲解1\. 获取png地址2\. 打开页面3\. 上传png文件4\. 获取png的prompt信息 四. 运维 影刀进阶指令 | liblib反推 (SD AI绘图反推) 先看看我们要实现的功能,li…

[单master节点k8s部署]43.全链路监控(二)

部署pinpoint服务端 这里安装的是pinpoint-docker,可以从GitHub - pinpoint-apm/pinpoint-docker: Officix 下载。通过readme可以看到,该项目提供的镜像: Pinpoint-Web ServerPinpoint-CollectorPinpoint-AgentPinpoint-FlinkPinpoint-Hba…

EasyExcel(环境搭建以及常用写入操作)

文章目录 EasyExcel环境搭建1.创建模块 easyexcel-demo2.引入依赖3.启动类创建 EasyExcel写1.最简单的写入1.模板2.方法3.结果 Write01.xlsx 2.指定字段不写入Excel1.模板2.方法3.结果 Write02.xlsx 3.指定字段写入excel1.模板2.方法3.结果 Write03.xlsx 4.按照index顺序写入ex…

SpringBoot对静态资源的映射规则

目录 什么是SpringBoot静态资源映射? 如何实现SpringBoot静态资源映射? 1. webjars:以jar包的方式引入静态资源 示例: 2. /** 访问当前项目的任何资源 示例一: 示例二: 3. 静态首页(欢…

Redis - Token JWT 概念解析及双token实现分布式session存储实战

Token 定义:令牌,访问资源接口(API)时所需要的资源凭证 一、Access Token 定义:访问资源接口(API)时所需要的资源凭证,存储在客户端 组成 组成部分说明uid用户唯一的身份标识time…

集成RabbitMQ+MQ常用操作

文章目录 1.环境搭建1.Docker安装RabbitMQ1.拉取镜像2.安装命令3.开启5672和15672端口4.登录控制台 2.整合Spring AMQP1.sun-common模块下创建新模块2.引入amqp依赖和fastjson 3.新建一个mq-demo的模块1.在sun-frame下创建mq-demo2.然后在mq-demo下创建生产者和消费者子模块3.查…

CMSeasy;大米CMS漏洞复现

一、越权漏洞 pikachu-Over permission 水平越权 ⽔平越权:指攻击者尝试访问与他拥有相同权限的⽤户资源。 登录lucy 查看lucy个人信息 在lucy页面修改usernamelili 可以跳转lili的个人信息页面 pikachu-Over permission 垂直越权 垂直越权:通过低权…

【HarmonyOS之旅】ArkTS语法(一)

目录 1 -> 基本UI描述 1.1 -> 基本概念 1.2 -> UI描述规范 1.2.1 -> 无参数构造配置 1.2.2 -> 必选参数构造配置 1.2.3 -> 属性配置 1.2.4 -> 事件配置 1.2.5 -> 子组件配置 2 -> 状态管理 2.1 -> 基本概念 2.2 -> 页面级变量的状…

论文解读 | NeurIPS'24 Lambda:学习匹配先验以处理无标记垂悬问题场景下的实体对齐任务...

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 点击 阅读原文 观看作者讲解回放! 作者简介 尹航,上海交通大学博士生 内容简介 我们研究了带有无标记悬挂问题的实体对齐(EA)任务,即部分实体在另一个…