Nginx StatefulSet deploy

该博客详细介绍了如何在Kubernetes集群中创建持久化卷(PV)和持久化卷声明(PVC),并结合StatefulSet部署一个使用持久化存储的Nginx应用。首先,创建了一个NFS类型的PV,然后定义了对应的PVC,接着配置了Nginx StatefulSet以挂载这个PVC,并设置资源限制。最后,创建了一个NodePort类型的Service暴露Nginx应用。这为Kubernetes环境中的持久化数据存储提供了一个实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、创建持久化pv文件

cat nginx-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nginx-data
spec:
  accessModes:
  - ReadWriteOnce
  capacity:
    storage: 10Gi
    namespace: default
  persistentVolumeReclaimPolicy: Delete
  nfs:
    server: 192.168.0.20
    path: /app/k8s-volume

2、创建持久化pvc文件

cat nginx-pvc.ayml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nginx-data
  namespace: default
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

3、创建nginx StatefulSet文件

cat nginx.yaml
apiVersion: apps/v1beta2
kind: StatefulSet
metadata:
  labels:
    k8s-app: nginx
  name: nginx
  namespace: default
spec:
  podManagementPolicy: OrderedReady
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      k8s-app: nginx
  template:
    metadata:
      labels:
        k8s-app: nginx
    spec:
      containers:
      - image: nginx:latest
        imagePullPolicy: Always
        livenessProbe:
          failureThreshold: 3
          httpGet:
            path: /
            port: 80
            scheme: HTTP
          initialDelaySeconds: 30
          periodSeconds: 10
          successThreshold: 1
          timeoutSeconds: 1
        name: nginx
        readinessProbe:
          failureThreshold: 3
          httpGet:
            path: /
            port: 80
            scheme: HTTP
          initialDelaySeconds: 30
          periodSeconds: 10
          successThreshold: 1
          timeoutSeconds: 1
        resources:
          limits:
            cpu: 500m
            memory: 1Gi
          requests:
            cpu: 250m
            memory: 256Mi
        volumeMounts:
        - mountPath: /mnt
          name: vol
      imagePullSecrets:
      - name: nginxsecret
      restartPolicy: Always
      volumes:
      - name: vol
        persistentVolumeClaim:
          claimName: nginx-data

4、创建nginx_svc文件

cat nginx_svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  type: NodePort
  ports:
    - port: 80
      targetPort: 80
  selector:
    k8s-app: nginx

5、应用以上文件

kubectl apply -f nginx-pv.yaml
kubectl apply -f nginx-pvc.yaml
kubectl apply -f nginx.yaml
kubectl apply -f nginx_svc.yaml
<think>我们正在讨论Kubernetes中的无状态应用和有状态应用的区别,以及Deployment和StatefulSet的使用场景。根据用户提供的引用,我们可以总结如下:###无状态应用vs有状态应用1.**无状态应用(StatelessApplications)**:-不会在本地存储持久化数据,即每个实例都是相同的,不保存任何会话数据或状态。-多个实例对同一个用户请求的响应结果完全一致,实例之间没有依赖关系。-在Kubernetes中,可以动态启停Pod而不会对其他Pod产生影响。例如,一个Web应用的前端服务,每个Pod都可以独立处理请求,不需要知道之前的请求状态[^3][^4]。2.**有状态应用(StatefulApplications)**:-需要在本地存储持久化数据,如数据库(Redis、MySQL)等。-每个实例都有其唯一的状态,且实例之间可能存在依赖关系(如主从复制)。-需要稳定的网络标识符(如固定的Pod名称和网络地址)和持久化存储(如PV/PVC),以便在Pod重启或迁移后仍能保持状态[^4]。###Deployment和StatefulSet的使用场景-**Deployment**:-用于部署无状态应用。它管理一组相同的Pod,每个Pod都是可替换的(replaceable)。-支持滚动更新、回滚和弹性伸缩。当Pod被删除或替换时,Deployment会创建一个新的Pod来替代,且新Pod与旧Pod没有关联(不保留状态)[^1][^2][^3]。-适用于Web服务器、API服务等不需要保存状态的应用。-**StatefulSet**:-用于部署有状态应用。它为每个Pod提供唯一的、持久的标识符(如`web-0`、`web-1`),并保证Pod的顺序部署和扩展(如先创建`web-0`,再创建`web-1`)[^1][^2]。-每个Pod都有独立的持久化存储(PV/PVC),即使Pod被重新调度到其他节点,数据也不会丢失。-适用于数据库(如MySQL集群、MongoDB)、分布式存储系统(如Elasticsearch)等需要保存状态的应用。###关键区别总结|特性|Deployment|StatefulSet||------|------------|-------------||**Pod标识**|随机唯一标识(如`deploy-1234-abcd`)|固定有序标识(如`web-0`、`web-1`)||**网络标识**|无稳定主机名|有稳定主机名(基于Pod标识)||**存储**|共享存储或无持久化存储|每个Pod独立持久化存储||**更新策略**|滚动更新(同时更新多个Pod)|顺序更新(按索引顺序更新Pod)||**适用场景**|无状态应用|有状态应用|###示例场景1.**无状态应用(使用Deployment)**:一个提供天气预报的RESTAPI服务,每个请求都是独立的,不需要保存用户会话。可以使用Deployment部署多个Pod,并通过Service负载均衡[^3]。2.**有状态应用(使用StatefulSet)**:一个MySQL主从复制集群,每个MySQL实例需要独立的数据目录和稳定的网络标识(如`mysql-0`为主节点,`mysql-1`为从节点)[^4]。###注意事项-**DaemonSet**:适用于在每个节点上运行一个Pod的场景(如日志收集器Filebeat)[^2]。-**Job/CronJob**:适用于一次性任务(如数据处理)或定时任务(如每天备份)[^2]。###总结在Kubernetes中,选择Deployment还是StatefulSet取决于应用是否保存状态:-**无状态应用**:使用Deployment,它提供弹性伸缩和滚动更新,适合可随意替换的Pod。-**有状态应用**:使用StatefulSet,它提供稳定的网络标识和持久化存储,适合需要保持状态的应用[^1][^2]。§§相关问题§§1.如何为StatefulSet配置持久化存储(PV/PVC)?2.Deployment的滚动更新策略如何配置?3.在Kubernetes中如何监控有状态应用的性能?4.如何实现无状态应用的水平扩展?</think>### 无状态应用 vs 有状态应用的核心区别 #### 1. **无状态应用(Stateless Applications)** - **核心特征**: - 不存储持久化数据或会话状态 - 每个请求都是独立的,处理不依赖历史请求 - 实例完全可互换(如Web前端、API服务) - **典型场景**: - Web服务器(Nginx/Apache) - RESTful API服务 - 实时计算节点 - **Kubernetes表现**: - Pod可随时创建/销毁而不影响服务 - 多个实例对同一请求返回相同结果 - 适合水平扩展[^3][^4] #### 2. **有状态应用(Stateful Applications)** - **核心特征**: - 必须持久化存储数据(数据库文件/会话状态) - 请求处理依赖历史状态(如用户会话) - 实例有唯一标识和依赖关系(如主从复制) - **典型场景**: - 数据库(MySQL/Redis) - 消息队列(Kafka/RabbitMQ) - 分布式存储(Etcd/Zookeeper) - **Kubernetes表现**: - Pod需要稳定网络标识和持久存储 - 实例启停顺序敏感(如先主后从) - 数据恢复是核心需求[^4] --- ### Kubernetes控制器对比:Deployment vs StatefulSet | 特性 | Deployment | StatefulSet | |---------------------|-----------------------------------|-------------------------------------| | **设计目标** | 无状态应用管理 | 有状态应用管理 | | **Pod标识** | 随机哈希名称(如`web-59d48f67d5`) | 固定有序名称(如`redis-0`,`redis-1`) | | **存储卷** | 共享存储或无状态 | 每个Pod独立PVC(持久化存储) | | **网络标识** | 通过Service负载均衡 | 稳定的DNS域名(`<pod>.<svc>`) | | **扩缩容行为** | 任意顺序创建/删除Pod | 顺序操作(扩容升序/缩容降序) | | **更新策略** | 滚动更新(同时替换多个Pod) | 分阶段更新(按序号顺序更新) | | **典型用例** | Web前端、无状态微服务 | 数据库集群、有状态中间件 | --- ### 使用场景详解 #### 1. **Deployment 适用场景** ```yaml # 典型Deployment配置(无状态Web服务) apiVersion: apps/v1 kind: Deployment metadata: name: web-app spec: replicas: 3 selector: matchLabels: app: web template: metadata: labels: app: web spec: containers: - name: nginx image: nginx:latest ``` - **何时使用**: - 需要快速水平扩展的微服务 - 无会话保持需求的HTTP服务 - 可随时替换的计算节点(如批处理任务) - **优势**: - 自动化滚动更新 - 弹性扩缩容 - 故障自愈[^1][^2] #### 2. **StatefulSet 适用场景** ```yaml # 典型StatefulSet配置(Redis集群) apiVersion: apps/v1 kind: StatefulSet metadata: name: redis spec: serviceName: redis-svc replicas: 3 selector: matchLabels: app: redis template: metadata: labels: app: redis spec: containers: - name: redis image: redis:6.0 volumeMounts: - name: data mountPath: /data volumeClaimTemplates: - metadata: name: data spec: accessModes: [ "ReadWriteOnce" ] storageClassName: ssd resources: requests: storage: 10Gi ``` - **何时使用**: - 需要稳定网络标识的服务(如数据库节点) - 数据持久化需求(每个Pod独立存储卷) - 实例启动顺序敏感的场景(如初始化主从) - **关键能力**: - 持久化存储(通过`volumeClaimTemplates`) - 稳定DNS解析(`redis-0.redis-svc.default.svc.cluster.local`) - 有序部署/扩缩容[^1][^2] --- ### 决策流程图 ```mermaid graph TD A[应用是否需要持久化数据?] -->|是| B[需要稳定网络标识?] A -->|否| C[使用Deployment] B -->|是| D[实例启动顺序敏感?] B -->|否| E[考虑DaemonSet/其他] D -->|是| F[使用StatefulSet] D -->|否| G[评估Operator方案] ``` --- ### 关键总结 1. **无状态应用**: - 使用 **Deployment** - 特征:可随意替换、无本地数据、请求独立 - 如:前端服务、计算型微服务[^3][^4] 2. **有状态应用**: - 使用 **StatefulSet** - 特征:需持久化存储、稳定网络标识、启动顺序敏感 - 如:数据库、消息队列、分布式存储[^1][^4] 3. **本质区别**: - StatefulSet通过**唯一标识+持久存储+有序管理**保障状态一致性 - Deployment通过**实例可互换+共享存储**实现弹性伸缩
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

运维那些事~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值