系列目录

这个系列分为两个小节,第一个小节介绍deployment滚动更新时,deployment、replicaset、pod的细节以及创建过程以及deployment版本管理的方式

第二个小节将介绍滚动更新过程中最大可用、liveness以及readiness等

我们在阿里云上有两个不同版本的镜像用于测试,使用docker pull把它拉取到本地

docker pull registry.cn-beijing.aliyuncs.com/mrvolleyball/nginx:v1
docker pull registry.cn-beijing.aliyuncs.com/mrvolleyball/nginx:v2

截至目前,我们并没有详细介绍过docker的操作,但是目前市面上已经有很多书籍和博客介绍docker的基本操作,没有docker操作经验的可以关注一些入门教程.

root@k8s-master:~# docker run -d  -p 10080:80 nginx:v1
e88097841c5feef92e4285a2448b943934ade5d86412946bc8d86e262f80a050
root@k8s-master:~# curl http://127.0.0.1:10080
----------
version: v1
hostname: f5189a5d3ad3

注在linux里如果是以root用户登陆,则命令行前一个#标识,这里并不是注释的意思,还请注意

deployment、replicaset、pod之间的关系

                           +------------+
| deployment |
+-----+------+
|
|
|
|
+--------------------------------------------------+
| | |
| | |
| | |
| | |
| | |
| | |
+------v------+ +------v------+ +------v------+
|replicaset:v1| |replicaset:v2| |replicaset:v3|
+-------------+ +------+------+ +-------------+
|
|
+--------+---------+
| |
| |
+---v---+ +---v---+
|pod:v2 | |pod:v2 |
+-------+ +-------+
  • deployment调度replicaset,pod由replicaset调度
  • deployment管理多个replicaset版本,可用于回滚
  • replicaset控制pod的行为,包括新增pod、删除pod

我们首先准备一个yaml文件用于测试:

root@k8s-master:~# more roll_update.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: image-deployment
spec:
replicas: 1
template:
metadata:
labels:
app: image-update
spec:
containers:
- name: nginx
image: registry.cn-beijing.aliyuncs.com/mrvolleyball/nginx:v1
imagePullPolicy: Always

简单验证一下:

root@k8s-master:~# kubectl apply -f roll_update.yaml
deployment.extensions "update-deployment" created
root@k8s-master:~# kubectl get deploy
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
update-deployment 3 3 3 3 54s
root@k8s-master:~# kubectl get rs
NAME DESIRED CURRENT READY AGE
update-deployment-7db77f7cc6 3 3 3 56s
root@k8s-master:~# kubectl get pod
NAME READY STATUS RESTARTS AGE
update-deployment-7db77f7cc6-7j49g 1/1 Running 0 1m
update-deployment-7db77f7cc6-b75wn 1/1 Running 0 1m
update-deployment-7db77f7cc6-cfnt5 1/1 Running 0 1m

deployment、replicaset、pod都已经正常启动,下面分析一下他们的行为:

deployment

root@k8s-master:~# kubectl describe deploy update-deployment
Name: update-deployment
Namespace: default
...
Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 1 max unavailable, 1 max surge
...
NewReplicaSet: update-deployment-7db77f7cc6 (3/3 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 1m deployment-controller Scaled up replica set update-deployment-7db77f7cc6 to 3
  • deployment创建了一个replicaset,叫做update-deployment-7db77f7cc6(7db77f7cc6是replicaset的template hash值)
  • 根据配置文件的要求,replicaset的副本数为3

replicaset

root@k8s-master:~# kubectl describe rs update-deployment-7db77f7cc6
Name: update-deployment-7db77f7cc6
Namespace: default
...
Controlled By: Deployment/update-deployment
Replicas: 3 current / 3 desired
Pods Status: 3 Running / 0 Waiting / 0 Succeeded / 0 Failed
...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 3m replicaset-controller Created pod: update-deployment-7db77f7cc6-7j49g
Normal SuccessfulCreate 3m replicaset-controller Created pod: update-deployment-7db77f7cc6-b75wn
Normal SuccessfulCreate 3m replicaset-controller Created pod: update-deployment-7db77f7cc6-cfnt5

replicaset创建了3个pod

pod

root@k8s-master:~# kubectl describe pod update-deployment-7db77f7cc6-7j49g
Name: update-deployment-7db77f7cc6-7j49g
Namespace: default
...
Status: Running
IP: 10.10.169.140
Controlled By: ReplicaSet/update-deployment-7db77f7cc6
...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 9m default-scheduler Successfully assigned update-deployment-7db77f7cc6-7j49g to k8s-node2
Normal SuccessfulMountVolume 9m kubelet, k8s-node2 MountVolume.SetUp succeeded for volume "default-token-v9nkm"
Normal Pulling 9m kubelet, k8s-node2 pulling image "registry.cn-beijing.aliyuncs.com/mrvolleyball/nginx:v1"
Normal Pulled 9m kubelet, k8s-node2 Successfully pulled image "registry.cn-beijing.aliyuncs.com/mrvolleyball/nginx:v1"
Normal Created 9m kubelet, k8s-node2 Created container
Normal Started 9m kubelet, k8s-node2 Started container
  • pod被replicaset创建之后,开始分配到worker节点、拉取镜像、启动容器等一系列操作
  • 所以pod的命名方式是:update-deployment-7db77f7cc6-7j49g(deployment名字-replicaset模板hash名字-pod模板hash名字)

大家可能不禁会有疑问,为什么搞这么复杂,启动一个pod需要动用这么多组件呢?下面用一个场景说明为啥需要这么多组件:

镜像版本更新

镜像版本更新

  • 当镜像版本有更新时(三种方法都可以实现,参考前一篇文章:更新k8s镜像版本的三种方式),既要保证服务可用,又要保证在线更新,流程应该是:

    1. 先增加一个pod,镜像版本为新版本
    2. pod可用之后,删除一个老版本pod
    3. 循环第1、2步,直到老版本pod全部删除,新版本的pod全部可用
  • 上述的这个过程就是replicaset的作用,它根据需求,自动的增加新版本pod,然后删除老版本pod,直到老版本pod全部删除,新版本的pod全部可用

  • 如果此时版本需要回退,那replicaset需要把刚才的步骤逆向更新一遍,实现版本回退

  • deployment的作用就是管理replicaset。deployment会保存各个版本的replicaset,一旦需要进行版本回滚,deployment会立即回滚replicaset的版本,从而控制pod状态

下面测试一下:

使用patch命令更新镜像版本,并且使用pause命令来观察:

root@k8s-master:~# kubectl patch deployment update-deployment \
--patch '{"spec": {"template": {"spec": {"containers": [{"name": "nginx","image":"registry.cn-beijing.aliyuncs.com/mrvolleyball/nginx:v2"}]}}}}' \
&& kubectl rollout pause deployment update-deployment
deployment.extensions "update-deployment" patched
deployment.apps "update-deployment" paused

此时pod状态:

root@k8s-master:~# kubectl get pod -owide
NAME READY STATUS RESTARTS AGE IP NODE
update-deployment-7db77f7cc6-7j49g 1/1 Running 0 1h 10.10.169.140 k8s-node2
update-deployment-7db77f7cc6-b75wn 1/1 Running 0 1h 10.10.235.211 k8s-master
update-deployment-7db77f7cc6-cfnt5 1/1 Terminating 0 1h 10.10.36.126 k8s-node1
update-deployment-7fb7b4b557-6987x 1/1 Running 0 7s 10.10.36.127 k8s-node1
update-deployment-7fb7b4b557-dxdqb 1/1 Running 0 10s 10.10.169.139 k8s-node2

新增了2个pod,而删除了1个老版本的pod

此时replicaset状态:

root@k8s-master:~# kubectl get rs -owide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
update-deployment-7db77f7cc6 2 2 2 1h nginx registry.cn-beijing.aliyuncs.com/mrvolleyball/nginx:v1 app=roll-update,pod-template-hash=3863393772
update-deployment-7fb7b4b557 2 2 2 4m nginx registry.cn-beijing.aliyuncs.com/mrvolleyball/nginx:v2 app=roll-update,pod-template-hash=3963606113

有一个新版本的replicaset创建了出来,并且需求的pod数量为2,而原来的replicaset需求的pod数量从3降为2

查看replicaset版本:

root@k8s-master:~# kubectl rollout history deploy update-deployment
deployments "update-deployment"
REVISION CHANGE-CAUSE
1 <none>
2 update version to v2

新增了一个版本2

由于使用pause命令,更新过程到此会卡主,我们让更新的过程继续下去:

root@k8s-master:~# kubectl rollout resume deployment update-deployment
deployment.apps "update-deployment" resumed

查看状态:

root@k8s-master:~# kubectl get pod
NAME READY STATUS RESTARTS AGE
update-deployment-7fb7b4b557-6987x 1/1 Running 0 15m
update-deployment-7fb7b4b557-dxdqb 1/1 Running 0 15m
update-deployment-7fb7b4b557-wg5c8 1/1 Running 0 1m
root@k8s-master:~# kubectl get rs -owide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
update-deployment-7db77f7cc6 0 0 0 1h nginx registry.cn-beijing.aliyuncs.com/mrvolleyball/nginx:v1 app=roll-update,pod-template-hash=3863393772
update-deployment-7fb7b4b557 3 3 3 14m nginx registry.cn-beijing.aliyuncs.com/mrvolleyball/nginx:v2 app=roll-update,pod-template-hash=3963606113

v1版本的replicaset已经没有pod,但是历史记录还是保留的,可以通过deployment调度快速回滚

详谈kubernetes滚动更新-1的更多相关文章

  1. kubernetes滚动更新

    系列目录 简介 当kubernetes集群中的某个服务需要升级时,传统的做法是,先将要更新的服务下线,业务停止后再更新版本和配置,然后重新启动并提供服务.如果业务集群规模较大时,这个工作就变成了一个挑 ...

  2. Kubernetes——滚动更新和数据管理

    k8s——滚动更新滚动更新就是一次只更新一小部分副本,更新成功之后再更新更多的副本,最终完成所有副本的更新.滚动更新最大的好处是零停机,整个更新的过程中始终有副本运行,从而保证了业务的连续性.kube ...

  3. Kubernetes滚动更新介绍及使用-minReadySeconds

    滚动升级Deployment 现在我们将刚刚保存的yaml文件中的nginx镜像修改为 nginx:1.13.3,然后在spec下面添加滚动升级策略:   1 2 3 4 5 6 7 minReady ...

  4. kubernetes 滚动更新发布及回滚

    基本命令 记录历史 --record kubectl  apply -f **** --record 查看当前状态 kubectl rollout status deployment/demo -w ...

  5. Kubernetes集群中Service的滚动更新

    Kubernetes集群中Service的滚动更新 二月 9, 2017 0 条评论 在移动互联网时代,消费者的消费行为已经“全天候化”,为此,商家的业务系统也要保持7×24小时不间断地提供服务以满足 ...

  6. Kubernetes Deloyment实现滚动更新

    目录 滚动更新简介 使用kubectl rolling-update更新RC Deployment的rolling-update 滚动更新简介 当kubernetes集群中的某个服务需要升级时,传统的 ...

  7. 详谈kubernetes更新-2

    系列目录 本文详细探索deployment在滚动更新时候的行为 要详细探讨的参数描述: livenessProbe:存活性探测.判断pod是否已经停止 readinessProbe:就绪性探测.判断p ...

  8. Kubernetes Pod应用的滚动更新(八)

    一.环境准备 我们紧接上一节的环境,进行下面的操作,如果不清楚的,可以先查看上一篇博文. 滚动更新是一次只更新一小部分副本,成功后,再更新更多的副本,最终完成所有副本的更新.滚动更新的最大的好处是零停 ...

  9. kubernetes之DaemonSet以及滚动更新

    1.什么是DaemonSet? 1.1DaemonSet是Pod控制器的又一种实现方式,用于在集群中的全部节点上同时运行一份指定的Pod资源副本,后续加入集群的节点也会自动创建一个相关的Pod对象,当 ...

随机推荐

  1. 浅谈android反调试之 API判断

    反调试:利用Java层API来判断Android程序是否是处于被调试下. 1.直接调用系统的android.os.Debug.isDebuggerConnected()方法 我们进行动态调试的时候,其 ...

  2. 【NOI2017】游戏

    好久没写 $2-sat$ 了……(话说这东西哪里还考过) 题意 有 $3$ 种赛车 $A,B,C$ 和 $4$ 种赛道 $a,b,c,x$,赛车 $A$ 不适用于赛道 $a$,赛车 $B$ 不适用于赛 ...

  3. java面试题之spring aop中jdk和cglib哪个动态代理的性能更好?

    在jdk6和jdk7的时候,jdk比cglib要慢: 在jdk8的时候,jdk性能得到提升比cglib要快很多: 结论出自:https://www.cnblogs.com/xuliugen/p/104 ...

  4. centos7配置国内yum源

    文章目录 1.什么是yum仓库? 2.yum仓库配置 2.1.阿里镜像仓库配置 2.1.1.配置步骤 2.1.2.epel源 安装和配置 2.1.3.查看yum源 2.2.配置 清华大学镜像仓库 1. ...

  5. STL学习笔记(六) 函数对象

    条款38:遵循按值传递的原则来设计仿函数 仿函数都是 pass-by-value Function for_each(InputIterator first, InputIterator last, ...

  6. 转 Python爬虫入门四之Urllib库的高级用法

    静觅 » Python爬虫入门四之Urllib库的高级用法 1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我 ...

  7. Linux 之 Vim常用命令

    Vim常用命令 参考教程:[千峰教育] 终端编辑命令工具: vi/vim.emacs等. vim简介: vim是vi的扩展,被誉为终端编辑之神. vim安装: yum install -y vim 工 ...

  8. LeetCode OJ——Binary Tree Inorder Traversal

    http://oj.leetcode.com/problems/binary-tree-inorder-traversal/ 树的中序遍历,递归方法,和非递归方法. /** * Definition ...

  9. 洛谷——P1126 机器人搬重物

    P1126 机器人搬重物 题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径1.6米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个N*M的网格,有 ...

  10. error错误信息状态码含义

    XMLHttpRequest.status: 200:成功. 401:拒绝访问. 403:禁止访问. 404:找不到. 405:方法不被允许. 407:要求进行代理身份验证. 500:内部服务器错误. ...