赞
踩
ReplicaSet,即副本控制器,简称rs,主要作用是控制由其管理的pod,使pod副本的数量始终维持在预设的个数,保证一定数量的Pod能够在集群中正常运行,它会持续监听这些Pod的运行状态,在Pod发生故障时重启pod,pod数量减少时重新运行新的 Pod副本。
官方不推荐,使用Deployment代替。
1、Deployment概述
1.1 介绍
• 除了能够调用ReplicaSet之外还可以提供滚动升级及回滚的功能。
• deployment是一个三级结构,deployment管理replicaset,replicaset管理pod,用deployment创建一个pod。
1.2 功能
• 创建ReplicaSet和Pod
• 滚动升级(不停止旧服务的状态下升级)和回滚应用(将应用回滚到之前的版本)
• 平滑地扩容和缩容
• 暂停和继续Deployment
1.3 简单案例
apiVersion: apps/v1 kind: Deployment metadata: name: mydm spec: replicas: 3 #副本数:3 selector: #标签选择器,选择其关联的pod matchLabels: app: myapp-blue #匹配模板中label template: #定义的pod模板 metadata: labels: app: myapp-blue spec: containers: - name: myapp-blue image: busybox:1.28 imagePullPolicy: IfNotPresent ports: - containerPort: 801.4 查看命令
• 查看Deployment:kubectl get deploy
• 查看RaplicaSet:kubectl get rs
1.5 扩缩容
修改对应的yaml文件中的replicas的数量
1.6 滚动更新
• 修改对应的yaml文件中的image信息
• kubectl edit deploy deployname
1.7 回滚
• 查看历史版本:kubectl rollout history deployment name
• 回滚操作:kubectl rollout undo deployment name --to-revision=1
1.8 自定义更新策略
• 编写位置:在spec→strategy内,为rollingUpdate
spec: strategy: rollingUpdate: maxSurge: 1 maxUnavailable: 1• maxUnavailable:和期望的副本数比,不可用副本数最大比例(或最大值),这个值越小,越能保证服务稳定,更新越平滑;
• maxSurge:和期望的副本数比,超过期望副本数最大比例(或最大值),这个值调的越大,副本更新速度越快。
• 按数量更新:
◇ maxUnavailable: [0, 副本数]
◇ maxSurge: [0, 副本数]
◇ 两者不能同时为0。
• 按比例更新:
◇ maxUnavailable: [0%, 100%] 向下取整,比如10个副本,5%的话==0.5个,但计算按照0个;
◇ maxSurge: [0%, 100%] 向上取整,比如10个副本,5%的话==0.5个,但计算按照1个;
◇ 注意:两者不能同时为0。
• 查看控制器详细信息:kubectl describe deployment 控制器名
◇ 显示:RollingUpdateStrategy: 1 max unavailable, 1 max surge
2.1 Deployment创建一个web站点
把myapp-blue-v1.tar.gz和myapp-blue-v2.tar.gz上传到hd2.com和hd3.com上,手动解压:
[root@hd2.com ~]# docker load -i myapp-blue-v1.tar.gz [root@hd3.com ~]# docker load -i myapp-blue-v1.tar.gz [root@hd2.com ~]# docker load -i myapp-blue-v2.tar.gz [root@hd3.com ~]# docker load -i myapp-blue-v2.tar.gz编写yaml文件并使用:
[root@hd1.com ~]# cat deploy-demo.yaml apiVersion: apps/v1 #deployment对应的api版本 kind: Deployment #创建的资源是deployment metadata: name: myapp-v1 #deployment的名字 spec: replicas: 2 #deployment管理的pod副本数 selector: #标签选择器 matchLabels: # matchLabels下定义的标签需要跟template.metadata.labels定义的标签一致 app: myapp version: v1 template: metadata: labels: app: myapp version: v1 spec: #定义容器的属性 containers: - name: myapp image: janakiramm/myapp:v1 #容器使用的镜像 imagePullPolicy: IfNotPresent #镜像拉取策略 ports: - containerPort: 80 #容器里的应用的端口 [root@hd1 ~]# kubectl apply -f deploy-demo.yaml [root@hd1 ~]# kubectl get deploy NAME READY UP-TO-DATE AVAILABLE AGE myapp-v1 3/3 3 3 22s创建的控制器名字是myapp-v1
◇ NAME :列出名称空间中deployment的名称。
◇ READY:显示deployment有多少副本数。它遵循ready/desired的模式。
◇ UP-TO-DATE: 显示已更新到所需状态的副本数。
◇ AVAILABLE: 显示你的可以使用多少个应用程序副本。
◇ AGE :显示应用程序已运行的时间。
kubectl get rs 显示如下:
[root@hd1 ~]# kubectl get rs NAME DESIRED CURRENT READY AGE myapp-v1-67fd9fc9c8 3 3 3 8m13s• 创建deploy的时候也会创建一个rs(replicaset),67fd9fc9c8 这个随机数字是我们引用pod的模板template的名字的hash值
◇ NAME: 列出名称空间中ReplicaSet资源
◇ DESIRED:显示应用程序的所需副本数,这些副本数是在创建时定义的。这是所需的状态。
◇ CURRENT: 显示当前正在运行多少个副本。
◇ READY: 显示你的用户可以使用多少个应用程序副本。
◇ AGE :显示应用程序已运行的时间。
◇ 注意:ReplicaSet的名称始终设置为[DEPLOYMENT-NAME]-[RANDOM-STRING]。RANDOM-STRING是随机生成的
生成pod查看与测试:
[root@hd1 ~]# kubectl get pods -o wide | grep myapp myapp-v1-67fd9fc9c8-28gnd 1/1 Running 0 97m 10.244.25.211 hd3.com <none> <none> myapp-v1-67fd9fc9c8-cfzh7 1/1 Running 0 97m 10.244.156.147 hd2.com <none> <none> myapp-v1-67fd9fc9c8-dfg5v 1/1 Running 0 97m 10.244.25.212 hd3.com <none> <none> [root@hd1.com ~]# curl 10.244.25.211 background-color: blue; [root@hd1.com ~]# curl 10.244.156.147 background-color: blue;2.2 Deployment管理pod:扩容、缩容、滚动更新、回滚
通过deployment管理应用,实现扩容,把副本数变成5
[root@hd1.com ~]# cat deploy-demo.yaml #直接修改replicas数量,如下,变成5 spec: replicas: 5 #修改之后保存退出,执行 [root@hd1.com ~]# kubectl apply -f deploy-demo.yaml [root@hd1 ~]# kubectl get pods NAME READY STATUS RESTARTS AGE myapp-v1-67fd9fc9c8-28gnd 1/1 Running 0 106m myapp-v1-67fd9fc9c8-cfzh7 1/1 Running 0 106m myapp-v1-67fd9fc9c8-dfg5v 1/1 Running 0 106m myapp-v1-67fd9fc9c8-kdfhx 1/1 Running 0 71s myapp-v1-67fd9fc9c8-s86wz 1/1 Running 0 71s #上面可以看到pod副本数变成了5个 #查看myapp-v1这个控制器的详细信息: [root@hd1.com ~]# kubectl describe deploy myapp-v1通过deployment管理应用,实现缩容,把副本数变成2
[root@hd1.com ~]# cat deploy-demo.yaml #直接修改replicas数量,如下,变成2 spec: replicas: 2 #修改之后保存退出,执行 [root@hd1.com ~]# kubectl apply -f deploy-demo.yaml [root@hd1 ~]# kubectl get pods NAME READY STATUS RESTARTS AGE myapp-v1-67fd9fc9c8-28gnd 0/1 Terminating 0 108m myapp-v1-67fd9fc9c8-cfzh7 1/1 Running 0 108m myapp-v1-67fd9fc9c8-dfg5v 0/1 Terminating 0 108m myapp-v1-67fd9fc9c8-s86wz 1/1 Running 0 3m28s [root@hd1 ~]# kubectl get pods NAME READY STATUS RESTARTS AGE myapp-v1-67fd9fc9c8-cfzh7 1/1 Running 0 108m myapp-v1-67fd9fc9c8-s86wz 1/1 Running 0 3m39s还可以通过kubectl edit deploy myapp-v1 实现自动扩容或缩容
[root@hd1 deploy]# kubectl edit deploy myapp-v1 #同样找到replicas并修改通过deployment管理应用,实现滚动更新
[root@hd1.com ~]# kubectl get pods -l app=myapp -w NAME READY STATUS RESTARTS AGE myapp-v1-67fd9fc9c8-fcprr 1/1 Running 0 19m myapp-v1-67fd9fc9c8-hw4f9 1/1 Running 0 22m #实时显示当前pods状态 #打开一个新的终端窗口更改镜像版本,按如下操作: [root@hd1.com ~]# vim deploy-demo.yaml #把image: janakiramm/myapp:v1 变成image: janakiramm/myapp:v2 #保存退出,执行 [root@hd1.com ~]# kubectl apply -f deploy-demo.yaml #再回到刚才执行监测kubectl get pods -l app=myapp -w的那个窗口,可以看到信息如下: NAME READY STATUS RESTARTS AGE myapp-v1-67fd9fc9c8-8fdnn 1/1 Running 0 4m1s myapp-v1-67fd9fc9c8-cfzh7 1/1 Running 0 114m myapp-v1-67fd9fc9c8-khkj7 1/1 Running 0 4m1s myapp-v1-67fd9fc9c8-s86wz 1/1 Running 0 9m40s myapp-v1-75fb478d6c-2gzt8 0/1 Pending 0 0s myapp-v1-75fb478d6c-2gzt8 0/1 Pending 0 0s myapp-v1-67fd9fc9c8-khkj7 1/1 Terminating 0 5m6s myapp-v1-75fb478d6c-2gzt8 0/1 ContainerCreating 0 0s myapp-v1-75fb478d6c-pl7pr 0/1 Pending 0 0s myapp-v1-75fb478d6c-pl7pr 0/1 Pending 0 0s myapp-v1-75fb478d6c-pl7pr 0/1 ContainerCreating 0 0s myapp-v1-67fd9fc9c8-khkj7 1/1 Terminating 0 5m7s myapp-v1-67fd9fc9c8-khkj7 0/1 Terminating 0 5m7s myapp-v1-75fb478d6c-2gzt8 0/1 ContainerCreating 0 1s myapp-v1-75fb478d6c-pl7pr 0/1 ContainerCreating 0 2s myapp-v1-67fd9fc9c8-khkj7 0/1 Terminating 0 5m8s myapp-v1-67fd9fc9c8-khkj7 0/1 Terminating 0 5m8s myapp-v1-75fb478d6c-2gzt8 1/1 Running 0 2s myapp-v1-67fd9fc9c8-s86wz 1/1 Terminating 0 10m myapp-v1-75fb478d6c-v2d4x 0/1 Pending 0 0s myapp-v1-75fb478d6c-v2d4x 0/1 Pending 0 0s myapp-v1-75fb478d6c-v2d4x 0/1 ContainerCreating 0 0s myapp-v1-67fd9fc9c8-s86wz 1/1 Terminating 0 10m myapp-v1-67fd9fc9c8-s86wz 0/1 Terminating 0 10m myapp-v1-75fb478d6c-pl7pr 1/1 Running 0 3s myapp-v1-67fd9fc9c8-8fdnn 1/1 Terminating 0 5m9s myapp-v1-75fb478d6c-zx74h 0/1 Pending 0 0s myapp-v1-75fb478d6c-zx74h 0/1 Pending 0 0s myapp-v1-75fb478d6c-zx74h 0/1 ContainerCreating 0 0s myapp-v1-67fd9fc9c8-8fdnn 1/1 Terminating 0 5m9s myapp-v1-75fb478d6c-v2d4x 0/1 ContainerCreating 0 1s myapp-v1-67fd9fc9c8-8fdnn 0/1 Terminating 0 5m9s myapp-v1-75fb478d6c-zx74h 0/1 ContainerCreating 0 1s myapp-v1-75fb478d6c-v2d4x 1/1 Running 0 3s myapp-v1-75fb478d6c-zx74h 1/1 Running 0 2s myapp-v1-67fd9fc9c8-cfzh7 1/1 Terminating 0 115m myapp-v1-67fd9fc9c8-cfzh7 1/1 Terminating 0 115m myapp-v1-67fd9fc9c8-cfzh7 0/1 Terminating 0 115m myapp-v1-67fd9fc9c8-s86wz 0/1 Terminating 0 10m myapp-v1-67fd9fc9c8-s86wz 0/1 Terminating 0 10m myapp-v1-67fd9fc9c8-8fdnn 0/1 Terminating 0 5m22s myapp-v1-67fd9fc9c8-8fdnn 0/1 Terminating 0 5m22s myapp-v1-67fd9fc9c8-cfzh7 0/1 Terminating 0 115m myapp-v1-67fd9fc9c8-cfzh7 0/1 Terminating 0 115mpending表示正在进行调度,ContainerCreating表示正在创建一个pod,running表示运行一个pod,running起来一个pod之后再Terminating(停掉)一个pod,以此类推,直到所有pod完成滚动升级。
查看myapp-v1这个控制器的历史版本:
[root@hd1.com ~]# kubectl rollout history deployment myapp-v1 deployment.apps/myapp-v1 REVISION CHANGE-CAUSE 1 <none> 2 <none>回滚:
[root@hd1.com ~]# kubectl rollout undo deployment myapp-v1 --to-revision=1 deployment.apps/myapp-v1 rolled back [root@hd1.com ~]# kubectl rollout history deployment myapp-v1 deployment.apps/myapp-v1 REVISION CHANGE-CAUSE 2 <none> 3 <none>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。