StatefulSet 有状态应用[有状态应用]

有状态:StatefulSet
  - 集群节点之间的关系。
  - 数据不完全一致。
  - 实例之间不对等的关系。
  - 依靠外部存储的应用。
  - 通过dns维持身份
  - 每个pod都有特定的名称和网络标识(如pod名是由statefulSet名+有序的数字组成(0、1、2..))
 
 
 redis是有状态应用
StatefulSet(有状态集,缩写为sts)常用于部署有状态的且需要有序启动的应用程序,比如在进行SpringCloud项目容器化时,Eureka的部署是比较适合用StatefulSet部署方式的,可以给每个Eureka实例创建一个唯一且固定的标识符,并且每个Eureka实例无需配置多余的Service,其余Spring Boot应用可以直接通过Eureka的Headless Service即可进行注册。
Eureka的statefulset的资源名称是
eureka,eureka-0
eureka-1
eureka-2
Service:headless service,没有ClusterIP [每个]
eureka-svc Eureka-0.eureka-svc.NAMESPACE_NAME eureka-1.eureka-svc …
连接 eureka的资源名称为:eureka

statefullset示例

apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
serviceName: "nginx"
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
name: web [root@k8s-master01 statefullset]# kubectl create -f statefullset.yaml
service/nginx created
statefulset.apps/web created #扩容:
replicas: 2 #[定义副本集数量] [root@k8s-master01 statefullset]# kubectl get pod
web-0 1/1 Running 0 1m
web-1 1/1 Running 0 1m #命令扩容
[root@k8s-master01 statefullset]# kubectl scale --replicas=3 sts web
statefulset.apps/web scaled #检查扩容
[root@k8s-master01 statefullset]# kubectl get pod
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 15m
web-1 1/1 Running 0 12m
web-2 1/1 Running 0 35s #检查扩容流程:
[root@k8s-master01 ~]# kubectl scale --replicas=5 sts web
statefulset.apps/web scaled [root@k8s-master01 ~]# kubectl get pod -l app=nginx -w
NAME READY STATUS RESTARTS AGE
nginx-68db656dd8-cc4jv 1/1 Running 0 36h
nginx-68db656dd8-hvj8x 1/1 Running 0 36h
web-0 1/1 Running 0 18h
web-1 1/1 Running 0 18h
web-2 0/1 Pending 0 0s
web-2 0/1 Pending 0 0s
web-2 0/1 ContainerCreating 0 0s
web-2 1/1 Running 0 18s
web-3 0/1 Pending 0 0s
web-3 0/1 Pending 0 0s
web-3 0/1 ContainerCreating 0 0s
web-3 1/1 Running 0 18s
web-4 0/1 Pending 0 0s
web-4 0/1 Pending 0 0s
web-4 0/1 ContainerCreating 0 0s
web-4 1/1 Running 0 17s

statefulset 更新策略

#默认更新策略:
updateStrategy:
rollingUpdate:
partition: 0 # 设置为1 一次更新一个,如果设置为 0 则是随机更新
type: RollingUpdate #--- statefulset默认更新策略 滚动更新,有一个更新失败就不会继续更新,deployment是随机更新模式 statefulset更新策略:
1. RollingUpdate 滚动更新 [从下往上更新,倒序更新]
2. OnDelete 手动更新 [需要删除一个pod才会触发更新策略]

默认更新策略RollingUpdate示例:

 执行命令: kubectl edit sts web
找到:
containers:
- image: nginx
改为:
containers:
- image: nginx:1.15.2 # 查看更新过程:
[root@k8s-master01 ~]# kubectl get pod -l app=nginx -w
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 20h
web-1 1/1 Running 0 20h
web-2 1/1 Running 0 89m
web-2 1/1 Terminating 0 90m
web-2 0/1 Terminating 0 90m
web-2 0/1 Terminating 0 90m
web-2 0/1 Terminating 0 90m
web-2 0/1 Pending 0 0s
web-2 0/1 Pending 0 0s
web-2 0/1 ContainerCreating 0 0s
web-2 1/1 Running 0 19s
web-1 1/1 Terminating 0 20h
web-1 0/1 Terminating 0 20h
web-1 0/1 Terminating 0 20h
web-1 0/1 Terminating 0 20h
web-1 0/1 Pending 0 0s
web-1 0/1 Pending 0 0s
web-1 0/1 ContainerCreating 0 0s
web-1 1/1 Running 0 20s
web-0 1/1 Terminating 0 20h
web-0 0/1 Terminating 0 20h
web-0 0/1 Terminating 0 20h
web-0 0/1 Terminating 0 20h
web-0 0/1 Pending 0 0s
web-0 0/1 Pending 0 0s
web-0 0/1 ContainerCreating 0 0s
web-0 1/1 Running 0 19s # 查看更新结果:
[root@k8s-master01 ~]# kubectl get pod -l app=nginx
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 59s
web-1 1/1 Running 0 88s
web-2 1/1 Running 0 118s # 验证结果:
[root@k8s-master01 ~]# kubectl exec -it web-0 -- sh
# nginx -v
nginx version: nginx/1.15.2

OnDelete策略示例:

# 修改为 OnDelete 策略
# kubectl edit sts web 找到:
updateStrategy:
rollingUpdate:
partition: 0
type: RollingUpdate 改为:
updateStrategy:
type: OnDelete # 修改镜像版本来查看 是否此策略会更新版本
image: nginx
#改为:
image: nginx:1.15.3 #保存 [删除 rollingUpdate: 与 partition: 0 并且将 type: RollingUpdate 改为 type: OnDelete ] #检查:
[root@k8s-master01 ~]# kubectl get pod |grep web
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 6m58s
web-1 1/1 Running 0 7m17s # <-- 并未更新
web-2 1/1 Running 0 7m48s #再次修改镜像版本并删除其中一个pod:
[root@k8s-master01 ~]# kubectl edit sts web #把 nginx:1.15.3 改为 nginx:1.15.2
statefulset.apps/web edited
[root@k8s-master01 statefullset]# kubectl delete pod web-1
pod "web-1" deleted # 检查删除的pod更新状态:
[root@k8s-master01 statefullset]# kubectl get pod web-1 -o yaml|grep image
- image: nginx:1.15.3
imagePullPolicy: Always
image: nginx:1.15.3
imageID: docker-pullable://nginx@sha256:24a0c4b4a4c0eb97a1aabb8e29f18e917d05abfe1b7a7c07857230879ce7d3d3 # 检查未删除的pod版本:
[root@k8s-master01 statefullset]# kubectl get pod web-0 -o yaml|grep image
- image: nginx
imagePullPolicy: Always
image: nginx:latest
imageID: docker-pullable://nginx@sha256:353c20f74d9b6aee359f30e8e4f69c3d7eaea2f610681c4a95849a2fd7c497f9 # 再删除这个未删除的版本检查删除后是否会更新,刚删除的web-1 现在删除web-0:
[root@k8s-master01 statefullset]# kubectl delete pod web-0
pod "web-0" deleted #检查删除后的web-0 是否更新了版本
[root@k8s-master01 statefullset]# kubectl get pod web-0 -o yaml|grep image
- image: nginx:1.15.3
imagePullPolicy: Always
image: nginx:1.15.3 # -- 确定已经更新了版本
imageID: docker-pullable://nginx@sha256:24a0c4b4a4c0eb97a1aabb8e29f18e917d05abfe1b7a7c07857230879ce7d3d3 这就是Ondelete的更新策略

灰度发布常用策略 partition

#OnDelete与策略解释:
updateStrategy:
type: OnDelete # 删除pod才会更新 #partition策略解释 RollingUpdate :
updateStrategy:
rollingUpdate:
partition: 2 #大于2的才会被更新
type: RollingUpdate #自动更新

级联删除和非级联删除

#级联删除:
#删除 statefullset 时同时删除 pod
[root@k8s-master01 statefullset]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-68db656dd8-cc4jv 1/1 Running 0 10d
nginx-68db656dd8-hvj8x 1/1 Running 0 10d
web-0 1/1 Running 0 3m2s
web-1 1/1 Running 0 2m42s [root@k8s-master01 statefullset]# kubectl get sts
NAME READY AGE
web 2/2 39s # kubectl delete sts web
[root@k8s-master01 statefullset]# kubectl get sts
No resources found in default namespace. #非级联删除 [极少使用] 删除 statefullset 不删除 pod
[root@k8s-master01 statefullset]# kubectl get sts
NAME READY AGE
web 2/2 3s [root@k8s-master01 statefullset]# kubectl delete sts web --cascade=orphan
statefulset.apps "web" deleted [root@k8s-master01 statefullset]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-68db656dd8-cc4jv 1/1 Running 0 10d
nginx-68db656dd8-hvj8x 1/1 Running 0 10d
web-0 1/1 Running 0 3m43s
web-1 1/1 Running 0 3m35s kubectl delete sts web --cascade=orphan #非级联删除 ,但是pod不会被删除,会变成孤儿pod
kubectl delete pod web-0 web-1 #这时候删除的pod都不会被重建。 #注意 非级联删除 pod是不会被删除的,他会变成孤儿pod,此时使用 kubectl delete pod web-0 web-1 删除不会再创建

在日常中基本不会用到非级联删除,因为非级联删除还会遗留pod来手工操作删除

kubenetes中的pod删除策略 级联删除与非级联删除的更多相关文章

  1. Redis 过期键删除策略

    Redis 中数据库键的过期时间都保存在过期字典中,当一个键过期了,Redis 存在三种不同的删除策略:定时删除.惰性删除和定期删除 定时删除 定义 在设置键的过期时间的同时创建一个计时器,让定时器在 ...

  2. redis学习笔记——Redis过期键的删除策略

    Redis过期键的删除策略 对于过期键一般有三种删除策略 定时删除:在设置键的过期时间的同时,创建一个定时器(timer),让定时器在键的过期时间来临时,立即执行对键的删除操作: 惰性删除:放任键过期 ...

  3. redis的3种过期键删除策略

    Redis的过期键的过期时间都保存在过期字典中,过期键的删除策略有三种,分别是定时删除.惰性删除和定期删除. 定时删除 定时删除策略,是指在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时 ...

  4. Redis生存时间、删除策略和排序

    生存时间 设置命令 expire key long:设置数据在long秒后过期. pexpire key long:设置数据在long毫秒后过期. ttl key:查询数据剩余的生存时间.如果数据已过 ...

  5. Redis系列(五):Redis的过期键删除策略

    本篇博客是Redis系列的第5篇,主要讲解下Redis的过期键删除策略. 本系列的前4篇可以点击以下链接查看: Redis系列(一):Redis简介及环境安装 Redis系列(二):Redis的5种数 ...

  6. Redis详解(十一)------ 过期删除策略和内存淘汰策略

    在介绍这篇文章之前,我们先来看如下几个问题: ①.如何设置Redis键的过期时间? ②.设置完一个键的过期时间后,到了这个时间,这个键还能获取到么?假如获取不到那这个键还占据着内存吗? ③.如何设置R ...

  7. Redis的过期键删除策略

    文章首发于公众号:蘑菇睡不着,欢迎来看看 前言 Redis 中都是键值对的存储形式,键都是字符串类型的,而值有很多种类型,如 string.list.hash.set.sorted set等类型.当设 ...

  8. 面试官:Redis 过期删除策略和内存淘汰策略有什么区别?

    作者:小林coding 计算机八股文网站:https://xiaolincoding.com 大家好,我是小林. Redis 的「内存淘汰策略」和「过期删除策略」,很多小伙伴容易混淆,这两个机制虽然都 ...

  9. Redis中的LRU淘汰策略分析

    Redis作为缓存使用时,一些场景下要考虑内存的空间消耗问题.Redis会删除过期键以释放空间,过期键的删除策略有两种: 惰性删除:每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除 ...

  10. redis中key的过期键删除策略

    Redis过期键删除策略 Redis key过期的方式有三种: 被动删除:当读/写一个已经过期的key时,会触发惰性删除策略,直接删除掉这个过期key 主动删除:由于惰性删除策略无法保证冷数据被及时删 ...

随机推荐

  1. pytest接口自动化搭建经验

    前言:目前公司的主要产品是一个web类型的产品:需要做一些自动化,目前的想法是只做接口自动化,不做ui的一个自动化,目前的思路是先对主流程做正常校验,后期再对每一个接口做校验: 一.版本信息: pyt ...

  2. 【笔记】Oracle union all&for update锁

    [笔记]Oracle union all&for update union all 在Oracle中有三种类型的集合操作 UNION:求并,重复记录只显示一次 UNION ALL:求并集,显示 ...

  3. 力扣176(MySQL)-第二高的薪水(中等)

    题目: id 是这个表的主键.表的每一行包含员工的工资信息. 编写一个 SQL 查询,获取并返回 Employee 表中第二高的薪水 .如果不存在第二高的薪水,查询应该返回 null . 查询结果如下 ...

  4. 一文读懂 BizDevOps:数字化转型下的技术破局

    简介: 目标.方法与实践. 我们正迈向数字经济时代,数字化转型成为普遍行动.未来绝大多数业务都将运行在数字基座之上,软件系统成为业务创新和发展的核心引擎.在这一趋势下,产品研发的交付能力面临巨大挑战, ...

  5. 龙蜥开源内核追踪利器 Surftrace:协议包解析效率提升 10 倍! | 龙蜥技术

    ​简介:如何将网络报文与内核协议栈清晰关联起来精准追踪到关注的报文行进路径呢? ​ 文/系统运维 SIG Surftrace 是由系统运维 SIG 推出的一个 ftrace 封装器和开发编译平台,让用 ...

  6. 10倍性能提升!DLA SQL推出基于Alluxio的数据湖分析加速功能

    简介: 在存储计算分离的场景下,通过网络从远端存储读取数据是一个代价较大的操作,往往会带来性能的损耗.以OSS为例,OSS数据读取延时通常较本地磁盘大很多,同时OSS对单个用户使用的带宽上限做了限制, ...

  7. 面向B端算法实时业务支撑的工程实践

    简介:在营销场景下,算法同学会对广告主提供个性化的营销工具,帮助广告主更好的精细化营销,在可控成本内实现更好的ROI提升.我们在这一段时间支持了多个实时业务场景,比如出价策略的实时化预估.关键词批量服 ...

  8. hyengine - 面向移动端的高性能通用编译/解释引擎

    ​简介:手机淘宝客户端在历史上接过多种多样的脚本引擎,用于支持的语言包括:js/python/wasm/lua,其中js引擎接过的就有:javascriptcore/duktape/v8/quickj ...

  9. Effective Java 在工作中的应用总结

    简介: <Effective Java>是一本经典的 Java 学习宝典,值得每位 Java 开发者阅读.笔者将书中和平日工作较密切的知识点做了部分总结. ​ 作者 | 宜秋 来源 | 阿 ...

  10. [MongoDB] aggregate 查询的优化思路

    首先从业务角度出发,不必要的筛选条件和粗略的筛选条件会严重影响查询速度,比如 $or 查询和 $in 查询,视情况尽可能去掉. 程序中打印出查询条件的各部分,有 $match.$group.比如 PH ...