kubernetes-Deployment、ReplicaSet介绍、更新、回滚策略介绍

2,339 阅读5分钟

ReplicaSet介绍

负责编排无状态应用的基础控制器是ReplicaSet,相应的资源类型通过三个关键组件 定义如何编排一个无状态应用

  • replicas:期望运行的Pod副本数
  • selector:标签选择器
    • matchLabels 等值
    • matchExpressions: 表达式
  • template:Pod模板

ReplicaSet的问题

但是无法 无损更新, ReplicaSet的升级需要大量的手工操作 所以衍生出了Deployment 升级时 Deployment 会并存多个 ReplicaSet版本,

例如底层镜像更新了 需要手工删除pod 让ReplicaSet控制器 重新创建pod

ReplicaSet yaml示例

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: replicaset-demo
spec:
  minReadySeconds: 3
  replicas: 2
  selector:
    matchLabels:
      app: demoapp
      release: stable
      version: v1.0
  template:
    metadata:
      labels:
        app: demoapp
        release: stable
        version: v1.0
    spec:
      containers:
      - name: demoapp
        image: ikubernetes/demoapp:v1.0
        ports:
        - name: http
          containerPort: 80

注意: selector.matchLabels 必须是 template.metadata.labels的子集

获取ReplicaSet资源对象的状态

kubectl get rs
kubectl get replicaset

image.png

字段介绍

  • DESIRED 期望的pod数
  • CURRENT 当前的pod数
  • READY 就绪的pod数
  • AGE 当前资源创建后 生存的时长

Deployment控制器

image.png

Deployment介绍

  • 是建立在 ReplicaSet控制器 上层的更高级的控制器
  • 借助于 ReplicaSet 完成无状态应用的基本编排任务
  • 它位于ReplicaSet更上面一层,基于ReplicaSet提供了滚动更新、回滚等更为强大的应用编排 功能
  • 是ReplicaSet资源的编排工具
    • Deployment编排ReplicaSet
    • ReplicaSet编排Pod
  • 但是,应该直接定义Deployment资源来编排Pod应用,ReplicaSet无须显式给出

Deployment资源示例

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-demo
spec:
  replicas: 4
  selector:
    matchLabels:
      app: demoapp
      release: stable
  template:
    metadata:
      labels:
        app: demoapp
        release: stable
    spec:
      containers:
      - name: demoapp
        image: ikubernetes/demoapp:v1.0
        ports:
        - containerPort: 80
          name: http

获取Deployment资源对象的状态

kubectl get deployment

image.png

更新策略 介绍

Deployment控制器支持两种更新策略

指纹的变更 作为变更的前提

滚动式更新(rolling updates)

  • 指纹(Template的hash码变动后) 会维护replicaset老版本(rs01) 并且创建新版本(rs02)
  • 终态是老版本(rs01)的pod为0、新版本(rs02)的pod是3
  • 如果发现有问题 我们可以回归历史版本
  • 更新历史数默认保存10个版本

pod数量的变化情况

老版本新版本
rs01rs02
30
21
12
03
  • 逐批次更新Pod的方式,支持按百分比 或 具体的数量定义批次规模,默认策略

  • 触发条件:Template的hash码变动

    • 仅podTemplate的配置变动 会导致hash码改变
    • replicas和selector的变更 不会导致podTemplate的hash变动

重建式更新(recreate)

  • 在Pod资源被删除时,使用新的模板定义被足缺失的Pod数量,完成更新
  • 触发条件:现有Pod被删除

命令示例

触发滚动更新

最为常见的更新需求是应用升级,即镜像文件更新,常用方法

kubectl apply
kubectl set image (-f FILENAME | TYPE NAME) CONTAINER_NAME_1=CONTAINER_IMAGE_1 ... 
kubectl patch (-f FILENAME | TYPE NAME) [-p PATCH|--patch-file FILE [options] 
  • 直接更新原配置文件,而后使用“kubectl apply”命令触发更新
  • 上面第二和第三种方法可用于模板中任何必要配置的更新

查看更新状态:

## 语法
kubectl rollout status (TYPE NAME | TYPE/NAME) [flags] [options] 

kubectl rollout status deployment  deployment-demo

image.png

查看历史版本

## 语法
kubectl rollout history (TYPE NAME | TYPE/NAME) [flags] [options]

root@k8s-node01:~/learning-k8s/examples/deployments# kubectl rollout history deployment  deployment-demo
deployment.apps/deployment-demo 
REVISION  CHANGE-CAUSE
1         <none>

回滚到前一版本

kubectl rollout undo (TYPE NAME | TYPE/NAME) 

回滚到指定版本

kubectl rollout undo (TYPE NAME | TYPE/NAME) --to-revision=X

停止滚动更新

金丝雀场景 只更新1个新pod进去 老pod继续保留

kubectl rollout pause

如果灰度成功 可以kubectl rollout resume 继续更新

如果灰度失败 可以回滚

注意 生产环境必须配置livereadline探针 防止pod启动时立刻被service监听到 立马分配流量, pod中的应用可能还没有启动完毕 就接收到了流量

滚动更新策略 配置介绍

查看配置项

kubectl explain deploy.spec.strategy.rollingUpdate

image.png

pod数量和参数的关系

image.png

配置示例

  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate

maxSurge 参数

控制 当前最多可以存在的pod, 例如replicas=4 maxSurge=25% 那么最多可以存在5个

指定升级期间存在的总Pod对象数量最多可超出期望值的个数,其值可以是0或正整数,也可以是相对于期望值的一个百分比

maxUnavailable 参数

控制 可用的pod数量, 例如replicas=4 maxUnavailable=25% 那么最少可用的pod数量是3 也就是3、4、5都可以

升级期间正常可用的Pod副本数(包括新旧版本)最多不能低于期望值的个数,其值可以是0或正整数,也可以是相对于期望 值的一个百分比,默认值为1

存在的问题1:

必须以Pod为原子单位切割规模比例,且无法 精准控制流量路由的比例

无法精准控制 新 老pod接收的流量比例

service 是按照pod数量进行的切割

解决方案 七层负载均衡

存在的问题2

replicas=4 maxUnavailable=25% 更新过程中可能只存在3个pod可用 可能出现负载高的问题

解决方案 更新过程中 不允许减少pod maxSurge=1 maxUnavailable=0

扩容和缩容

容量管理类型

  • 横向伸缩:增加或减少Pod数量
  • 纵向(垂直)伸缩:调整Pod上的资源需求和资源限制

变动Deployment资源对象中的replicas字段的值即会触发应用规模的扩容或缩容

  • 扩容和缩容是ReplicaSet的功能,具体操作由ReplicaSet完成
  • 根据应用规模的需要进行手动配置

操作方法

  • patch命令
  • kubectl patch (-f FILENAME | TYPE NAME) [-p PATCH|--patch-file FILE] [options]
  • 例如:kubectl patch deployment deploy-example -p '{"spec":{"replicas":3}}'
  • 直接更新原配置文件,而后使用“kubectl apply”命令触发更新

扩展:自动扩容和缩容

  • HPA(Horizontal Pod Autoscaler)控制器 水平扩容
  • VPA(Vertical Pod Autoscaler)控制器 垂直扩容