首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Kubernetes(k8s)-StatefulSet介绍

Kubernetes(k8s)-StatefulSet介绍

作者头像
运维小路
发布2024-12-30 18:24:57
发布2024-12-30 18:24:57
3230
举报
文章被收录于专栏:运维小路运维小路

我们上一章介绍了Docker基本情况,目前在规模较大的容器集群基本都是Kubernetes,但是Kubernetes涉及的东西和概念确实是太多了,而且随着版本迭代功能在还增加,笔者有些功能也确实没用过,所以只能按照我自己的理解来讲解。

前面讲的无论是deployment还是DaemonSet,而且deployment还是通过控制ReplicaSets来实现,而DaemonSet比并没有采用额外的控制器,他们总体都还算是无状态的,但是实际上有些业务里面是有数据的,并且里面还有标识符来标识该pod,比如数据库mysql,中间件zookeeper等,今天我们再一如另外一个控制器:StatefulSet,简称sts。

StatefulSet 是 Kubernetes 中专门用于管理有状态应用的工作负载 API 对象。与 Deployment 和 DaemonSet 不同,StatefulSet 提供了额外的功能来确保应用程序的状态和持久性,特别适用于需要稳定身份、持久存储以及有序部署的应用程序。

核心特性

稳定的网络标识:每个 Pod 都有一个唯一的、基于 DNS 的网络标识符(如 web-0.nginx.default.svc.cluster.local),即使 Pod 重启或重新调度,其标识符也不会改变。这对于需要相互之间进行通信的有状态应用非常重要。

有序且稳定的部署和扩展:StatefulSet 确保 Pod 按照顺序创建,并且在删除时也按照顺序进行。例如,在扩展时会先创建 web-0,然后是 web-1,以此类推;而在缩容时则相反。这有助于简化备份、恢复等操作。

持久存储:StatefulSet 支持为每个 Pod 分配独立的持久卷声明(PersistentVolumeClaim, PVC)。即使 Pod 被删除并重新创建,其数据仍然保留,并且新 Pod 会挂载到相同的持久卷上。这意味着每个 Pod 都有自己的持久存储,不会与其他 Pod 共享。

自动化的更新策略:提供了滚动更新和回滚的能力,但相比 Deployment 更加保守,默认情况下不会同时更新所有 Pod,以减少对服务的影响。您可以配置 Partition 来控制哪些 Pod 参与更新,哪些保持不变。

稳定的身份:每个 Pod 在 StatefulSet 中都有一个稳定的身份,包括名称和主机名,这使得它们在网络中可以被可靠地识别和访问。Pod 名称遵循格式 <statefulset-name>-<ordinal>,其中 ordinal 是从 0 开始的整数。

头等公民的服务发现:Kubernetes 为 StatefulSet 创建的每个 Pod 自动生成 Headless Service(无头服务),允许客户端通过 DNS 查询找到这些 Pod。您还可以为 StatefulSet 配置常规的 ClusterIP 类型服务,以便外部访问。

升级策略

支持多种更新策略,如 RollingUpdate(默认)和 OnDelete。RollingUpdate 会在后台逐步替换旧版本的 Pod,而 OnDelete 则只会在手动删除 Pod 后创建新的 Pod。

案例

由于这里我们还没有讲解服务(service)和pv&pvc,所以我们这里的案例是不涉及pvc和svc,只涉及sts的pod名字和标识符。

代码语言:javascript
复制
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: nginx-statefulset
spec:
  serviceName: "nonexistent" # 必须指定 serviceName,但可以指向不存在的服务
  replicas: 3 # 运行三个副本
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: 192.168.31.43:5000/nginx:latest
        ports:
        - containerPort: 80
          name: web

如果是deployment,pod的名字是deployment名字-rs名字-随机字符,而sts的名字则是statefulset名字-固定编号(0,1,2,3)。

真实的sts,比如一个zk集群,集群之间的访问地址是不能改变的,所以这里的svc就会涉及到无头服务,常规的服务是一个服务对应后端多个pod,而这个无头无法则是一个服务对应一个后端固定pod,一个sts会产生多个服务地址,当然这里我们还讲解,所以这里只作为一个提示。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-12-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维小路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档