01-23 statefulSet

StatefulSet有状态应用

StatefulSet:专门针对有状态服务进行部署的一个控制器

nginx的前端页面可以使用StatefulSet创建用来访问

StatefulSet的yaml文件

yaml 复制代码
apiVersion: v1
kind: service
metadata:
  name: nginx
  labels:
    app: nginx  # 服务标签,选择与 nginx 相关的 pod
spec:
  ports:
  - port: 80  # 服务暴露的端口
    name: web  # 端口名称
  clusterIP: None  # 设置为无头服务,适用于 StatefulSet
  selector:
    app: nginx  # 服务选择器,根据标签 app: nginx 选择 Pod
---
apiVersion: apps/v1
kind: StatefulSet  # StatefulSet 类型的资源信息
metadata:
  name: web  # StatefulSet 对象的名称
spec:
  serviceName: "nginx"  # 服务名称,用于管理 DNS
  replicas: 2  # 副本数
  selector:
    matchLabels:  # 使用 matchLabels 进行选择,与服务和 Pod 匹配
      app: nginx  # 选择标签为 app: nginx 的 Pod
  template:
    metadata:
      labels:
        app: nginx  # Pod 标签,用于与 Service 匹配
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9  # 使用的 Nginx 镜像
        ports:
        - containerPort: 80  # 容器内暴露的端口
          name: web  # 端口名称
 下面一段可以先不加
        volumeMounts:  # 容器挂载的卷
        - name: www  # 数据卷名称
          mountPath: /usr/share/nginx/html  # 挂载到容器内的路径
  volumeClaimTemplates:  # 数据卷模板
  - metadata:  # 数据卷的元数据
      name: www  # 数据卷名称
      annotations:  # 数据卷的注解
        Volume.alpha.kubernetes.io/storage-class: anything  # 存储类(替换为集群中的有效存储类)
    spec:  # 数据卷的规格
      accessModes: [ "ReadWriteOnce" ]  # 访问模式:单节点读写
      resources:
        requests:
          storage: 1Gi  # 请求的存储大小为 1Gi

然后运行文件

StatefulSet扩容和缩容

StatefulSet一种是基于命令行

yaml 复制代码
kubectl scale sts web --replicas=5

这里可以使用describe查看事件详情,可以看到扩容顺序

缩容的话也是将副本改为你想要的副本数

yaml 复制代码
kubectl scale sts web -replicas=2

这个时候查看事件就可以看到在对之前扩容的pod在进行删除操作

这里做缩容的特点:与 Deployment 的区别:

  • Deployment:缩容时,Pod 会随机被删除,Kubernetes 并不关心 Pod 的顺序。(这个之前文章没写,后面可能会按照心情决定补不补)
  • StatefulSet :缩容时,Pod 按照 有序 的方式删除,遵循 nginx-<数字> 的顺序进行倒序删除。

StatefulSet的镜像更新

yaml 复制代码
kubectl patch sts web --type='json' -p='[{"op":"replace","path":"/spec/template/spec/containers/0/image","value":"nginx:1.91"}]'
这条命令的目标是
#解析
1、`path`
path:表示对资源进行局部跟新,而不是完全替换
2、`sts web`
set:是StatefulSet的缩写
web:指定要更新的StatefulSet的名字
3、`--type='json'`
--type='json':这个选项是告诉kubectl使用json path格式进行更新
4、`-p='[{"op":"replace","path":"/spec/template/spec/containers/0/image","value":"nginx:1.91"}]'`
-p='[{"op":"replace","path":"/spec/template/spec/containers/0/image","value":"nginx:1.91"}]'
-p:表示该选项后面跟随的部分是具体的更新内容
[{"op":"replace","path","/spec/template/spec/containers/0/image","value":"nginx:1.91"}]
op: "replace" --- 表示 替换操作,意思是替换目标路径下的当前值。
path: "/spec/template/spec/containers/0/image" --- 这是要更新的字段路径,表示你要替换 StatefulSet 中第一个容器的镜像(image)值。具体路径如下:
/spec:表示 StatefulSet 的规范部分。
/template:表示 Pod 模板部分,Pod 模板定义了该 StatefulSet 中 Pod 的配置。
/spec:Pod 模板中的容器规范部分。
/containers/0:容器列表中的第一个容器(0 是数组索引)。
/image:容器的镜像字段。
value: "nginx:1.91" --- 这是你要替换的新值,即更新容器的镜像为 nginx:1.91。

这里我们查看一下他的更新过程和结果

查看事件,这里可以看到是倒序有序更新

复制代码
kubectl describe sts web

查看更新结果

yaml 复制代码
kubectl edit pod web-0 查看配置文件内容
相关推荐
江华森14 小时前
从零搭建 Kubernetes 集群并部署 Kuboard v3 管理面板 —— 国内环境完整实战教程
容器·kubernetes
友莘居士15 小时前
KingbaseES Docker速查表
运维·docker·容器
小肥君16 小时前
docker镜像配置
运维·docker·容器
某林21218 小时前
Isaac Lab (v2.3.2) Docker 本地化部署与底层排障全解析
运维·docker·容器·架构·iassc
iDao技术魔方20 小时前
WSL 配 GPU 用 Docker 的折腾指南(2026 年版)
运维·docker·容器
跳动的世界线20 小时前
WSL 2 + Docker 本地全栈开发环境配置指南
运维·docker·容器
xiaogg367821 小时前
Rancher2.0搭建kubernetes(K8S)集群
云原生·容器·kubernetes
成为你的宁宁1 天前
【基于 Prometheus Operator 监控 K8s控制器、调度器、代理组件】
kubernetes·prometheus
IT策士1 天前
第 44篇 k8s之实战:将 Web 应用迁移到 Kubernetes(上)
前端·容器·kubernetes