滚动升级

1、错误的yml文件

[machangwei@mcwk8s-master ~]$ cat mcwHttpd.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mcw-httpd
spec:
replicas: 3
selector:
matchLabels:
run: mcw-httpd
template:
metadata:
labels:
run: mcw-httpd
spec:
containers:
- name: mcw-httpd
image: httpd
ports:
- containerPort: 80
[machangwei@mcwk8s-master ~]$ vim mcwHttpd.yml
[machangwei@mcwk8s-master ~]$ cat mcwHttpd.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mcw-httpd
spec:
replicas: 3
selector:
matchLabels:
run: mcw-httpd
template:
metadata:
labels:
run: mcw-httpd
spec:
containers:
- name: mcw-httpd
image: :httpd:2.2.31
ports:
- containerPort: 80
[machangwei@mcwk8s-master ~]$ kubectl apply -f mcwHttpd.yml
deployment.apps/mcw-httpd created
[machangwei@mcwk8s-master ~]$ kubectl get deployment httpd -o wide
Error from server (NotFound): deployments.apps "httpd" not found
[machangwei@mcwk8s-master ~]$ kubectl get deployment -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
mcw-httpd 0/3 3 0 33s mcw-httpd :httpd:2.2.31 run=mcw-httpd
[machangwei@mcwk8s-master ~]$ kubectl get pod
NAME READY STATUS RESTARTS AGE
mcw-httpd-6644b55f8c-62dvc 0/1 InvalidImageName 0 98s
mcw-httpd-6644b55f8c-h8pfn 0/1 InvalidImageName 0 98s
mcw-httpd-6644b55f8c-xn259 0/1 InvalidImageName 0 98s
[machangwei@mcwk8s-master ~]$

2、修改为正确的yml文件,部署deployment

[machangwei@mcwk8s-master ~]$ vim mcwHttpd.yml
[machangwei@mcwk8s-master ~]$ cat mcwHttpd.yml #其它跟以前的没变,只是镜像后面加了冒号和数字,也就是添加了版本
apiVersion: apps/v1
kind: Deployment
metadata:
name: mcw-httpd
spec:
replicas: 3
selector:
matchLabels:
run: mcw-httpd
template:
metadata:
labels:
run: mcw-httpd
spec:
containers:
- name: mcw-httpd
image: httpd:2.2.31
ports:
- containerPort: 80
[machangwei@mcwk8s-master ~]$ kubectl delete -f mcwHttpd.yml #把以前的删除
deployment.apps "mcw-httpd" deleted
[machangwei@mcwk8s-master ~]$
[machangwei@mcwk8s-master ~]$ kubectl apply -f mcwHttpd.yml #部署deployment
deployment.apps/mcw-httpd created
[machangwei@mcwk8s-master ~]$ kubectl get deployment mcw-httpd -o wide #查看镜像是31的镜像
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
mcw-httpd 3/3 3 3 13s mcw-httpd httpd:2.2.31 run=mcw-httpd
[machangwei@mcwk8s-master ~]$ kubectl get replicaset -o wide #查看副本集这里,也是31的镜像
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
mcw-httpd-6f64bbcfcf 3 3 3 40s mcw-httpd httpd:2.2.31 pod-template-hash=6f64bbcfcf,run=mcw-httpd
[machangwei@mcwk8s-master ~]$ kubectl get pod -o wide #查看pod部署情况
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mcw-httpd-6f64bbcfcf-5nhxc 1/1 Running 0 70s 10.244.2.9 mcwk8s-node2 <none> <none>
mcw-httpd-6f64bbcfcf-s8hng 1/1 Running 0 70s 10.244.1.7 mcwk8s-node1 <none> <none>
mcw-httpd-6f64bbcfcf-t6j2f 1/1 Running 0 70s 10.244.2.8 mcwk8s-node2 <none> <none>

3、修改镜像版本号,重新部署,滚动升级

[machangwei@mcwk8s-master ~]$ vim mcwHttpd.yml
[machangwei@mcwk8s-master ~]$ cat mcwHttpd.yml #修改版本号为:2.2.32
apiVersion: apps/v1
kind: Deployment
metadata:
name: mcw-httpd
spec:
replicas: 3
selector:
matchLabels:
run: mcw-httpd
template:
metadata:
labels:
run: mcw-httpd
spec:
containers:
- name: mcw-httpd
image: httpd:2.2.32
ports:
- containerPort: 80
[machangwei@mcwk8s-master ~]$ kubectl apply -f mcwHttpd.yml #重新部署
deployment.apps/mcw-httpd configured
[machangwei@mcwk8s-master ~]$ kubectl get deployment mcw-httpd -o wide #查看deployment镜像已经修改,更新了一个好像是
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
mcw-httpd 3/3 1 3 6m58s mcw-httpd httpd:2.2.32 run=mcw-httpd
[machangwei@mcwk8s-master ~]$ kubectl get replicaset -o wide #查看副本集,32是新建的副本集,镜像改为32了。这里还没有升级完,32镜像只有一个是ready,也就是刚刚升级完一个
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
mcw-httpd-6f64bbcfcf 2 2 2 7m5s mcw-httpd httpd:2.2.31 pod-template-hash=6f64bbcfcf,run=mcw-httpd
mcw-httpd-7c977464db 2 2 1 10s mcw-httpd httpd:2.2.32 pod-template-hash=7c977464db,run=mcw-httpd
[machangwei@mcwk8s-master ~]$
[machangwei@mcwk8s-master ~]$ kubectl get pod -o wide #查看pod。根据年龄查看,刚刚生成三个新的,旧的还有一个没有被删除
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mcw-httpd-6f64bbcfcf-s8hng 1/1 Terminating 0 7m16s 10.244.1.7 mcwk8s-node1 <none> <none>
mcw-httpd-7c977464db-5ctkr 1/1 Running 0 21s 10.244.1.8 mcwk8s-node1 <none> <none>
mcw-httpd-7c977464db-bfz6t 1/1 Running 0 10s 10.244.1.9 mcwk8s-node1 <none> <none>
mcw-httpd-7c977464db-gp94c 1/1 Running 0 12s 10.244.2.10 mcwk8s-node2 <none> <none>
[machangwei@mcwk8s-master ~]$
[machangwei@mcwk8s-master ~]$ kubectl get deployment mcw-httpd -o wide #再次查看,已经升级完三个了
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
mcw-httpd 3/3 3 3 7m36s mcw-httpd httpd:2.2.32 run=mcw-httpd
[machangwei@mcwk8s-master ~]$ kubectl get replicaset -o wide #再次查看副本集,三个副本都已经被新生成副本代替了,
#新生成的副本是 32的镜像。而且旧的副本集副本个数为0了,但是它不会删除过了九分钟都还没有删除,应该是不删的
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
mcw-httpd-6f64bbcfcf 0 0 0 7m47s mcw-httpd httpd:2.2.31 pod-template-hash=6f64bbcfcf,run=mcw-httpd
mcw-httpd-7c977464db 3 3 3 52s mcw-httpd httpd:2.2.32 pod-template-hash=7c977464db,run=mcw-httpd
[machangwei@mcwk8s-master ~]$ kubectl get pod -o wide #查看pod,已经只有最新生成的镜像是32版本的pod了
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mcw-httpd-7c977464db-5ctkr 1/1 Running 0 57s 10.244.1.8 mcwk8s-node1 <none> <none>
mcw-httpd-7c977464db-bfz6t 1/1 Running 0 46s 10.244.1.9 mcwk8s-node1 <none> <none>
mcw-httpd-7c977464db-gp94c 1/1 Running 0 48s 10.244.2.10 mcwk8s-node2 <none> <none>

4、查看滚动升级详情

[machangwei@mcwk8s-master ~]$ kubectl get replicaset  -o wide #查看副本集
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
mcw-httpd-6f64bbcfcf 0 0 0 21m mcw-httpd httpd:2.2.31 pod-template-hash=6f64bbcfcf,run=mcw-httpd
mcw-httpd-7c977464db 3 3 3 14m mcw-httpd httpd:2.2.32 pod-template-hash=7c977
[machangwei@mcwk8s-master ~]$ kubectl get deployment -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
mcw-httpd 3/3 3 3 19m mcw-httpd httpd:2.2.32 run=mcw-httpd
[machangwei@mcwk8s-master ~]$ kubectl describe deployment mcw-httpd
Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable #副本三个被更新的
Image: httpd:2.2.32 容器镜像是32 Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 19m deployment-controller Scaled up replica set mcw-httpd-6f64bbcfcf to 3
Normal ScalingReplicaSet 12m deployment-controller Scaled up replica set mcw-httpd-7c977464db to 1
Normal ScalingReplicaSet 12m deployment-controller Scaled down replica set mcw-httpd-6f64bbcfcf to 2
Normal ScalingReplicaSet 12m deployment-controller Scaled up replica set mcw-httpd-7c977464db to 2
Normal ScalingReplicaSet 12m deployment-controller Scaled down replica set mcw-httpd-6f64bbcfcf to 1
Normal ScalingReplicaSet 12m deployment-controller Scaled up replica set mcw-httpd-7c977464db to 3
Normal ScalingReplicaSet 12m deployment-controller Scaled down replica set mcw-httpd-6f64bbcfcf to 0 每只更新替换一个pod:
mcw-httpd-6f64bbcfcf to 3 旧副本集是3个pod
mcw-httpd-7c977464db to 1 新副本集增加一个pod,总数为1
mcw-httpd-6f64bbcfcf to 2 旧副本集减少一个pod,总数为2
mcw-httpd-7c977464db to 2 新副本集增加一个pod,总数为2
mcw-httpd-6f64bbcfcf to 1 旧副本集减少一个pod,总数为1
mcw-httpd-7c977464db to 3 新副本集增加一个pod,总数为3
mcw-httpd-6f64bbcfcf to 0 旧副本集减少一个pod,总数为0 每次替换的POD数量是可以定制的。默认应该是1吧。定制的参数有两个,如:maxSurge ,maxUnavailable 来精细控制POD的替换数量

回滚

1、回滚前的模拟准备环境

模拟新建三个需要的版本。
[root@mcwk8s-node2 ~]$ docker tag httpd:latest httpd:2.4.16
[root@mcwk8s-node2 ~]$ docker tag httpd:latest httpd:2.4.17
[root@mcwk8s-node2 ~]$ docker tag httpd:latest httpd:2.4.18
创文件文件,并修改版本
[machangwei@mcwk8s-master ~]$ cp mcwHttpd.yml mcw.httpd.v1.yml
[machangwei@mcwk8s-master ~]$ cp mcwHttpd.yml mcw.httpd.v2.yml
[machangwei@mcwk8s-master ~]$ cp mcwHttpd.yml mcw.httpd.v3.yml 修改一下文件,将镜像分别修改为 16,17,18
[machangwei@mcwk8s-master ~]$ ls mcw.httpd.v1
mcw.httpd.v16.yml mcw.httpd.v17.yml mcw.httpd.v18.yml
[machangwei@mcwk8s-master ~]$ cat mcw.httpd.v16.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mcw-httpd
spec:
replicas: 3
selector:
matchLabels:
run: mcw-httpd
template:
metadata:
labels:
run: mcw-httpd
spec:
containers:
- name: mcw-httpd
image: httpd:2.4.16
ports:
- containerPort: 80

2、部署并回滚

[machangwei@mcwk8s-master ~]$ ls mcw.httpd.v1 #查看所有yml配置文件
mcw.httpd.v16.yml mcw.httpd.v17.yml mcw.httpd.v18.yml
[machangwei@mcwk8s-master ~]$ kubectl apply -f mcw.httpd.v16.yml --record #--record,将当前命令记录到revision记录中
Flag --record has been deprecated, --record will be removed in the future #这样我们就能知道每个revison对应的是哪个配置文件了
deployment.apps/mcw-httpd created
[machangwei@mcwk8s-master ~]$
[machangwei@mcwk8s-master ~]$ kubectl get deployment mcw-httpd -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
mcw-httpd 3/3 3 3 2m3s mcw-httpd httpd:2.4.16 run=mcw-httpd
[machangwei@mcwk8s-master ~]$
[machangwei@mcwk8s-master ~]$ kubectl apply -f mcw.httpd.v17.yml --record
Flag --record has been deprecated, --record will be removed in the future
deployment.apps/mcw-httpd configured
[machangwei@mcwk8s-master ~]$ kubectl get deployment mcw-httpd -o wide #每次执行都被更新镜像版本了
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
mcw-httpd 3/3 3 3 2m35s mcw-httpd httpd:2.4.17 run=mcw-httpd
[machangwei@mcwk8s-master ~]$
[machangwei@mcwk8s-master ~]$ kubectl apply -f mcw.httpd.v18.yml --record
Flag --record has been deprecated, --record will be removed in the future
deployment.apps/mcw-httpd configured
[machangwei@mcwk8s-master ~]$ kubectl get deployment mcw-httpd -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
mcw-httpd 3/3 2 3 2m54s mcw-httpd httpd:2.4.18 run=mcw-httpd
[machangwei@mcwk8s-master ~]$
[machangwei@mcwk8s-master ~]$ kubectl rollout history deployment mcw-httpd #--record,将当前命令记录到revision记录中
deployment.apps/mcw-httpd
REVISION CHANGE-CAUSE #这样我们就能知道每个revison对应的是哪个配置文件了 #查看revison历史记录
1 kubectl apply --filename=mcw.httpd.v16.yml --record=true
2 kubectl apply --filename=mcw.httpd.v17.yml --record=true
3 kubectl apply --filename=mcw.httpd.v18.yml --record=true [machangwei@mcwk8s-master ~]$
[machangwei@mcwk8s-master ~]$ kubectl rollout undo deployment mcw-httpd --to-revision=1 #执行命令回滚到版本1。
deployment.apps/mcw-httpd rolled back
[machangwei@mcwk8s-master ~]$
[machangwei@mcwk8s-master ~]$ kubectl get deployment mcw-httpd -o wide #查看镜像已经改成版本1的了
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
mcw-httpd 3/3 3 3 4m39s mcw-httpd httpd:2.4.16 run=mcw-httpd
[machangwei@mcwk8s-master ~]$
[machangwei@mcwk8s-master ~]$ kubectl rollout history deployment mcw-httpd #查看revison历史记录的变化 deployment.apps/mcw-httpd
REVISION CHANGE-CAUSE
2 kubectl apply --filename=mcw.httpd.v17.yml --record=true
3 kubectl apply --filename=mcw.httpd.v18.yml --record=true
4 kubectl apply --filename=mcw.httpd.v16.yml --record=true #revison 1 变成了revison4,我们可以通过CHANG-CAUSE
#知道每个revison的具体含义,所以要在执行kubectl 加上参数 --record
[machangwei@mcwk8s-master ~]$

kubernetes 之 Rolling Update 滚动升级的更多相关文章

  1. 使用 kubectl 执行 Rolling Update(滚动更新)

    Rolling Update滚动更新 通过使用新版本的 Pod 逐步替代旧版本的 Pod 来实现 Deployment 的更新,从而实现零停机.新的 Pod 将在具有可用资源的 Node(节点)上进行 ...

  2. kubernetes云平台管理实战: 滚动升级秒级回滚(六)

    一.nginx保证有两个版本 1.查看当前容器运行nginx版本 [root@k8s-master ~]# kubectl get pod -o wide NAME READY STATUS REST ...

  3. Kubernetes Deployment滚动升级

    我们k8s集群使用的是1.7.7版本的,该版本中官方已经推荐使用Deployment代替Replication Controller(rc)了,Deployment继承了rc的全部功能外,还可以查看升 ...

  4. 入门Kubernetes - 滚动升级/回滚

    一.前言 上一篇文章中对yaml文件格式进行了解,并对k8s中各种主要资源通过yaml创建时的定义模板.接来下就进一步学习k8s的各种特点.并应用在示例中. 接下来先实现.Net Core Api程序 ...

  5. kubernetes之deployment滚动升级

    参考:https://blog.51cto.com/wutengfei/2116663 创建和管理多个Pod--Deployment Deployment 为 Pod 和 ReplicaSet 提供了 ...

  6. k8s滚动升级

    为了服务升级过程中提供可持续的不中断的服务,Kubernetes 提供了rolling update机制,具体配置需要修改对应服务的yaml文件 参数解析: minReadySeconds: 100 ...

  7. ASP.NET Core on K8S深入学习(5)Rolling Update

    本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 一.什么是Rolling Update? 为了服务升级过程中提供可持续的不中断 ...

  8. K8S服务滚动升级

    对于Kubernetes集群来说,一个service可能有多个pod,滚动升级(Rolling update)就是指每次更新部分Pod,而不是在同一时刻将该Service下面的所有Pod shutdo ...

  9. 在 Rolling Update 中使用 Health Check - 每天5分钟玩转 Docker 容器技术(146)

    上一节讨论了 Health Check 在 Scale Up 中的应用,Health Check 另一个重要的应用场景是 Rolling Update.试想一下下面的情况: 现有一个正常运行的多副本应 ...

  10. 在 Rolling Update 中使用 Health Check【转】

    上一节讨论了 Health Check 在 Scale Up 中的应用,Health Check 另一个重要的应用场景是 Rolling Update.试想一下下面的情况: 现有一个正常运行的多副本应 ...

随机推荐

  1. netty系列之:给ThreadLocal插上梦想的翅膀,详解FastThreadLocal

    目录 简介 从ThreadLocalMap中获取数据 FastThreadLocal 总结 简介 JDK中的ThreadLocal可以通过get方法来获得跟当前线程绑定的值.而这些值是存储在Threa ...

  2. 【直播回顾】OpenHarmony知识赋能六期第一课—OpenHarmony智能家居项目介绍

    6月16日晚上19点,知识赋能第六期第一节课 <OpenHarmony智能家居项目介绍> ,在OpenHarmony开发者成长计划社群内成功举行. 本次直播是"OpenHarmo ...

  3. Aspose.Cells使用总结大全

    引用:https://blog.csdn.net/u011555996/article/details/79000270 使用到 Aspose.Cells 插件,整理一下. 一:新建解决方案,目录如下 ...

  4. HDC 2022精彩继续,多重亮点进来看!

    原文:https://mp.weixin.qq.com/s/YX5vD4cxM8dA4v2ukFooyA,点击链接查看更多技术内容.  

  5. Android 开发入门(1)

    0x01 准备 (1)概述 安卓(Android)基于 Linux 内核开发的操作系统,由 Google 等领导开发. (2)版本 Android 版本号 API 发布时间 Android 14 - ...

  6. JS中通过url动态获取图片大小的方法小结(两种方法)

    很多时候再项目中,我们往往需要先获取图片的大小再加载图片,但是某些特定场景,如用过cocos2d-js的人都知道,在它那里只能按比例缩放大小,是无法设置指定大小的图片的,这就是cocos2d-js 的 ...

  7. 简述Linux磁盘IO

    1.什么是磁盘 在讲解磁盘IO前,先简单说下什么是磁盘.磁盘是可以持久化存储的设备,根据存储介质的不同,常见磁盘可以分为两类:机械磁盘和固态磁盘. 1.1 机械磁盘 第一类,机械磁盘,也称为硬盘驱动器 ...

  8. 面对DNS劫持,只能坐以待毙吗?

    ​简介: 借助 ARMS-云拨测,我们可实时对网站进行监控,实现分钟级别的监控,及时发现 DNS 劫持以及页面篡改. 作者:白玙 DNS 劫持作为最常见的网络攻击方式,是每个站长或者运维团队最为头疼的 ...

  9. 阿里云混合云Apsara Stack 2.0发布 加速政企数智创新

    ​简介: 2021年10月21日,杭州 – 今日,阿里云于云栖大会正式发布Apsara Stack 2.0,从面向单一私有云场景,升级为服务大型集团云&行业云场景.新一代Apsara Stac ...

  10. MYSQL深潜 - 剖析Performance Schema内存管理

    ​简介: 本文主要是通过对PFS引擎的内存管理的源码的阅读,解读PFS内存分配及释放原理,深入剖析其中存在的一些问题,以及一些改进思路.本文源代码分析基于Mysql-8.0.24版本. ​ 作者 | ...