一、更新运行在 Pod 内的应用程序

1. 修改 Pod 模板

将导致应用程序在一定时间内不可用

2. 修改 Service 的 Pod 选择器

需要同时运行两倍的 Pod

3. 滚动升级

应用程序需支持两个版本同时对外提供服务

旧版本 ReplicationController 缩容,同时新版本扩容

通过新旧 ReplicationController 副本数的改变,逐渐将所有 Pod 替换成新版本,结束后删除原有的 ReplicationController

二、使用 Deployment

用于部署应用程序,并以声明的方式升级应用

创建 Deployment 时自动创建 ReplicaSet,Pod 由 ReplicaSet 创建和管理

1. 创建 Deployment

定义类似于 ReplicationController。但能指定部署策略:在修改 Deployment 资源时如何执行更新

apiVersion: apps/v1
kind: Deployment
metadata:
name: kubia
spec:
replicas: 3
selector:
matchLabels:
app: kubia
template:
metadata:
name: kubia
labels:
app: kubia
spec:
containers:
- image: luksa/kubia:v1
name: nodejs
# --record:记录历史版本号
$ kubectl create -f kubia-deployment-v1.yaml --record
# 查看部署状态
$ kubectl rollout status deployment kubia
deployment "kubia" successfully rolled out
# 查看部署的资源
$ kubectl get all
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/kubia 3/3 3 3 3m34s NAME DESIRED CURRENT READY AGE
replicaset.apps/kubia-59d857b444 3 3 3 3m34s NAME READY STATUS RESTARTS AGE
pod/kubia-59d857b444-4c7v8 1/1 Running 0 3m34s
pod/kubia-59d857b444-7r76k 1/1 Running 0 3m34s
pod/kubia-59d857b444-lrjtp 1/1 Running 0 3m34s
  • ReplicaSet 创建的 Pod 名称是由 ReplicaSet 名称加上运行时生成的随机字符串组成的
  • Deployment 创建的 ReplicaSet 包含 Pod 模板的哈希值

2. 升级 Deployment

只需修改 Deployment 资源中定义的 Pod 模板,K8s 会自动将系统状态收敛到定义的状态

升级策略:

  • RollingUpdate:滚动更新。默认策略

    • 渐进删除旧 Pod,同时创建新 Pod
    • Pod 数量会浮动,其上下限可配置
  • Recreate:一次性删除所有旧 Pod,之后创建新 Pod
    • 适用:系统不支持多个版本同时对外提供服务。但会出现短暂不可用

演示 RollingUpdate

# 1. 减慢滚动升级速度
# kubectl patch 常用于修改单个或少量资源属性,无需编辑器编辑
$ kubectl patch deployment kubia -p '{"spec": {"minReadySeconds": 10}}'
# 因为 Pod 模板没变,故不会触发滚动升级 # 2. 触发滚动升级
# 指定新的镜像(可设置任何包含容器的资源)
$ kubectl set image deployment kubia nodejs=luksa/kubia:v2 # 3. 查看滚动升级
$ while true; do curl 10.109.157.15; done
# 可以看到刚开始请求 v1,后来慢慢全部切换到 v2

升级过程由 Deployment 控制器完成。流程为:创建新的 ReplicaSet 然后扩容,同时之前的 ReplicaSet 会缩容至 0。旧的 ReplicaSet 仍被保留

若 Deployment 的 Pod 模板引用了 ConfigMap/Secret,更改 ConfigMap/Secret 资源本身不会触发升级操作

若想触发更新可创建新的 ConfigMap/Secret 并修改模板引用

3. 回滚 Deployment

使用新镜像

# v3 版本请求 5 次后会出错
$ kubectl set image deployment kubia nodejs=luksa/kubia:v3
# 查看整个升级过程
$ kubectl rollout status deployment kubia
# 模拟应用出错
$ while true; do curl 10.109.157.15; done

回滚

# 回滚到先前版本
$ kubectl rollout undo deployment kubia
# 显示升级的版本(历史版本号会被保存到 ReplicaSet 中)
$ kubectl rollout history deployment kubia
deployment.apps/kubia
REVISION CHANGE-CAUSE # 若不指定 --record,CHANGE-CAUSE 会为空
1 kubectl create --filename=kubia-deployment-v1.yaml --record=true
3 kubectl create --filename=kubia-deployment-v1.yaml --record=true
4 kubectl create --filename=kubia-deployment-v1.yaml --record=true
# 回滚到指定版本
$ kubectl rollout undo deployment kubia --to-revision=1

undo 也可以在滚动升级过程中运行:停止升级并删除已创建 pod

可通过指定 Deployment 的 revisionHistoryLimit 来限制历史版本数量,默认 10

4. 控制滚动升级速率

spec:
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
type: RollingUpdate
  • maxSurge:决定 Deployment 配置中期望的副本数之外,最多允许超出的 Pod 实例数量。默认值为 25%(四舍五入)
  • maxUnavailable:决定在滚动升级期间,相对于期望副本数能够允许多少 Pod 实例处于不可用状态。默认值为 25%(四舍五入)

本例中,replicas=3,因此 Pod 数最多可达到 4 且必须有 2 个 Pod 可用

5. 暂停滚动升级

只升级部分,方便用户验证新版本 Pod

kubectl set image deployment kubia nodejs=luksa/kubia:v4
kubectl rollout pause deployment kubia
# 这样会创建一个(数量不可控)新的 Pod
# 若部署被暂停,在恢复部署之前,撤销命令不会撤销它

恢复滚动升级

kubectl rollout resume deployment kubia

暂停功能还可用于阻止更新 Deployment 后的自动升级行为。可更改多次,完成更改后再升级

6. 滚动升级前检查

minReadySeconds 属性主要是避免部署出错版本的应用,而不是单单减缓部署的速度。它指定新创建的 Pod 至少要成功运行多久之后,才能将其视为可用。在 Pod 可用前,滚动升级的过程不会继续

当容器的所有就绪探针都返回成功时,Pod 被标记为就绪状态。Pod 就绪后等待 minReadySeconds 后才可用,才继续滚动升级

apiVersion: apps/v1
kind: Deployment
metadata:
name: kubia
spec:
# 更新可以不用加 replicas
selector:
matchLabels:
app: kubia
minReadySeconds: 10
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 0 # 挨个替换
type: RollingUpdate
template:
metadata:
name: kubia
labels:
app: kubia
spec:
containers:
- image: luksa/kubia:v3
name: nodejs
readinessProbe:
periodSeconds: 1 # 1s 执行一次就绪探针
httpGet: # 探针发送的请求
path: /
port: 8080
kubectl apply -f kubia-deployment-v3.yaml

默认 10min(spec.progressDeadlineSeconds)内不能完成滚动升级就视为失败,滚动升级会自动取消

可通过 rollout undo 取消滚动升级



修改资源的不同方式

方法 作用 例子
kubectl edit 使用默认编辑器打开资源配置 kubectl edit pod test
kubectl patch 修改单个资源属性 kubectl patch pod test -p '{"spec": {"replicas": 4}}'
kubectl apply 通过 YAML/JSON 文件修改或创建资源 kubectl apply -f test.yaml
kubectl replace 通过 YAML/JSON 文件修改资源(资源需存在) kubectl replace -f test.yaml
kubectl set image 修改包含容器资源的镜像 kubectl set image pod test nodejs=kubia:v2

镜像拉取策略

  • 若更改后的镜像推到相同的 tag,会导致镜像不被重新拉取。可设置容器的 imagePullPolicy 为 Always
  • 若容器使用 latest 的 tag,则 imagePullPolicy 默认为 Always,否则为 IfNotPresent

命令

kubectl delete pod --all
kubectl set selector ...
# 提高日志级别,输出所有 kubectl 发起的 API 服务器请求
kubectl ... --v 6

Kubernetes 实战——升级应用(Deployment)的更多相关文章

  1. 新书推荐《再也不踩坑的Kubernetes实战指南》

      <再也不踩坑的Kubernetes实战指南>终于出版啦.目前可以在京东.天猫购买,京东自营和当当网预计一个星期左右上架. 本书贴合生产环境经验,解决在初次使用或者是构建集群中的痛点,帮 ...

  2. kubernetes实战(二十六):kubeadm 安装 高可用 k8s v1.16.x dashboard 2.x

    1.基本配置 基本配置.内核升级.基本服务安装参考https://www.cnblogs.com/dukuan/p/10278637.html,或者参考<再也不踩坑的Kubernetes实战指南 ...

  3. kubernetes实战(二十七):CentOS 8 二进制 高可用 安装 k8s 1.16.x

    1. 基本说明 本文章将演示CentOS 8二进制方式安装高可用k8s 1.16.x,相对于其他版本,二进制安装方式并无太大区别.CentOS 8相对于CentOS 7操作更加方便,比如一些服务的关闭 ...

  4. Kubernetes实战总结 - 自定义Prometheus

    一.概述 首先Prometheus整体监控结构略微复杂,一个个部署并不简单.另外监控Kubernetes就需要访问内部数据,必定需要进行认证.鉴权.准入控制, 那么这一整套下来将变得难上加难,而且还需 ...

  5. kubernetes实战(二十八):Kubernetes一键式资源管理平台Ratel安装及使用

    1. Ratel是什么? Ratel是一个Kubernetes资源平台,基于管理Kubernetes的资源开发,可以管理Kubernetes的Deployment.DaemonSet.Stateful ...

  6. kubernetes实战(二十九):Kubernetes RBAC实现不同用户在不同Namespace的不同权限

    1.基本说明 在生产环境使用k8s以后,大部分应用都实现了高可用,不仅降低了维护成本,也简化了很多应用的部署成本,但是同时也带来了诸多问题.比如开发可能需要查看自己的应用状态.连接信息.日志.执行命令 ...

  7. kubernetes实战(三十):CentOS 8 二进制 高可用 安装 k8s 1.17.x

    1. 基本说明 本文章将演示CentOS 8二进制方式安装高可用k8s 1.17.x,相对于其他版本,二进制安装方式并无太大区别. 2. 基本环境配置 主机信息 192.168.1.19 k8s-ma ...

  8. Kubernetes实战 - 从零开始搭建微服务 - 1.5 提高可用性-发布多节点的Node/Express网络应用程序

    1.5 提高可用性-发布多节点的Node/Express网络应用程序 Kubernetes实战 - 从零开始搭建微服务 前言 在上一篇文章中,已经学习了如何简单地开发一个单层网络应用.[Kuberne ...

  9. Kubernetes实战总结 - 阿里云ECS自建K8S集群

    一.概述 详情参考阿里云说明:https://help.aliyun.com/document_detail/98886.html?spm=a2c4g.11186623.6.1078.323b1c9b ...

随机推荐

  1. Linux-鸟菜-4-关机的正确姿势

    Linux-鸟菜-4-关机的正确姿势 这章里面鸟哥介绍了基本的登录操作以及一些基本命令还有关机的正确姿势,基本的命令我都整理到常用命令3里面了,关机的这个感觉挺重要,单独整理下. 由于Linux本身是 ...

  2. PHP 调用请求外网接口

    1.类中定义静态方法 class FtpService{ /** * 请求外网 * @param $url 外网接口url * @param bool $params 参数,拼接字符串 post请求可 ...

  3. 谁动了我的 Linux?原来 history 可以这么强大!

    当我们频繁使用 Linux 命令行时,有效地使用历史记录,可以大大提高工作效率. 在平时 Linux 操作过程中,很多命令是重复的,你一定不希望大量输入重复的命令.如果你是系统管理员,你可能需要对用户 ...

  4. Django(10)ORM模型介绍

    前言 随着项目越来越大,采用写原生SQL的方式在代码中会出现大量的SQL语句,那么问题就出现了: 1.SQL语句重复利用率不高,越复杂的SQL语句条件越多,代码越长.会出现很多相近的SQL语句. 2. ...

  5. 一款好用的数据血缘关系在线工具--SQLFlow

      l  数据血缘关系(data lineage) 数据血缘属于数据治理中的一个概念,是在数据溯源的过程中找到相关数据之间的联系,它是一个逻辑概念.数据治理中经常提到血缘分析,血缘分析是保证数据融合的 ...

  6. Elasticsearch入门,看这一篇就够了

    目录 前言 可视化工具 kibana kibana 的安装 kibana 配置 kibana 的启动 Elasticsearch 入门操作 操作 index 创建 index 索引别名有什么用 删除索 ...

  7. Think on 小黄衫

    忙忙碌碌的大三下,抽空写一篇这样的感想,感觉也是蛮不错的. 首先,还是要非常感谢课程组的认可与鼓励,能够得到这样的一件"小黄衫",确实是一段非常宝贵的体验. 博客作业感想 三次博客 ...

  8. DataGear 变更部署数据库为SQL Server填坑指南(含转写后的SQL server代码及SQL server配置文件)

    1. 引言 2. 配置数据库链接 3. 引入数据库驱动 4. 手动初始化数据库 5. 改写SQL 6. 其他 7. 参考 1. 引言 DataGear默认使用Derby数据库作为系统的元数据库,至于待 ...

  9. SpringBoot整合shiro系列-SpingBoot是如何将shiroFilter注册到servlet容器中的

    一.先从配置类入手,主要是@Bean了一个ShiroFilterFactoryBean: @Data @Configuration @Slf4j @EnableConfigurationPropert ...

  10. 说明位图,矢量图,像素,分辨率,PPI,DPI?

    说明位图,矢量图,像素,分辨率,PPI,DPI? 显示全部 关注者 28 被浏览 7,031 关注问题写回答 ​邀请回答 ​添加评论 ​分享 ​     2 个回答 默认排序 刘凯   21 人赞同了 ...