热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

[K8S]Deployment滚动更新和回滚、水平伸缩

@创建Deployment首先创建一个deployment,pod副本数为3,使用镜像nginx:1.19,并创建服务test-deploy-svc.yaml的内容如下apiVer

- 创建Deployment
- 滚动更新
- ReplicaSet
- 回滚
- 水平伸缩

@创建Deployment


首先创建一个deployment,pod副本数为3,使用镜像nginx:1.19,并创建服务

test-deploy-svc.yaml 的内容如下

apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: web
name: web
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: web
strategy: {}
template:
metadata:
labels:
app: web
spec:
containers:
- image: nginx:1.19
name: nginx
---
apiVersion: v1
kind: Service
metadata:
labels:
app: web
name: web
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: web
type: NodePort

创建deployment

[[email protected] ~]# kubectl apply -f test-deploy-svc.yaml
deployment.apps/web created
service/web created
[[email protected] ~]#

查看svc的NodePort,为31147

[[email protected] ~]# kubectl get svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
kubernetes ClusterIP 10.96.0.1 443/TCP 19d
web NodePort 10.99.203.162 80:31147/TCP 49s app=web
[[email protected] ~]#

查询svc关联的pod

[[email protected] ~]# kubectl get endpoints
NAME ENDPOINTS AGE
kubernetes 192.168.231.121:6443 19d
web 10.244.169.161:80,10.244.36.84:80,10.244.36.88:80 2m28s
[[email protected] ~]#

浏览器打开主页,http://:31147

同时打开控制台,查看nginx版本,这里是1.19.10

@滚动更新

方法1: kubectl set image deployment web nginx=nginx:1.20 

[[email protected] ~]# kubectl set image deployment web nginx=nginx:1.20
deployment.apps/web image updated
[[email protected] ~]#

刷新浏览器页面浏览器 版本更新为nginx/1.20.1

pod在这个过程会滚动更新(下一个方法中详述);查看endpoints,svc关联的pod地址变了

[[email protected] ~]# kubectl get endpoints
NAME ENDPOINTS AGE
kubernetes 192.168.231.121:6443 19d
web 10.244.169.160:80,10.244.36.81:80,10.244.36.82:80 13m
[[email protected] ~]#

方法2:修改yaml文件,再次apply,将版本改为1.21

[[email protected] ~]# grep image test-deploy-svc.yaml
- image: nginx:1.19
[[email protected] ~]# vim test-deploy-svc.yaml
[[email protected] ~]# grep image test-deploy-svc.yaml
- image: nginx:1.21
[[email protected] ~]#

先记录此刻1.20版本pod的NAME和IP

[[email protected] ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
web-7f5844f89c-6sdxt 1/1 Running 0 5m28s 10.244.169.160 k8s-node2
web-7f5844f89c-cxqjf 1/1 Running 0 5m29s 10.244.36.82 k8s-node1
web-7f5844f89c-m6655 1/1 Running 0 5m26s 10.244.36.81 k8s-node1
[[email protected] ~]#

执行kubectl apply -f test-deploy-svc.yaml更新

[[email protected] ~]# kubectl apply -f test-deploy-svc.yaml
deployment.apps/web configured
service/web unchanged
[[email protected] ~]#

不断使用命令kubectl get pod -o wide查看pod创建情况

--> 正在创建一个新pod,其状态为ContainerCreating

[[email protected] ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
web-7f5844f89c-6sdxt 1/1 Running 0 6m7s 10.244.169.160 k8s-node2
web-7f5844f89c-cxqjf 1/1 Running 0 6m8s 10.244.36.82 k8s-node1
web-7f5844f89c-m6655 1/1 Running 0 6m5s 10.244.36.81 k8s-node1
web-d779974b6-j72dv 0/1 ContainerCreating 0 4s k8s-node1
[[email protected] ~]#

--> 第一个新pod状态变为Running,一个旧pod进入Terminating,同时创建第二个新pod

[[email protected] ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
web-7f5844f89c-6sdxt 1/1 Running 0 6m22s 10.244.169.160 k8s-node2
web-7f5844f89c-cxqjf 1/1 Running 0 6m23s 10.244.36.82 k8s-node1
web-7f5844f89c-m6655 1/1 Terminating 0 6m20s 10.244.36.81 k8s-node1
web-d779974b6-j72dv 1/1 Running 0 19s 10.244.36.90 k8s-node1
web-d779974b6-j9fkf 0/1 ContainerCreating 0 0s k8s-node2
[[email protected] ~]#

……

--> 创建了三个新pod,旧的三个pod处于Terminating状态

[[email protected] ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
web-7f5844f89c-6sdxt 0/1 Terminating 0 6m25s 10.244.169.160 k8s-node2
web-7f5844f89c-cxqjf 1/1 Terminating 0 6m26s 10.244.36.82 k8s-node1
web-7f5844f89c-m6655 0/1 Terminating 0 6m23s 10.244.36.81 k8s-node1
web-d779974b6-9nmb6 1/1 Running 0 2s 10.244.36.91 k8s-node1
web-d779974b6-j72dv 1/1 Running 0 22s 10.244.36.90 k8s-node1
web-d779974b6-j9fkf 1/1 Running 0 3s 10.244.169.164 k8s-node2
[[email protected] ~]#

……

--> 三个pod全部"更新"为新版本

[[email protected] ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
web-d779974b6-9nmb6 1/1 Running 0 11s 10.244.36.91 k8s-node1
web-d779974b6-j72dv 1/1 Running 0 31s 10.244.36.90 k8s-node1
web-d779974b6-j9fkf 1/1 Running 0 12s 10.244.169.164 k8s-node2
[[email protected] ~]#

以上步骤可以看到pod分配了新的IP,查看endpoints也可以观察到service绑定的pod地址更新了

[[email protected] ~]# kubectl get ep
NAME         ENDPOINTS                                           AGE
kubernetes   192.168.231.121:6443                                19d
web          10.244.169.164:80,10.244.36.90:80,10.244.36.91:80   30m
[[email protected] ~]#

刷新浏览器页面,查看nginx版本更新为 nginx/1.21.1

@ReplicaSet

常用命令:

kubectl get replicaset
kubectl describe deployment
kubectl describe

滚动升级的执行者是 控制器 replicaset(rs) ,管理pod的副本数量,也会记录发布的版本

用命令kubectl get replicaset查看rs,最后一行期望副本数为3的web-d779974b6是最近一次的部署,对应上述最新的pod,可以发现 pod NAME = deployment NAME + rs NAME + 随机字符串

[[email protected] ~]# kubectl get replicaset
NAME DESIRED CURRENT READY AGE
web-7f5844f89c 0 0 0 30m
web-bc7cc9f65 0 0 0 40m
web-d779974b6 3 3 3 24m
[[email protected] ~]#

查看deployment详细信息可以看到滚动升级的过程,关注下述最后的Events部分

(但是过一段时间再执行就会变成 Events:  )

[[email protected] ~]# kubectl describe deployment web
Name: web
Namespace: default
CreationTimestamp: Sat, 14 Aug 2021 14:32:35 +0800
Labels: app=web
Annotations: deployment.kubernetes.io/revision: 3
Selector: app=web
Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=web
Containers:
nginx:
Image: nginx:1.21
Port:
Host Port:
Environment:
Mounts:
Volumes:
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets:
NewReplicaSet: web-d779974b6 (3/3 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 59m deployment-controller Scaled up replica set web-d779974b6 to 1
Normal ScalingReplicaSet 58m deployment-controller Scaled down replica set web-7f5844f89c to 2
Normal ScalingReplicaSet 58m deployment-controller Scaled up replica set web-d779974b6 to 2
Normal ScalingReplicaSet 58m (x3 over 58m) deployment-controller (combined from similar events): Scaled down replica set web-7f5844f89c to 0
[[email protected] ~]#

查看rs信息也可以看到标记的版本

[[email protected] ~]# kubectl describe rs web-d779974b6
Name: web-d779974b6
Namespace: default
Selector: app=web,pod-template-hash=d779974b6
Labels: app=web
pod-template-hash=d779974b6
Annotations: deployment.kubernetes.io/desired-replicas: 3
deployment.kubernetes.io/max-replicas: 4
deployment.kubernetes.io/revision: 3
Controlled By: Deployment/web
Replicas: 3 current / 3 desired
Pods Status: 3 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
Labels: app=web
pod-template-hash=d779974b6
Containers:
nginx:
Image: nginx:1.21
Port:
Host Port:
Environment:
Mounts:
Volumes:
Events:
[[email protected] ~]#

@回滚

常用命令:
kubectl rollout history deployment web
kubectl rollout undo deployment web
kubectl rollout undo deployment web --to-revision=

查看历史发布版本

[[email protected] ~]# kubectl rollout history deployment web
deployment.apps/web
REVISION CHANGE-CAUSE
1
2
3
[[email protected] ~]#

说明:部署的时候加上--record CHANGE-CAUSE会有记录

[[email protected] ~]# kubectl set image deployment web nginx=nginx:1.21 --record
deployment.apps/web image updated
[[email protected] ~]# kubectl rollout history deployment web
deployment.apps/web
REVISION CHANGE-CAUSE
1
4
5 kubectl set image deployment web nginx=nginx:1.21 --record=true
[[email protected] ~]#

回滚到上一个版本(常用)

[[email protected] ~]# kubectl rollout undo deployment web
deployment.apps/web rolled back
[[email protected] ~]#

可以查看到rs的变化

[[email protected] ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
web-7f5844f89c 3 3 3 88m
web-bc7cc9f65 0 0 0 98m
web-d779974b6 0 0 0 82m
[[email protected] ~]#

@水平伸缩

方法1:修改yaml文件中replicas的值

方法2:使用命令 kubectl scale deployment web --replicas=

例如,使用方法2缩容到2个pod

[[email protected] ~]# kubectl scale deployment web --replicas=2
deployment.apps/web scaled
[[email protected] ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
web-d779974b6-6rctw 1/1 Running 0 5m41s
web-d779974b6-dv7fh 1/1 Running 0 5m40s
web-d779974b6-j6n9r 0/1 Terminating 0 5m38s
[[email protected] ~]#
[[email protected] ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
web-d779974b6-6rctw 1/1 Running 0 5m50s
web-d779974b6-dv7fh 1/1 Running 0 5m49s
[[email protected] ~]#
[[email protected] ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
web-7f5844f89c 0 0 0 128m
web-bc7cc9f65 0 0 0 138m
web-d779974b6 2 2 2 122m
[[email protected] ~]#

再使用方法1扩容到3个pod

[[email protected] ~]# kubectl apply -f test-deploy-svc.yaml
deployment.apps/web configured
service/web unchanged
[[email protected] ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
web-d779974b6-6rctw 1/1 Running 0 7m34s
web-d779974b6-dv7fh 1/1 Running 0 7m33s
web-d779974b6-n8p6d 1/1 Running 0 5s
[[email protected] ~]#
[[email protected] ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
web-7f5844f89c 0 0 0 131m
web-bc7cc9f65 0 0 0 141m
web-d779974b6 3 3 3 125m
[[email protected] ~]#


推荐阅读
  • k8snamespace配置cpu最大和最小限额
    世界上并没有完美的程序,但是我们并不因此而沮丧,因为写程序就是一个不断追求完美的过程。问:如何为namespace配置最大和最小限额&#x ... [详细]
  • 本文介绍了利用ARMA模型对平稳非白噪声序列进行建模的步骤及代码实现。首先对观察值序列进行样本自相关系数和样本偏自相关系数的计算,然后根据这些系数的性质选择适当的ARMA模型进行拟合,并估计模型中的位置参数。接着进行模型的有效性检验,如果不通过则重新选择模型再拟合,如果通过则进行模型优化。最后利用拟合模型预测序列的未来走势。文章还介绍了绘制时序图、平稳性检验、白噪声检验、确定ARMA阶数和预测未来走势的代码实现。 ... [详细]
  • 感谢大家对IT十八掌大数据的支持,今天的作业如下:1.实践PreparedStament的CRUD操作。2.对比Statement和PreparedStatement的大批量操作耗时?(1 ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
  • 本文介绍了在序列化时如何对SnakeYaml应用格式化,包括通过设置类和DumpSettings来实现定制输出的方法。作者提供了一个示例,展示了期望的yaml生成格式,并解释了如何使用SnakeYaml的特定设置器来实现这个目标。对于正在使用SnakeYaml进行序列化的开发者来说,本文提供了一些有用的参考和指导。摘要长度为169字。 ... [详细]
  • 网址:https:vue.docschina.orgv2guideforms.html表单input绑定基础用法可以通过使用v-model指令,在 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • 本文主要介绍了gym102222KVertex Covers(高维前缀和,meet in the middle)相关的知识,包括题意、思路和解题代码。题目给定一张n点m边的图,点带点权,定义点覆盖的权值为点权之积,要求所有点覆盖的权值之和膜qn小于等于36。文章详细介绍了解题思路,通过将图分成两个点数接近的点集L和R,并分别枚举子集S和T,判断S和T能否覆盖所有内部的边。文章还提到了使用位运算加速判断覆盖和推导T'的方法。最后给出了解题的代码。 ... [详细]
  • ZABBIX 3.0 配置监控NGINX性能【OK】
    1.在agent端查看配置:nginx-V查看编辑时是否加入状态监控模块:--with-http_stub_status_module--with-http_gzip_stat ... [详细]
  • oracle avg row len,Oracle 估算数据库大小的方法
    一.说明一网友问我将一个查询的结果集存放到临时表里,如果估算临时表的大小,当时想的方法是通过统计block来计算。后来想,此方法的操作性也 ... [详细]
  • 有意向可以发简历到邮箱内推.简历直达组内Leader.能做同事的话,内推奖励全给你. ... [详细]
author-avatar
蒋雨儿_824
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有