Docker学习第十天——k8s之ReplicaSet及Deployment

一、ReplicaSet

        ReplicaSet,即副本控制器,简称rs,主要作用是控制由其管理的pod,使pod副本的数量始终维持在预设的个数,保证一定数量的Pod能够在集群中正常运行,它会持续监听这些Pod的运行状态,在Pod发生故障时重启pod,pod数量减少时重新运行新的 Pod副本。

        官方不推荐,使用Deployment代替。

二、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: 80

1.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、Deployment使用案例

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          115m

        pending表示正在进行调度,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>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值