kubernetes之deployment滚动升级
参考:https://blog.51cto.com/wutengfei/2116663
创建和管理多个Pod--Deployment
Deployment 为 Pod 和 ReplicaSet 提供了一个声明式定义(declarative)方法,用来替代以前的ReplicationController 来方便的管理应用。
你只需要在 Deployment 中描述想要的目标状态是什么,Deployment controller 就会帮你将 Pod 和ReplicaSet 的实际状态改变到你的目标状态。你可以定义一个全新的 Deployment 来创建 ReplicaSet 或者删除已有的 Deployment 并创建一个新的来替换。
复制控制器(Replication Controller,RC)
RC是K8s集群中最早的保证Pod高可用的API对象。通过监控运行中的Pod来保证集群中运行指定数目的Pod副本。指定的数目可以是多个也可以是1个;少于指定数目,RC就会启动运行新的Pod副本;多于指定数目,RC就会杀死多余的Pod副本。即使在指定数目为1的情况下,通过RC运行Pod也比直接运行Pod更明智,因为RC也可以发挥它高可用的能力,保证永远有1个Pod在运行。RC是K8s较早期的技术概念,只适用于长期伺服型的业务类型,比如控制小机器人提供高可用的Web服务。
副本集(Replica Set,RS)
RS是新一代RC,提供同样的高可用能力,区别主要在于RS后来居上,能支持更多种类的匹配模式。副本集对象一般不单独使用,而是作为Deployment的理想状态参数使用。
Deployment典型的应用场景包括
(1)定义Deployment来创建Pod和ReplicaSet
(2)滚动升级和回滚应用;如果当前状态不稳定,回滚到之前的Deployment revision。每次回滚都会更新Deployment的revision。
(3)扩容和缩容,扩容Deployment以满足更高的负载。
(4)暂停和继续Deployment,暂停Deployment来应用PodTemplateSpec的多个修复,然后恢复上线。
实战Deployment
1.创建
定义deployment yaml,用于发布应用服务
[root@k8s-master ~]# pwd
/root
[root@k8s-master ~]# cat deployment-hello.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: hello
spec:
replicas:
template:
metadata:
labels:
run: hello
spec:
containers:
- name: hello
image: tomcat: #确保node节点上有该镜像且可正常运行,注意是node节点机器上,不是master机器
imagePullPolicy: IfNotPresent ##Always,IfNotPresent,Never
ports:
- name: http
containerPort:
布署
[root@k8s-master ~]# kubectl create -f deployment-hello.yaml
deployment.extensions/hello created
查看部署
root@k8s-master ~]# kubectl get deployments #查看deploy是否成功
NAME READY UP-TO-DATE AVAILABLE AGE
hello / 55s
查看rs(副本集)
[root@k8s-master ~]# kubectl get rs ##因为deployment是三层架构,看rs是否成功,我们看自动创建4个rs.名称后面的字符串是 模板的哈希值。是不会发生变化的,最后pod的是随机值
NAME DESIRED CURRENT READY AGE
hello-68df45bc79 8m29s
查看容器组
[root@k8s-master ~]# kubectl get pods #查看最后一层pod
NAME READY STATUS RESTARTS AGE
hello-7d46c7db4c-42bwl / ContainerCreating 67s
hello-7d46c7db4c-rg9fq / ContainerCreating 67s
hello-7d46c7db4c-tclps / ContainerCreating 67s
hello-7d46c7db4c-whvsw / ContainerCreating
2.扩容
将容器组个数扩充至8个
#语法格式 kubectl scale deployment + [deploy的name] + --replicas [count] + --namespace=命名空间
##说明
如果集群支持 horizontal pod autoscaling 的话,还可以为Deployment设置自动扩展:
kubectl autoscale deployment nginx-test --min=10 --max=15 --cpu-percent=80 --namespace=test
[root@k8s-master ~]# kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
hello / 7h1m
[root@k8s-master ~]# kubectl scale deployment hello --replicas 8 --namespace=default
deployment.extensions/hello scaled
[root@k8s-master ~]# kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
hello / 7h1m
[root@k8s-master ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
hello-57b49c67cf 7h2m
[root@k8s-master ~]# kubectl get pods ##正在扩容
NAME READY STATUS RESTARTS AGE
hello-57b49c67cf-4r5wf / ContainerCreating 64s
hello-57b49c67cf-6hh59 / Running 7h2m
hello-57b49c67cf-6ml78 / Running 7h2m
hello-57b49c67cf-8lgcl / ContainerCreating 64s
hello-57b49c67cf-8xqgw / Running 7h2m
hello-57b49c67cf-dg5lr / ContainerCreating 64s
hello-57b49c67cf-pd826 / Running 7h2m
hello-57b49c67cf-rj28m / ContainerCreating 64s
[root@k8s-master ~]#
3.缩容
将容器组缩减至2个
[root@k8s-master ~]# kubectl scale deployment hello --replicas --namespace=default
deployment.extensions/hello scaled
[root@k8s-master ~]# kubectl get deployment --namespace=default
NAME READY UP-TO-DATE AVAILABLE AGE
hello / 7h5m
[root@k8s-master ~]# kubectl get rs --namespace=default
NAME DESIRED CURRENT READY AGE
hello-57b49c67cf 7h5m
[root@k8s-master ~]# kubectl get pods --namespace=default ##正在缩容
NAME READY STATUS RESTARTS AGE
hello-57b49c67cf-4r5wf / Running 5m29s
hello-57b49c67cf-6hh59 / Terminating 7h6m
hello-57b49c67cf-6ml78 / Terminating 7h6m
hello-57b49c67cf-8lgcl / Terminating 5m29s
hello-57b49c67cf-8xqgw / Terminating 7h6m
hello-57b49c67cf-dg5lr / Running 5m29s
hello-57b49c67cf-pd826 / Terminating 7h6m
hello-57b49c67cf-rj28m / Terminating 5m29s
[root@k8s-master ~]# kubectl get pods --namespace=default ##缩容完成
NAME READY STATUS RESTARTS AGE
hello-57b49c67cf-4r5wf 1/1 Running 0 7m7s
hello-57b49c67cf-dg5lr 1/1 Running 0 7m7s
4.滚动升级
将image: mytomcat:v8 升级为mytomcat:v9kubectl edit deployment/hello修改
#语法格式
kubectl set image deployment/deployment-name container-name=newimage:version --namespace=命名空间
也可以直接.spec.template.spec.containers[0].image
[root@k8s-master ~]# kubectl get deployment -o wide ##触发rollout
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
hello / 7h14m hello mytomcat:v8 run=hello
[root@k8s-master ~]# docker tag mytomcat:v8 mytomcat:v9
[root@k8s-master ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mytomcat v8 f1332ae3f570 days ago 463MB
mytomcat v9 f1332ae3f570 days ago 463MB
[root@k8s-master ~]# kubectl set image deployment/hello hello=mytomcat:v9
deployment.extensions/hello image updated
[root@k8s-master ~]# kubectl rollout status deployment/hello ##查看升级进度
Waiting for deployment "hello" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "hello" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "hello" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "hello" rollout to finish: 1 of 2 updated replicas are available...
deployment "hello" successfully rolled out
[root@k8s-master ~]# kubectl rollout status deployment/hello
deployment "hello" successfully rolled out
[root@k8s-master ~]# kubectl get deployments -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
hello / 7h46m hello mytomcat:v9 run=hello
查看历史版本
[root@k8s-master ~]# kubectl rollout history deployment/hello
deployment.extensions/hello
REVISION CHANGE-CAUSE
<none>
<none>
查看pod
[root@k8s-master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
hello-57b49c67cf-4r5wf / Running 52m
hello-5cd4456b66-2wc9q / ImagePullBackOff 8m10s
hello-5cd4456b66-hzdns / ImagePullBackOff 8m9s
[root@k8s-master ~]# kubectl describe pod hello-5cd4456b66-2wc9q
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 10m default-scheduler Successfully assigned default/hello-5cd4456b66-2wc9q to k8s-node1
Normal Pulling 8m54s (x4 over 10m) kubelet, k8s-node1 Pulling image "mytomcat:v9"
Warning Failed 8m35s (x4 over 10m) kubelet, k8s-node1 Failed to pull image "mytomcat:v9": rpc error: code = Unknown desc = Error response from daemon: pull access denied for mytomcat, repository does not exist or may require 'docker login'
Warning Failed 8m35s (x4 over 10m) kubelet, k8s-node1 Error: ErrImagePull
Normal BackOff 8m8s (x7 over 10m) kubelet, k8s-node1 Back-off pulling image "mytomcat:v9"
Warning Failed 5m53s (x16 over 10m) kubelet, k8s-node1 Error: ImagePullBackOff
报ImagePullBackOff错,到节点k8s-node1主机上执行docker tag mytomcat:v8 mytomcat:v9
[root@k8s-master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
hello-5cd4456b66-2wc9q / Running 10m 10.244.1.30 k8s-node1 <none> <none>
hello-5cd4456b66-hzdns / Running 10m 10.244.1.31 k8s-node1 <none> <none>
[root@k8s-master ~]# kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
hello / 8h
[root@k8s-master ~]# kubectl rollout status deployment/hello
deployment "hello" successfully rolled out
5.回滚应用
5.回滚应用
[root@k8s-master ~]# kubectl get deployments -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
hello / 8h hello mytomcat:v9 run=hello
[root@k8s-master ~]# kubectl rollout undo deployment/hello --namespace=default
deployment.extensions/hello rolled back
[root@k8s-master ~]# kubectl rollout status deployment/hello
deployment "hello" successfully rolled out
[root@k8s-master ~]# kubectl rollout history deployment/hello
deployment.extensions/hello
REVISION CHANGE-CAUSE
<none>
<none> [root@k8s-master ~]# kubectl get deployments -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
hello / 8h hello mytomcat:v8 run=hello
[root@k8s-master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
hello-57b49c67cf-gghms / Running 93s
hello-57b49c67cf-l6fk2 / Running 94s
[root@k8s-master ~]# kubectl describe pod hello-57b49c67cf-gghms
Image: mytomcat:v8
6.暂停或恢复
你可以在触发一次或多次更新前暂停一个Deployment,然后再恢复它。这样你就能多次暂停和恢复Deployment,在此期间进行一些修复工作,而不会出发不必要的rollout。
kubectl rollout pause deployment/nginx-deployment
kubectl set image deploy/hello hello=mytomcat:v9
##kubectl edit deployment/hello
kubectl set resources deployment hello -c=hello --limits=cpu=200m,memory=512Mi ##命令详解 -c为容器名限定kubectl get deployments -o wide中的containers
kubectl rollout resume deploy hello
kubernetes之deployment滚动升级的更多相关文章
- Kubernetes Deployment滚动升级
我们k8s集群使用的是1.7.7版本的,该版本中官方已经推荐使用Deployment代替Replication Controller(rc)了,Deployment继承了rc的全部功能外,还可以查看升 ...
- k8s的Deployment 滚动升级
首先定义一个Deployment,并创建它 apiVersion: apps/v1beta1 kind: Deployment metadata: name: house-live spec: rep ...
- Kubernetes之deployment
Kubernetes实现了零停机的升级过程.升级操作可以通过使用ReplicationController或者ReplicaSet实现,但是Kubernetes提供了另一种基于ReplicaSet的资 ...
- 入门Kubernetes - 滚动升级/回滚
一.前言 上一篇文章中对yaml文件格式进行了解,并对k8s中各种主要资源通过yaml创建时的定义模板.接来下就进一步学习k8s的各种特点.并应用在示例中. 接下来先实现.Net Core Api程序 ...
- kubernetes云平台管理实战: 滚动升级秒级回滚(六)
一.nginx保证有两个版本 1.查看当前容器运行nginx版本 [root@k8s-master ~]# kubectl get pod -o wide NAME READY STATUS REST ...
- Kubernetes之Deployment控制器
Deployment 简介 deployment 是用来管理无状态应用的,面向的集群的管理,而不是面向的是一个不可变的个体,举例:有一群鸭子,要吃掉一个,只需要再放一个新的鸭仔就好了,不会影响什么,而 ...
- 使用kubernetes的deployment进行RollingUpdate
rolling update,可以使得服务近乎无缝地平滑升级,即在不停止对外服务的前提下完成应用的更新. replication controller与deployment的区别 replicatio ...
- Kubernetes Deloyment实现滚动更新
目录 滚动更新简介 使用kubectl rolling-update更新RC Deployment的rolling-update 滚动更新简介 当kubernetes集群中的某个服务需要升级时,传统的 ...
- (部署)使用kubernetes的deployment进行RollingUpdate
rolling update,可以使得服务近乎无缝地平滑升级,即在不停止对外服务的前提下完成应用的更新. replication controller与deployment的区别 replicatio ...
随机推荐
- LeetCode——150. Evaluate Reverse Polish Notation
一.题目链接:https://leetcode.com/problems/evaluate-reverse-polish-notation/ 二.题目大意: 给定后缀表达式,求出该表达式的计算结果. ...
- 峰Redis学习(9)Redis 集群(概述)
第一节:Redis 集群概述 redis cluster是去中心化,去中间件的,也就是说,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集群的状态.每个节点都和其他所有节点 ...
- JavaScript之图片操作7
前面总结了很多了有关于图片操作的案例,本次是基于前面的基础,做一个综合的图片轮播效果,需要实现以下功能: 没有任何操作时,图片自动轮播 鼠标悬浮时,图片停止轮播:当鼠标移开,轮播继续 鼠标悬浮时,出现 ...
- MySQL面试题和答案
Mysql 的存储引擎,myisam和innodb的区别. 答: 1.MyISAM 是非事务的存储引擎,适合用于频繁查询的应用.表锁,不会出现死锁,适合小数据,小并发. 2.innodb是支持事务的存 ...
- MySQL事务提交过程(转载)
http://blog.csdn.net/sofia1217/article/details/53968214 上一篇文章我们介绍了在关闭binlog的情况下,事务提交的大概流程.之所以关闭binlo ...
- 数据仓库与ODS
1. 引言 本篇主要讲述操作数据存储(ODS)系统产生的背景.定义.特点,以及它与数据仓库的区别.在前两篇,笔者介绍了什么是数据仓库?为什么需要数据仓库?数据仓库系统的体系结构是什么?因此可能在读者心 ...
- [UE4]使用UnrealVS扩展快速编译C++代码
一.如果UE4 编辑器已经打开,则VS中的重新生成项目将不能使用,一定要关了UE4 编辑器才可以.一般不是有VS自身的编译UE4的C++代码 二.epic提供了UnrealVS扩展,可以快速编译C++ ...
- 浏览器兼容java小程序配置说明
最近在使用的一个web应用系统是内嵌了java小程序,遇到了各种浏览器兼容性问题,现梳理如下: 1.通过以下链接检测当前电脑是否已经安装有java https://java.com/zh_CN/dow ...
- 基于HAProxy+Keepalived高可用负载均衡web服务的搭建
一 原理简介 1.HAProxyHAProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费.快速并且可靠的一种解决方案.HAProxy特别适用于那些负载特大的web ...
- kafka的API操作
在集群的接收端 启动producer 在consumer这边能接收到producer发来的数据