qidao123.com技术社区-IT企服评测·应用市场

标题: k8s工作负载控制器--Statefulset [打印本页]

作者: 勿忘初心做自己    时间: 2024-9-5 23:48
标题: k8s工作负载控制器--Statefulset
目次

一、概述

StatefulSet 是 Kubernetes 中用于管理有状态应用步伐的工作负载资源对象。它提供了一种管理有状态服务的方式,确保每个 Pod 都有一个唯一的、持久的身份,并支持持久化存储。它在 Kubernetes v1.9 版本中成为 GA 版本。StatefulSet 设计用于管理和部署有状态服务,其管理的 Pod 拥有固定的名称(通常是 - 形式)和有序的启动和停止顺序。
在 StatefulSet 中,Pod 名称可以用作网络标识符,并且通常与 Headless Service 联合使用。Headless Service 没有 Cluster IP,直接袒露 Pod 的 IP 地址或 DNS 名称。解析 Headless Service 的名称时,会返回所有 Pod 的 IP 地址或 DNS 名称。
此外,StatefulSet 在 Headless Service 的根本上为每个 Pod 创建了一个 DNS 域名,这些域名通常形如 ...svc.cluster.local。
StatefulSet 支持持久化存储,它可以使用多种持久化存储范例,包罗本地存储、网络文件体系(NFS)等。
二、引入"有状态"需求

1、管理无状态服务的 Deployment 实现了什么


起首它支持界说一组 Pod 的盼望数量,Controller 会为我们维持 Pod 的数量在盼望的版本以及盼望的数量;
第二它支持配置 Pod 发布方式,配置完成后 Controller 会按照我们给出的策略来更新 Pod,同时在更新的过程中,也会包管不可用 Pod 数量在我们界说的范围内;
第三,如果我们在发布的过程中遇到问题,Deployment 也支持一键来回滚。
简朴来说,Deployment 认为:它管理的所有相同版本的 Pod 都是一模一样的副本。也就是说,在 Deployment Controller 看来,所有相同版本的 Pod,不管是里面部署的应用还是举动,都是完全相同的。
1.1、创建 Deployment
  1. cat >> web-app.yaml << EOF
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5.   name: web-app
  6. spec:
  7.   replicas: 3
  8.   selector:
  9.     matchLabels:
  10.       app: web-app
  11.   template:
  12.     metadata:
  13.       labels:
  14.         app: web-app
  15.       annotations:
  16.         deployment.kubernetes.io/revision: "1"
  17.     spec:
  18.       containers:
  19.       - name: web-server
  20.         image: nginx:1.15.0
  21.         ports:
  22.         - containerPort: 80
  23. EOF
  24. kubectl apply -f web-app.yaml --record=true
复制代码

以上就是管理无状态服务的 Deployment 实现了什么功能展示
2、新需求分析

以下需求来自于一些有状态应用:
这些有状态应用的需求都是 Deploment 无法满足的,因此引入了管理有状态应用的 StatefulSet
三、StatefulSet:面向有状态应用管理的控制器


1、创建 Service、Statefulset
  1. kubectl get pods -l app=web-app
复制代码
1、spec 字段解析



2、升级策略字段解析


可以看到 StatefulSetUpdateStrategy 有个 type 字段,这个 type 界说了两个范例:一个是 RollingUpdate;一个是 OnDelete
RollingUpdateStatefulSetSetStrategy 中,可以看到有个字段叫 Partition。这个 Partition 表示滚动升级时,保存旧版本 Pod 的数量。不是灰度新版本的数量
举个例子:假设当前有个 replicas 为 10 的 StatefulSet,当我们更新版本的时候,如果 Partition 是 8,并不是表示要把 8 个 Pod 更新为新版本,而是表示必要保存 8 个 Pod 为旧版本,只更新 2 个新版本作为灰度。当 Replica 为 10 的时候,配置 Partition 为 8 的时候,实在还是保存 [0,8) 这 8 个 Pod 为旧版本,只有 [8,10) 进入新版本。

总结一下,假设 replicas=N,Partition=M (M




欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/) Powered by Discuz! X3.4