
部署 K8s 应用时第一个要回答的问题:用 Deployment 还是 StatefulSet?答案取决于你的应用有没有状态。
无状态应用:实例之间完全对等,不保存任何需要持久化的数据,随时创建销毁都无所谓。比如 Nginx、API 网关、前端服务。
有状态应用:每个实例有唯一身份,需要独立的存储,实例之间可能有主从关系,不能随意替换。比如 MySQL、Kafka、Redis Cluster。
维度 | Deployment | StatefulSet |
|---|---|---|
适用场景 | 无状态应用 | 有状态应用 |
Pod 身份 | 随机名称和 IP,重启后可能变 | 固定名称(web-0, web-1…)和稳定 DNS |
存储 | 所有 Pod 共享同一个 PVC 模板 | 每个 Pod 独立的 PVC,Pod 重建后存储跟着走 |
扩缩容 | 并行创建/删除,速度快 | 按序号串行创建/删除(0→1→2) |
服务发现 | Service 负载均衡,流量随机分发 | Headless Service,每个 Pod 有独立 DNS 记录 |
更新策略 | RollingUpdate / Recreate,并行更新 | 支持分区更新,控制更新节奏 |
3 个副本,滚动更新,不需要持久化存储。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-web
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.25-alpine
ports:
- containerPort: 80
resources:
requests:
memory: "128Mi"
cpu: "100m"
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 1每个实例需要独立存储、稳定网络标识,用 Headless Service 做服务发现。
apiVersion: v1
kind: Service
metadata:
name: mysql
labels:
app: mysql
spec:
ports:
- port: 3306
name: mysql
clusterIP: None # Headless Service
selector:
app: mysql
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
serviceName: "mysql"# 关联 Headless Service
replicas: 3
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:8.0
env:
- name: MYSQL_ROOT_PASSWORD
value: "your-secure-password"
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
volumeClaimTemplates: # 每个 Pod 自动创建独立的 PVC
- metadata:
name: mysql-data
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 10Gi关键点:volumeClaimTemplates 让每个 Pod 拿到自己的 PV,Pod 被调度到别的节点时数据跟着走;serviceName 指向 Headless Service,Pod 之间可以通过 mysql-0.mysql、mysql-1.mysql 直接通信。
问自己三个问题:
只有当应用本身必须带着状态跑在 K8s 里(比如自建数据库集群),才用 StatefulSet。能用 Deployment 解决的,别用 StatefulSet。
“无他,惟手熟尔”!有需要的用起来!
如果你觉得这篇文章有用,欢迎点赞、转发、收藏、留言、推荐❤!
本文分享自 Nicholas与Pypi 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!