陈同学
微服务
Accelerator
About
# K8s 基础控制器:Deployment K8s中非常重要的设计思想是:**控制器模式**,即通过一个对象来控制另一个对象,而Deployment就是最基础的控制器。 **"控制器模式"** 其实是一种管理方式,社会的各种层级关系,各种上下级管理岗位也是一样的含义,例如:学生、组长、班长、老师。 ## 目标状态 谈到控制,就一定有目标状态(期望状态、理想状态)。而控制器一方面要描述期望状态,同时利用汇报或检测机制,要将当前状态调整为期望状态。 在K8s中,期望状态可以是:实例数量、期望节点等信息。 ## 控制器组成 以下面Deployment的yaml文件为例子。控制器包含: * 控制器自身定义:包含本身信息、期望状态信息。如replicas=2表示期望运行2个nginx实例。 * 被控制的对象:包含被控制的对象的描述信息,一般被控制的都是Pod,也称为 **Pod模板**。 ```yaml # 控制器的定义 apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 2 selector: matchLabels: app: nginx # 被控制的对象(Pod模板) template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80 ``` ## Deployment Deployment 是最基础的控制器,也是非常重要的控制器,它具备: * **编排能力**:当修改replicas时,可以自动水平扩展或伸缩。 * 滚动更新能力:当修改Pod模板信息时,如修改镜像版本,则需要进行滚动更新。 ### ReplicaSet 但Deployment并不直接管控Pod,而是通过 ReplicaSet(副本集)来管理,这是典型的 **通过一个对象管理另一个对象**。 ReplicaSet 用于保证在任意时间内有指定数量的Pod在运行,其控制器定义部分是Deployment的一个子集。 ```yaml # 控制器定义 apiVersion: apps/v1 kind: ReplicaSet metadata: name: nginx-set labels: app: nginx spec: replicas: 2 selector: matchLabels: app: nginx # Pod模板 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx ``` 效果如下图: ![](https://blog-1256695615.cos.ap-shanghai.myqcloud.com/2020/02/09/6.png) ### 滚动更新Demo 以常见的应用升级为例,假定直接修改镜像版本以完成升级。可以使用多种命令完成操作: ```bash kubectl apploy -f nginx.yaml kubectl set image deployment/nginx-deployment nginx=nginx:1.17.8 kubectl edit deployment deployment/nginx-deployment ``` 假定deployment滚动升级策略如下,Pod数量为2. ```yaml spec: strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 maxUnavailable: 1 ``` * maxSurge: surge含义是激增,表示在升级过程中除期望数量外最多可以存在的Pod数。 例如:replicas=10,maxSurge=2,则每次可以处理两个Pod。 * maxUnavailable:表示升级过程中,最多有N个Pod无法提供服务,也就是每次最多能销毁的Pod数。 以上两个参数要结合起来看。 **滚动更新过程** * 因修改Pod定义,因此创建一个新的ReplicaSet(**通过RS数量来控制应用版本**),初始replicas=0 * 将新ReplicaSet控制的Pod replicas从0变为1,即水平拓展出一个副本 * 将旧ReplicaSet控制的Pod replicas从2变为1,即销毁一个副本 * 通过Pod的健康检查机制,由于maxUnavailable=1,所以会等到新Pod健康后再处理下一轮。然后循环上面两个步骤,交替升级直至完成。
本文由
cyj
创作,可自由转载、引用,但需署名作者且注明文章出处。
文章标题:
K8s 基础控制器:Deployment
文章链接:
https://chenyongjun.vip/articles/133
扫码或搜索 cyjrun 关注微信公众号, 结伴学习, 一起努力