前言

本篇是Kubernetes第七篇,大家一定要把环境搭建起来,看是解决不了问题的,必须实战。

Kubernetes系列文章:
  1. Kubernetes介绍
  2. Kubernetes环境搭建
  3. Kubernetes-kubectl介绍
  4. Kubernetes-Pod介绍(-)
  5. Kubernetes-Pod介绍(二)-生命周期
  6. Kubernetes-Pod介绍(三)-Pod调度

Pod升级和回滚

在生产的环境中,当我们需要给某个服务升级时候,需要停止与该服务相关的所有应用Pod,然后下载最新应用的镜像并创建新Pod,这样当我们服务的规模很大的时候,会照成长时间的服务不可用,对于这种情况Kubernetes提出了滚动升级和滚动回滚概念来帮助我们解决该问题。

Deployment升级

这里我们采用案例驱动的方式来一步一步了解Kubernetes滚动升级。

  1. 清空所有的Pod;
kubectl delete pods --all
  1. 这里我们采用最开始使用nginx-deployment.yaml文件;
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        resources:
          limits:
            memory: "128Mi"
            cpu: "128m"
        ports:
        - containerPort: 80
  1. 创建deployment资源;
kubectl apply -f nginx-deployment.yaml
  1. 查看Pod执行情况;
kubectl get pods

image.png
  1. 切换镜像版本为1.9.1,这里触发滚动更新的方式有两种:一种使用kubectl edit,另外一种使用kubectl set image;
#第一种方式
kubectl edit deployment/nginx-deployment
#第二种方式
kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1
  1. 查看deployment更新过程;
kubectl rollout status deployment/nginx-deployment

image.png
  1. 再次查看Pod状况,会发现Pod,名称已经发生改变;

image.png
  1. 查看Pod使用的镜像版本,我们会发现nginx的镜像版本已经被替换为1.9.1;
kubectl describe pod/nginx-deployment-79fbcd54b4-j9n62

image.png
  1. 查看Pod更新过程,我们会发现Deployment资源的本质就是ReplicaSet,当我们创建Deployment系统会创建3个ReplicaSet,更新Deployment资源的时候会创建一个新ReplicaSet,减少一个旧版本的ReplicaSet,后续慢慢替换为新版本ReplicaSet;
kubectl describe deployment/nginx-deployment

image.png

image.png
  1. 查看ReplicaSet版本;
kubectl get rs

总结:Deployment实际上是一个两层控制器。首先,它通过 ReplicaSet 来控制应用的版本;然后,它再通过 ReplicaSet 的属性,来保证 Pod 的副本数量。

在Deployment定义中,可以通过spec.strategy指定Pod的更新策略,目前支持两种策略:

  1. Recrate(重建): 更新Pod的时候会杀掉所有在运行的Pod,然后重新创建Pod;
  2. RollingUpdate(滚动更新): 默认选项,以滚动更新的方式来逐个更新Pod,可以通过spec.strategy.rollingUpdate下面两个参数maxUnavailable和maxSurge来控制滚动更新;

maxUnavailable: 用于指定Deployment在更新过程中不可用状态Pod的上限,可以是百分比也可以是绝对值;

maxSurge: 用于指定在Deployment更新过程中Pod总数量超过期望副本的最大值,可以是百分比也可以是绝对值;从Kubernetes1.6版本开始,以上两个值的默认为25%;

Deployment回滚

生产环境中可能由于一些原因,导致需要回滚操作,这个时候我们就可以使用Deployment回滚操作,这里我们还是以更新nginx镜像为案例:

  1. 将nginx镜像版本更新为Nginx:1.99,在镜像仓库中是不存在该镜像版本的;
kubectl set image deployment/nginx-deployment nginx=nginx:1.99
  1. 查看滚动更新的过程,我们会发现滚动更新被卡死了;
kubectl rollout status deployments nginx-deployment

image.png
  1. 查看Pod的状态,这个时候我们会发现镜像一直处于被拉取的状态;
kubectl get pods
  1. 为了解决该问题,这个时候我们需要进行回滚操作,我们可以通过kubectl rollout history查看Deployment的部署历史记录,通过kubectl rollout undo命令回滚到上一个部署版本,当然也可以指定版本回滚;
#查看Deployment的部署历史记录
kubectl rollout history deployment/nginx-deployment
#查看Deployment的指定版本部署情况
kubectl rollout history deployment/nginx-deployment --revision=3
#回滚到上一个版本
kubectl rollout undo deployment/nginx-deployment
#指定版本回滚
kubectl rollout undo deployment/nginx-deployment  --to-revision=2
  1. 查看整个回滚过程的事件信息,回滚的过程就是将新建的ReplicaSet缩容就可以了;
kubectl describe deployment/nginx-deployment

image.png
暂停和恢复Deployment

对于复杂的Deployment配置修改,为了避免频繁的触发Deployment的更新操作,可以先暂停Deployment的更新操作,然后进行配置修改,在恢复Deployment,一次性触发完整的更新操作。

  1. 通过kubectl rollout pause 命令暂停Deployment的更新操作;
kubectl rollout pause deployment/nginx-deployment
  1. 修改Deployment的镜像信息;
kubectl set image deployment/nginx-deployment nginx=nginx:1.18.0 
  1. 查看Deployment事件信息,我们会发现Deployment并没有更新操作;
kubectl describe deployment/nginx-deployment

image.png
  1. 通过kubectl rollout resume命令恢复Deployment的更新操作;
kubectl rollout resume deployment nginx-deployment
  1. 再次查看Deployment事件信息或者查看ReplicaSet信息,我们会发现Deployment开始更新操作;
#查看事件信息
kubectl describe deployment/nginx-deployment
#查看信息
kubectl get rs

image.png

结束

欢迎大家点点关注,点点赞!

Kubernetes-Pod介绍(四)-Deployment的更多相关文章

  1. 三十四、kubernetes证书介绍

    Kubernetes 证书介绍 一.证书机制说明 Kubernetes 作为一个分布式集群的管理工具,保证集群的安全性是其一个重要的任务.API Server 是集群内部各个组件通信的中介,也是外部控 ...

  2. Kubernetes组件介绍

    一.api-server   基本概念 该端口默认值为6443,可通过启动参数"--secure-port"的值来修改默认值. 默认IP地址为非本地(Non-Localhost)网 ...

  3. 从0到1使用Kubernetes系列(四):搭建第一个应用程序

    传统Kubernetes应用搭建 创建Namespace 在一个Kubernetes集群中可以创建多个Namespace进行"环境隔离",当项目和人员众多的时候,可以考虑根据项目的 ...

  4. Kubernetes Pod 镜像拉取策略

    Kubernetes Pod 镜像拉取策略 官方文档:https://kubernetes.io/docs/concepts/containers/images/ • IfNotPresent:默认值 ...

  5. Kubernetes中如何让Deployment更新镜像

    问题描述 我的deployment有单个pod,我的自定义docker镜像如下: 123 containers: - name: mycontainer image: myimage:latest 在 ...

  6. Kubernetes Pod故障归类与排查方法

    Pod概念 Pod是kubernetes集群中最小的部署和管理的基本单元,协同寻址,协同调度. Pod是一个或多个容器的集合,是一个或一组服务(进程)的抽象集合. Pod中可以共享网络和存储(可以简单 ...

  7. Kubernetes Pod 全面知识

    Pod 是在 Kubernetes 中创建和管理的.最小的可部署的计算单元,是最重要的对象之一.一个 Pod 中包含一个或多个容器,这些容器在 Pod 中能够共享网络.存储等环境. 学习 Kubern ...

  8. 三十五、kubernetes NameSpace介绍

    Kubernetes NameSpace 介绍 Kubernetes使用命名空间的概念帮助解决集群中在管理对象时的复杂性问题.命名空间允许将对象分组到一起,便于将它们作为一个单元进行筛选和控制.无论是 ...

  9. 三十一、kubernetes网络介绍

    Kubernetes 网络介绍 Service是Kubernetes的核心概念,通过创建Service,可以为一组具有相同功能的容器应用提供一个统一的入口地址,并且将请求负载分发到后端的各个容器应用上 ...

随机推荐

  1. 002 PCI Express体系结构(二)

    一.PCI总线的信号定义 PCI总线是一条共享总线,在一条PCI总线上可以挂接多个PCI设备.这些PCI设备通过一系列信号与PCI总线相连,这些信号由地址/数据信号.控制信号.仲裁信号.中断信号等多种 ...

  2. NOIP 模拟 7 寿司

    题解 题目 这道题考试的时候直接打暴力,结果暴力连样例都过不了,最后放上去一个玄学东西,骗了 \(5pts\). 正解: 此题中我们可以看到原序列是一个环,所以我们要把它拆成一条链,那么我们需要暴力枚 ...

  3. 8、二进制安装K8s之部署CIN网络

    二进制安装K8s之部署CIN网络 部署CIN网络可以使用flannel或者calico,这里介绍使用calico ecd 方式部署. 1.下载calico二进制安装包 创建所需目录 mkdir -p ...

  4. 【VLC开发】libvlc_new函数参数

    项目中有视频监控的需求,找了vlc这个开源视频工具,在获取实例参数时遇到了问题, 要得到VLC的全部参数有两种方法, 1 只要在创建时加上"--longhelp"和"-- ...

  5. ubuntu下配置JDK的一些坑点

    ubuntu下配置JDK的一些坑点 在centos下的JDK配置: 在ubuntu下的话,要修改两个地方: 在/etc/enviornment中配置! 在/etc/profile中配置! 写在最后: ...

  6. Flink的状态管理与恢复机制

    参考地址:https://www.cnblogs.com/airnew/p/9544683.html 问题一.什么是状态? 问题二.Flink状态类型有哪几种? 问题三.状态有什么作用? 问题四.如何 ...

  7. Swift- 设置 UILabel 内边距

    摘要 拿来即用短时间效率虽然挺高的,但是拿来的东西没有消化一次,就无法得心应手的使用它. 这次的探索思路就是,查询官方文档,设置不同的值测试单个方法中参数的变化,之后测试两个方法的执行顺序,处理的思路 ...

  8. Spring Boot +Vue 项目实战笔记(一):使用 CLI 搭建 Vue.js 项目

    前言 从这篇文章开始,就进入真正的实践了. 在前端项目开发中,我们可以根据实际情况不同程度地使用 Vue.利用 Vue CLI(或写成 vue-cli,即 Vue 脚手架)搭建出来的项目,是最能体现 ...

  9. Win10 pip install augimg 报 OSError: [WinError 126] 找不到指定的模块,解决办法

    第一种Win10下python成功安装augimg的方法: 下载Shapely,地址https://www.lfd.uci.edu/~gohlke/pythonlibs/#shapely,选择对应版本 ...

  10. 学习小计: Kaggle Learn Time Series Modeling

    ARIMA模型,参数含义参考:https://www.cnblogs.com/bradleon/p/6827109.html from statsmodels.tsa.arima_model impo ...