Deployment 控制器

一、概述
·Deployment是ReplicaSet的高级别抽象,ReplicaSet控制器有的功能Deployment全部具备,ReplicaSet没有的Deployment也具备比如,它提供了滚动升级和回滚的功能。Deployment是控制多个ReplicaSet,从而可以实现无缝升级和回滚。

二、特点

  • 选择器:ReplicaSet使用标签选择器来选择要管理的Pod副本。
  • 伸缩性:Deployment高级控制器可以根据负载自动伸缩容器数量,以满足应用程序的需求。
  • 自我修复:Deployment高级控制器可以监控容器的健康状况,并在容器出现故障时自动重启或替换容器。
  • 负载均衡:Deployment高级控制器可以通过负载均衡算法,将请求分发到不同的容器实例上,以提高应用程序的性能和可用性。
  • 版本控制:Deployment可以指定多个ReplicaSet,每个ReplicaSet可以控制不同版本的Pod,从而实现灰度发布和回滚。
  • 声明式:指直接修改资源清单yaml文件,然后通过 apply ,就可以更改资源。

三、工作原理
·Deployment控制器建立在ReplicaSet控制器之上,管理多个ReplicaSet,每次更新镜像版本,都会生成一个新的ReplicaSet,把旧的ReplicaSet替换掉,多个ReplicaSet同时存在,但只运行一个ReplicaSet。

如果ReplicaSet V2版本更新上去存在问题,还可以回滚,Deployment建立在ReplicaSet之上,多个ReplicaSet组成一个Deployment,但只有一个ReplicaSet处于活跃状态。

四、Deployment YAML编写及参数解释

#使用explain命令查看定义 可以查看 deployment控制器字段说明:
kubectl explain deployment
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-deployment-1
  labels:
    env: uat
spec:
  replicas: 3
  minReadySeconds: 10  # 更新场景,等待时间,如果没有设置K8S会假设该容器启动起来后就提供服务了
  paused: # 暂停,当更新Pod时,先暂停,而不是立马更新
  progressDeadlineSeconds: 60 # 更新场景,等待时间超过此值,状态标记False,并说明原因,但是它并不会阻止 Deployment 继续进行卡住后面的操作
  strategy:
    rollingUpdate:        # 滚动更新,定义滚动更新方式,也就是pod能多几个,少几个
      maxSurge: 20%       # 允许更新中,最多超过Pod数值
      maxUnavailable: 20% # 允许更新中,最多允许几个不可用
  selector:
    matchLabels:
      app: demo-nginx
  template:
    metadata:
      labels:
        app: demo-nginx
    spec:
      containers:
      - name: demo-nginx
        image: nginx
        imagePullPolicy: IfNotPresent
        startupProbe:      # 启动探测
          tcpSocket:
            port: 80
        livenessProbe:     # 存活探测
          httpGet:
            port: 80
            path: /index.html
        readinessProbe:    # 就绪探测
          httpGet:
            port: 80
            path: "/index.html"

核心参数详解
ospec.minReadySeconds:更新场景,等待时间,如果没有设置K8S会假设该容器启动起来后就提供服务了。

ospec.paused: 暂停,当更新Pod时,先暂停,而不是立马更新,后面金丝雀发布要用到

ospec.progressDeadlineSeconds:更新场景,等待时间超过此值,状态标记False,并说明原因,但是它并不会阻止 Deployment 继续进行卡住后面的操作

ospec.strategy.rollingUpdate:滚动更新,定义滚动更新方式,也就是pod能多几个,少几个

ospec.strategy.rollingUpdate.maxSurge:指定在更新期间可以创建的新Pod的最大数量。例如,如果maxSurge设置为1,而Deployment中有3个Pod,则在更新期间可以创建4个Pod,其中3个是旧的Pod,1个是新的Pod。

ospec.strategy.rollingUpdate.maxUnavailable:指定在更新期间可以同时停止的旧Pod的最大数量。例如,如果maxUnavailable设置为1,而Deployment中有3个Pod,则在更新期间可以停止2个Pod,其中1个是旧的Pod,1个是新的Pod。

五、Deployment更新策略:
·Deployment目前支持两种更新策略

  • oRecreate:重建式更新,把Pod全部删除,在重新创建,风险很大,不建议使用

  • orollingUpdate:滚动式更新,批量替换更新,平滑升级,用户无感知

六、Deployment针对WEB站点滚动更新

---
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-deployment
  labels:
    env: uat
spec:
  replicas: 5
  minReadySeconds: 10 
  progressDeadlineSeconds: 60
  strategy:
    rollingUpdate:
      maxSurge: 30%         # 5*30%=1.5(~=2), 2+5=7,更新期间最多创建7个Pod
      maxUnavailable: 20%   # 5*20%=1, 1-5=4,更新期间最多停止4个Pod
  selector:
    matchLabels:
      app: web-nginx
  template:
    metadata:
      labels:
        app: web-nginx
    spec:
      containers:
      - name: web-nginx
        image: web:v2    # 版本更新
        imagePullPolicy: IfNotPresent
        startupProbe:
          tcpSocket:
            port: 80
        livenessProbe:
          httpGet:
            port: 80
            path: /index.html
        readinessProbe:
          httpGet:
            port: 80
            path: "/index.html"
#更新命令
kubectl apply -f web-deployment.yaml
#查看历史版本
kubectl rollout history deployment web-deployment
#回滚版本
kubectl rollout undo deployment web-deployment --to-revision=1

你可能感兴趣的:(kubernetes,容器)