一、更新运行在 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. 【hugo】- hugo 监听浏览器切换title

    hugo 博客 监听浏览器title 动态改变浏览器title标题 找到head.html themes/maupassant/layouts/partials/head.html 添加监听js 可以 ...

  2. spring泛型注入

    泛型依赖注入 Spring 4.0版本中更新了很多新功能,其中比较重要的一个就是对带泛型的Bean进行依赖注入的支持. 泛型依赖注入允许我们在使用spring进行依赖注入的同时,利用泛型的优点对代码进 ...

  3. 『政善治』Postman工具 — 7、Postman中保存请求(Collections集合)

    目录 1.创建Collection 2.保存Request请求 3.查看保存的请求 4.Collection下还可以创建文件夹 5.补充:Postman中的变量 6.总结 1.创建Collection ...

  4. Windows进程间通讯(IPC)----WM_COPYDATA

    WM_COPYDATA通讯思路 通过向其他进程的窗口过程发送WM_COPYDATA消息可以实现进程间通讯. 只能通过SendMessage发送WM_COPYDATA消息,而不能通过PostMessag ...

  5. 细数 C++ 那些比起 C语言 更爽的特性

    结构体定义 C: typedef struct Vertex { int x, y, z; } Vertex; Vertex v1 = { 0 }; // or struct Vertex { int ...

  6. 如何通过Zoho Books门户管理供应商

    作为一个企业,不管规模大小,都有自己的供应商来为业务提供相关的服务和配件.随着采购的频率和供应商数量的增加,采购的管理和付款的跟踪难度就会增加,进而影响到企业和供应商之间的关系. 为了解决这个问题,Z ...

  7. 如何通过CRM解决公司业绩下滑的问题

    大部分公司都需要新客户的支持来维持市场和实现预期的目标.尽管销售部门一直在努力,但这种努力还是无法阻止业绩下降. 想要做到销售增长,不仅要取决企业的进步,还需要改掉使业绩下降的问题.小Z将从四个方面对 ...

  8. .NET程序崩溃了怎么抓 Dump ? 我总结了三种方案

    一:背景 1. 讲故事 最近几天接到了几个crash的求助,可能这几个朋友没玩过怎么去生成dump,只能手把手教,感觉也不是一个办法,所以有必要总结一下,后续再有朋友咨询的话,我就可以把这篇文章丢过去 ...

  9. ar是System Activity Reporter(系统活动情况报告)的缩写。这

    ar是System Activity Reporter(系统活动情况报告)的缩写.这个工具所需要的负载很小,也是目前linux中最为全面的性能分析工具之一.此款工具将对系统当前的状态就行取样,然后通过 ...

  10. 第一章 DevOps概述

    什么是软件开发 软件开发是根据用户要求建造出软件系统或者系统中的软件部分的过程. 软件开发是一项包括需求捕捉,需求分析,实现和测试的系统工程 软件开发有哪些困难? 软件开发的本质困难 复杂性 不可见性 ...