这篇概述是看文章提到的一段话 xxx is not targeted to be horizontally scalable 引发的,遂整理记录在这里。

起因是有两个应用,一个是无状态的,可以 horizontally scalable,另一个是有状态的,和数据库绑定,horizontally scalable。无状态的应用配成 Deployment, 有状态的应用配成 StatefulSets。

引发的思考是:有状态的应用怎么和数据库绑定以及扩展有状态应用会发生什么?带着这个问题开始了学习,并且整理如下。

Deployment 和 StatefulSets 控制器

介绍这两种控制器之前,先说下 Pod。Pod 是对 container 的一层封装,它的结构体定义可以看 这里:

// Pod is a collection of containers that can run on a host. This resource is created
// by clients and scheduled onto hosts.
type Pod struct {
metav1.TypeMeta `json:",inline"`
...
}

直接对 container 控制是很难控制的,比如扩展伸缩,网络管理等。所以,kubernetes 引入了 Pod 结构体作为最小的细粒度单元进行管理。在

深入剖析 Kubernetes 中将 container 比喻为集装箱,将 Pod 比喻为集装箱上的"抓手",这个比喻是很合理的。

那对于"抓手"用什么去抓呢?所谓的,起重机是哪个?

控制器就是这个起重机,在 Kubernetes 中控制器负责 Pod 的扩展伸缩等一系列控制,之所以是一系列是因为控制器不是一种,每种控制器负责不同的控制操作,它们都属于 kube controller manager

组件下定义的控制器,不同控制器可看 这里。控制器遵循通用的循环控制编排模式,其伪代码实现如下:

for {
acutalStatus := x.getPodActualStatus
expectStatus := x.getPodExpectStatus if acutalStatus != expectStatus {
doControllerAction(...) // change the actual status to expected status
else
doNothing
}
}

对于 Pod 的扩展伸缩,编排控制器有 replicationcontrollers,它直接对 Pod 进行控制,当 Pod 期望数量和实际数量不一致时,扩展 Pod 实际数量到期望数量。反之亦然。

不过在用 replicationcontrollers 进行控制时有个问题,就是无法做到对 Pod 滚动更新的支持。试想 replicationcontrollers 控制器 A 直接控制 pod b,当 pod b 更新到

pod c 时,A 直接控制 c。如果此时想回去 b 就回不去了,因为 A 直接控制的是 c。

Kubernetes 引入了 Deployment 和 ReplicaSets 来支持滚动更新。Deployment 控制 replicasets,再由 ReplicaSets 控制 pod。ReplicaSets 对 pod 的控制是直接的,Deployment 对于

pod 的控制是间接的(可以通过 ownerReference field 查看对象所属的 owner)。

可由一张图解释这一控制过程:

Deployment 控制 ReplicaSet(v1), ReplicaSet(v1) 控制 pod。当做滚动更新时,Deployment 创建新的 ReplicaSet(v2),由 v2 创建新版本 pod,并且 v1 删除旧版本 pod(这里涉及到 pod

滚动更新策略,不细讲)。最终,滚动更新的新 pod 由 v2 控制,而旧的 ReplicaSet v1 还在,当需要回滚时,旧的 pod 会再次被 ReplicaSet 创建。

至此,Pod 的扩展伸缩和滚动更新都做好了。

不过,还有一个问题。不管 Deployment 还是 ReplicationController 其管理的 pod 都是无状态的。默认 pod 都是一样的,而实际应用往往对 pod 的要求是有状态的。

比如 Pod 需要依赖特定数据库,比如 pod 有主备之分等情况,都没办法让这类 pod 由 Deployment 管理。

基于此,kubernetes 引入了 StatefulSets 控制器,顾名思义,它是对有状态 Pod 的管理。

StatefulSets 通过两点实现有状态 Pod 的管理:

  1. 拓扑状态:通过 service + pod 的形式找到每个 pod 的 ip,当 pod 删掉再重建之后 Kubernetes 还是能给它配置原来的 ip。
  2. 存储状态:通过 pvc 的形式将 pod 和 pvc 绑定,当 pod 扩展伸缩时,相应的 pvc 也会动态扩展伸缩。

对于第一点和第二点,在扩展讲一点,详细内容可看这里。

拓扑状态

# nslookup yyy.luban.svc.cluster.local
Server:         172.17.7.2
Address:        172.17.7.2#53 Name:   yyy.luban.svc.cluster.local
Address: 10.10.xxx.xxx # kubectl get endpoints  -n luban | grep yyy
yyy                        10.10.xxx.xxx  

其中, yyy 是创建的 headless service,通过 DNS 解析出它对应的 endpoints,10.10.xxx.xxx 是对应的 pod ip。

存储状态

在 yaml 文件中添加 volumeClaimTemplates 模板定义 pod 绑定的 pvc:


apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
serviceName: "nginx"
replicas: 2
...
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi

其中,pvc 将和 pod 一一绑定,扩展 pod 数,相应的 pvc 也会扩展:

$ kubectl get statefulsets.apps
NAME READY AGE
web 2/2 2m16s $ kubectl edit statefulsets.apps
statefulset.apps/web edited $ kubectl get pods
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 2m38s
web-1 1/1 Running 0 90s
web-2 0/1 ContainerCreating 0 4s $ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
www-web-0 Bound pvc-53b1361a-dc5f-4722-ae92-48dafd0717cb 1Gi RWO standard 2m43s
www-web-1 Bound pvc-332fa158-ecd9-4d3a-ada4-497b2bae1b3a 1Gi RWO standard 95s
www-web-2 Bound pvc-d5c1eb0c-ad91-4095-9da7-1876b1dfa135 1Gi RWO standard 9s

Deployment 和 StatefulSets 概述的更多相关文章

  1. [原创]Hadoop-2.5.2-HA原文译

    使用the Quorum Journal Manager实现HDFS高可用 2017/1/22 11:57:22 原文 目的(Purpose) * 这个指南提供了对HDFS-HA特性,使用QJM特性如 ...

  2. 2020年必须掌握的硬核技能k8s

    Kubernetes 是一个软件系统,使你在数以万计的电脑节点上运行软件时就像 所有节点是以单个大节点一样, 它将底层基础设施抽象,这样做同时简化了应用开发.部署,以及对开发和运维团队的管理. Kub ...

  3. Kubernetes 降本增效标准指南 | 基于K8s 扩展机制构建云上成本控制系统

    作者 王玉君,腾讯云后台高级开发工程师,负责腾讯云原生系统开发及建设. 晏子怡,腾讯云容器产品经理,在K8s弹性伸缩.资源管理领域有丰富的实战经验. 导语 Kubernetes 作为 IaaS 和 P ...

  4. Kubernetes(K8s)极速入门

    1. 概述 老话说的好:努力学习,努力提高,做一个有真才实学的人. 言归正传,之前我们聊了 如何使用国内的镜像源搭建 kubernetes(k8s)集群 ,今天我们来聊聊如何在 kubernetes( ...

  5. 一、Microsoft Dynamics CRM 4.0 SDK概述

    Chapter 1. Microsoft Dynamics CRM 4.0 SDK Overview(SDK概述) You are probably reading this book because ...

  6. [HeadFirst-JSPServlet学习笔记][第一章:前言与概述]

    第一章 前言与概述 web服务器做什么? 答:接收客户请求,然后向客户返回结果 web客户做什么? 答:此处客户指浏览器,web客户允许用户请求服务器上的某个资源,并向用户展现请求的结果. html ...

  7. Kubernetes服务之StatefulSets简介

    StatefulSets在v1.5时还是个beta特性,它取代了v1.4的PetSets特性.PetSets的用户可以参考v1.5的升级指导,将正在运行的PeetSets升级到StatefulSets ...

  8. Kubernetes 中的核心组件与基本对象概述

    Kubernetes 是 Google 基于 Borg 开源的容器编排调度,用于管理容器集群自动化部署.扩容以及运维的开源平台.作为云原生计算基金会 CNCF(Cloud Native Computi ...

  9. 李洪强iOS之集成极光推送一iOS SDK概述

    李洪强iOS之集成极光推送一iOS SDK概述 JPush iOS 从上图可以看出,JPush iOS Push 包括 2 个部分,APNs 推送(代理),与 JPush 应用内消息. 红色部分是 A ...

  10. 【三小时学会Kubernetes!(四) 】Deployment实践

    Deployment 部署 Kubernetes 部署可以帮助每一个应用程序的生命都保持相同的一点:那就是变化.此外,只有挂掉的应用程序才会一尘不变,否则,新的需求会源源不断地涌现,更多代码会被开发出 ...

随机推荐

  1. PanguHA,一款Windows双机热备工具

    1.简介 PanguHA是Windows平台的双机热备集群系统,是提供系统高可用性的解决方案,一般由两个节点构成,分为活动节点及备用节点(两者之间可以相互切换),软件界面如下 PanguHA下载地址 ...

  2. JXNU acm选拔赛 不安全字符串

    不安全字符串 Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total Submis ...

  3. idea2020.1.3汉化包报错问题

    已解决:idea2020.1.3汉化包报错问题 问题描述:插件市场提供的版本不对.不兼容,所以需要手动下载安装 这里附上文件 https://wwsi.lanzouq.com/b03czdtwf 密码 ...

  4. 获取微信的token工具类

    import cn.hutool.extra.spring.SpringUtil; import cn.hutool.http.HttpUtil; import cn.RedisUtil; impor ...

  5. 神经网络优化篇:详解神经网络的权重初始化(Weight Initialization for Deep NetworksVanishing / Exploding gradients)

    神经网络的权重初始化 这是一个神经单元初始化地例子,然后再演变到整个深度网络. 来看看只有一个神经元的情况,然后才是深度网络. 单个神经元可能有4个输入特征,从\(x_{1}\)到\(x_{4}\), ...

  6. elastic常用api

    elasticsearch运维常用API 查看集群状态 查询集群状态命令: curl -XGET "http://ip:port/_cluster/health?pretty" # ...

  7. 10个安全问题带你了解OWASP 定义的大模型应用

    摘要:OWASP 的一群研究人员,总结目前大模型中可能存在的TOP10安全风险,很好的揭示了我们在大模型应用中需要防护的目标,以及如何采取相应的防护措施. 本文分享自华为云社区<OWASP 定义 ...

  8. 云原生开发者须具备的1+N技能,开启第二曲线

    摘要:云的大环境下,意味以云为中心的快速应用开发能力将成为"胜负手".在现如今如此复杂的外部环境,且高速发展的情况下,为了不重蹈覆辙,必须需要开发者的第二曲线来破局! 随着云计算的 ...

  9. 带你读AI论文:SDMG-R结构化提取—无限版式小票场景应用

    摘要:在文档图像中提取关键信息在自动化办公应用中至关重要.传统基于模板匹配或者规则的方法,在通用性方面.未见过版式模板数据方面,效果都不好:为此,本文提出了一种端到端的空间多模态图推理模型(SDMG- ...

  10. 火山引擎 DataLeap 套件下构建数据目录(Data Catalog)系统的实践

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 摘要 Data Catalog 产品,通过汇总技术和业务元数据,解决大数据生产者组织梳理数据.数据消费者找数和理解 ...