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:  
      -
相关推荐
openFuyao26 分钟前
参与openFuyao嘉年华,体验开源开发流程,领视频年卡会员
人工智能·云原生·开源·开源软件·多样化算力
牛奔32 分钟前
docker compose up 命令,默认配置文件自动查找规则
java·spring cloud·docker·容器·eureka
BigBigHang33 分钟前
【docker】离线设备安装镜像
运维·docker·容器
学好statistics和DS38 分钟前
Docker文件与本地文件,系统
运维·docker·容器
liuc031741 分钟前
docker下安装SearXNG
运维·docker·容器
oMcLin1 小时前
如何在CentOS 8上配置并优化Docker与Kubernetes结合的容器集群,提升微服务部署效率?
docker·kubernetes·centos
可爱又迷人的反派角色“yang”2 小时前
k8s(一)
linux·运维·网络·云原生·容器·kubernetes
可爱又迷人的反派角色“yang”2 小时前
CICD持续集成Ruo-Yi项目
linux·运维·网络·ci/cd·docker·容器
星环处相逢2 小时前
K8s 网络插件选型:Flannel vs Calico 深度对比
网络·容器·kubernetes
Zsr10233 小时前
K8s网络方案深度解析:Flannel vs Calico 怎么选?
网络·容器·kubernetes·flannel·calico