K8S 无状态应用&有状态应用

在Kubernetes(简称K8S)中,无状态应用(Stateless Applications)和有状态应用(Stateful Applications)是描述应用行为和架构的两个重要概念,它们对于如何设计、部署和管理应用程序在Kubernetes集群中的行为至关重要。以下是关于这两种应用类型的详细解释:

一、无状态应用(Stateless Applications)

定义:

无状态应用是指那些不依赖于任何特定实例状态的应用程序。这意味着无论何时何地启动应用实例,它们都能以相同的方式运行,并且不依赖于之前的执行状态。
特点:

  1. 可替换性 :实例之间没有区别,任何一个实例都可以被另一个完全相同的实例替换。

  2. 可扩展性 :可以根据负载轻松地增加或减少实例的数量。

  3. 无持久性存储 :不依赖于本地存储,所有数据都存储在外部存储系统中,如数据库或对象存储。

  4. 易于管理 :由于无状态应用的特性,它们通常更容易在Kubernetes中部署、扩展和管理。
    部署方式:

无状态应用通常通过Deployment和ReplicaSet来管理。这些资源确保了应用的副本数量始终符合期望的状态,并且可以根据需要进行自动扩展或缩减。

二、有状态应用(Stateful Applications)

定义:

有状态应用则是指那些需要维护和跟踪状态的应用程序。这些状态可能包括用户会话信息、应用配置、数据库记录等。
特点:

  1. 状态持久性 :应用需要在多个周期内保持状态信息。

  2. 顺序性 :实例的创建和删除通常是有序的,不能随意替换。

  3. 唯一性 :每个实例通常有唯一的标识,如数据库的主节点或从节点。

  4. 持久化存储 :需要持久化存储卷来保存状态信息,以确保数据的一致性和可恢复性。
    部署方式:

有状态应用在Kubernetes中通过StatefulSet来管理。StatefulSet会跟踪每个Pod的状态,并确保它们有序地部署和删除,同时提供稳定的存储和网络标识符。此外,还需要配置持久卷(PersistentVolume)和持久卷声明(PersistentVolumeClaim)来管理数据的持久化存储。

三、部署流程对比

步骤 无状态应用 有状态应用
1 创建Deployment 创建StatefulSet
2 定义Pod模板 定义Pod模板
3 定义Service 定义Headless Service
4 暴露Service 暴露Headless Service
5 部署应用 部署应用
6 扩展应用 扩展应用

四、样例

1. 无状态应用

无状态应用的一个典型例子是Web前端应用或微服务中的某些组件,这些应用不保存任何状态到本地存储,所有的状态都保存在外部系统(如数据库、缓存等)中。

  1. 创建Dockerfile
    首先,你需要创建一个Dockerfile来定义你的应用镜像。例如,如果你的应用是一个简单的Node.js应用,Dockerfile可能如下所示:
bash 复制代码
FROM node:14  
WORKDIR /app  
COPY . /app  
RUN npm install  
CMD ["node", "app.js"]
  1. 构建并推送镜像
    使用Docker命令构建并推送你的镜像到容器仓库(如Docker Hub、阿里云容器镜像服务等)。
bash 复制代码
docker build -t your-registry/hello-world:latest .  
docker push your-registry/hello-world:latest
  1. 创建Deployment
    在Kubernetes中,使用Deployment资源来管理无状态应用的副本。创建一个YAML文件(如hello-world-deployment.yaml)来定义Deployment:
yaml 复制代码
apiVersion: apps/v1  
kind: Deployment  
metadata:  
  name: hello-world-deployment  
spec:  
  replicas: 3  
  selector:  
    matchLabels:  
      app: hello-world  
  template:  
    metadata:  
      labels:  
        app: hello-world  
    spec:  
      containers:  
      - name: hello-world  
        image: your-registry/hello-world:latest  
        ports:  
        - containerPort: 80
  1. 创建Service
    创建一个Service资源来暴露Deployment中的Pod,使得外部可以访问这些Pod。创建一个YAML文件(如hello-world-service.yaml)来定义Service:
yaml 复制代码
apiVersion: v1  
kind: Service  
metadata:  
  name: hello-world-service  
spec:  
  type: LoadBalancer  
  selector:  
    app: hello-world  
  ports:  
  - port: 80  
    targetPort: 80
  1. 部署应用到K8S集群
    使用kubectl命令将Deployment和Service应用到K8S集群中:
bash 复制代码
kubectl apply -f hello-world-deployment.yaml  
kubectl apply -f hello-world-service.yaml
  1. 验证部署
    使用kubectl命令查看Deployment、Pods和Service的状态,确保一切正常运行:
bash 复制代码
kubectl get deployments  
kubectl get pods  
kubectl get services

2. 有状态应用

有状态应用的一个典型例子是数据库服务,如MySQL或PostgreSQL。这些服务需要保存数据到本地存储,并且每个实例都有其独特的状态。

  1. 创建PersistentVolume
    首先,需要创建一个PersistentVolume(PV)来提供持久化存储。
yaml 复制代码
apiVersion: v1  
kind: PersistentVolume  
metadata:  
  name: mysql-pv  
spec:  
  capacity:  
    storage: 10Gi  
  accessModes:  
    - ReadWriteOnce  
  persistentVolumeReclaimPolicy: Retain  
  storageClassName: manual  
  hostPath:  
    path: "/mnt/data"
  1. 创建PersistentVolumeClaim
    然后,创建一个PersistentVolumeClaim(PVC)来请求PV。
yaml 复制代码
apiVersion: v1  
kind: PersistentVolumeClaim  
metadata:  
  name: mysql-pvc  
spec:  
  accessModes:  
    - ReadWriteOnce  
  resources:  
    requests:  
      storage: 10Gi  
  storageClassName: manual
  1. 创建StatefulSet
    使用StatefulSet来部署MySQL服务,并挂载PVC。
yaml 复制代码
apiVersion: apps/v1  
kind: StatefulSet  
metadata:  
  name: mysql  
spec:  
  serviceName: "mysql"  
  replicas: 1  
  selector:  
    matchLabels:  
      app: mysql  
  template:  
    metadata:  
      labels:  
        app: mysql  
    spec:  
      containers:  
      -
相关推荐
CS创新实验室12 分钟前
从穿孔卡片到云原生:批处理系统的不朽演进与核心思想
云原生·操作系统·批处理
檐下翻书17317 分钟前
Spring Boot 深度剖析:从虚拟线程到声明式 HTTP 客户端,再到云原生最优解
spring boot·http·云原生
roman_日积跬步-终至千里34 分钟前
【Docker下部署高可用】StarRocks 存算一体架构高可用部署要点
docker·容器·架构
zmjjdank1ng1 小时前
k8s问答题(二)
云原生·容器·kubernetes
卡奥斯开源社区官方1 小时前
2025 实战指南:WebAssembly 重塑云原生开发 —— 从前端加速到后端革命的全栈落地
前端·云原生·wasm
万博智云OneProCloud1 小时前
SmartX 联合万博智云发布云原生异构容灾解决方案白皮书(附下载)
云原生·云容灾·hyperbdr云容灾·灾备系统
ABdolphin12 小时前
Spring-cloud 主键Eureka
java·云原生·eureka
小坏讲微服务12 小时前
五分钟使用 Docker-compose搭建 Redis 8.0 中间件
运维·redis·docker·中间件·容器·kubernetes·k8s
Aimyon_3613 小时前
MinerU Docker自定义版本部署
运维·docker·容器
AKAMAI13 小时前
AI推理硬件选型指南:CPU 与 GPU 的抉择
人工智能·云原生·云计算