暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

每天五分钟学K8(六):Pod控制器之ReplicaSet与Deployment

CodingWithFun 2019-09-19
777

通过前面的学习,我们知道Pod是对容器的进一步抽象与封装。而且我们可以直接用yaml文件的方式创建Pod对象,不过在实际项目中更多的还是通过控制器来管理Pod对象。


我们先来回顾一下咱们部署mysql时,yaml文件如下:

    apiVersion: v1
    kind: ReplicationController # 副本控制器
    metadata:
    name: mysql # RC的名称,全局唯一


    spec:
    replicas: 1 # Pod的副本数量
    selector:
    app: mysql # 拥有此标签的Pod归属此RC
    template:
    metadata:
    labels:
    app: mysql # Pod拥有的标签,必须与select一致
    spec:
    containers: # Pod容器的定义
    - name: mysql # 定义镜像
    image: mysql
    ports:
    - containerPort: 3306 # 容器暴露的端口
    env: # 设置容器的环境变量
    - name: MYSQL_ROOT_PASSWORD
    value: "123456"


    这个文件可分为两部分,template前面是控制器的定义,后半部分是Pod的定义。有了控制器可以方便的控制Pod的副本数量,实现弹性伸缩。下面介绍常用的控制器。


    一、ReplicaSet

    ReplicaSet是用于取代ReplicationController的控制器,除了支持基于集合的标签选择器以及通过Deployment控制器可实现滚动更新之外,目前他们的区别不大。由于ReplicationController以后会被废弃,故不再讲解这个控制器。


    下面是ReplicaSet控制器部署nginx的例子:

      #################控制器部分定义####################
      apiVersion: apps/v1
      kind: ReplicaSet # ReplicaSet副本控制器
      metadata:
      name: nginx # ReplicaSet的名称,全局唯一


      spec:
      replicas: 3 # Pod的副本数量
      selector:
      matchLabels:
      app: nginx


      #################Pod对象部分定义####################
      template:
      metadata:
      labels:
      app: nginx # Pod拥有的标签,必须与select一致
      spec:
      containers: # Pod容器的定义
      - name: nginx # 定义镜像
      image: nginx
      ports:
      - containerPort: 80 # 容器暴露的端口


      在控制器部分有一个重要的字段replicas控制Pod的副本数量。控制器将不断循环监测Pod的数量,多则删除,少则通过Pod模板创建。可以手动删除一个Pod,然后Kubenetes会再创建一个新的Pod,保证期望的副本持续运行。

        $ kubectl get pods -l app=nginx
        NAME READY STATUS RESTARTS AGE
        nginx-kndbg 1/1 Running 0 26m
        nginx-s2v2q 1/1 Running 0 26m
        nginx-tfs9d 1/1 Running 0 26m


        $ kubectl delete pod nginx-tfs9d
        pod "nginx-tfs9d" deleted


        $ kubectl get pods -l app=nginx
        NAME READY STATUS RESTARTS AGE
        nginx-dn6jw 0/1 ContainerCreating 0 6s
        nginx-kndbg 1/1 Running 0 26m
        nginx-s2v2q 1/1 Running 0 27m


        可用kubectl describe replicasets/nginx打印出ReplicaSet的详细状态,其输出的Events字段可看到Pod的创建与删除操作。


        删除ReplicaSet可用delete命令,同时其关联的Pod也会被删除:

          kubectl delete replicasets/nginx


          二、Deployment

          Deployment构建在ReplicaSet之上,但提供了更多特性,使得滚动升级更方便。下面是上个例子的Deployment的实现方式:

            #################控制器部分定义####################
            apiVersion: apps/v1
            kind: Deployment # Deployment副本控制器
            metadata:
            name: nginx # Deployment的名称,全局唯一


            spec:
            replicas: 3 # Pod的副本数量
            selector:
            matchLabels:
            app: nginx


            #################Pod对象部分定义####################
            template:
            metadata:
            labels:
            app: nginx # Pod拥有的标签,必须与select一致
            spec:
            containers: # Pod容器的定义
            - name: nginx # 定义镜像
            image: nginx
            ports:
            - containerPort: 80 # 容器暴露的端口


            发布之后可以查看Deployment对象,显示的字段中UP-TO-DATE表示已经达到期望状态的Pod副本数量,AVAILABLE表示当前处于可用状态的Pod数量。

              $ kubectl get deployments nginx
              NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
              nginx 3 3 3 3 7m8s


              Deployment会自动创建一个ReplicaSet对象。

                $ kubectl get replicasets -l app=nginx
                NAME DESIRED CURRENT READY AGE
                nginx-c5b5c6f7c 3 3 3 11m


                他们之间的层级关系如下:

                滚动升级是指删除旧版本Pod的同时,补充创建一部分新的Pod对象进行升级,其优势是在升级期间,容器中应用提供的服务不会中断,但要求应用新旧版本能同时工作的场景。ReplicaSet实现滚动更新需手动多步操作,而Deployment只需更改相应的yaml配置,余下步骤可自动完成。


                我们将上个例子中nginx镜像改为nginx:1.17.3,重新发布之后,查看ReplicaSet,发现Deployment又创建了一个新的ReplicaSet以实现滚动升级。

                  $ kubectl get replicasets -l app=nginx
                  NAME DESIRED CURRENT READY AGE
                  nginx-787db44985 3 3 3 9m48s
                  nginx-c5b5c6f7c 0 0 0 57m


                  其滚动升级过程可通过kubectl describe查看:

                    $ kubectl describe deployment nginx
                    .....
                    Events:
                    Type Reason Age From Message
                    ---- ------ ---- ---- -------
                    Normal ScalingReplicaSet 51m deployment-controller Scaled up replica set nginx-c5b5c6f7c to 3
                    Normal ScalingReplicaSet 4m14s deployment-controller Scaled up replica set nginx-787db44985 to 1
                    Normal ScalingReplicaSet 3m50s deployment-controller Scaled down replica set nginx-c5b5c6f7c to 2
                    Normal ScalingReplicaSet 3m50s deployment-controller Scaled up replica set nginx-787db44985 to 2
                    Normal ScalingReplicaSet 3m22s deployment-controller Scaled down replica set nginx-c5b5c6f7c to 1
                    Normal ScalingReplicaSet 3m22s deployment-controller Scaled up replica set nginx-787db44985 to 3
                    Normal ScalingReplicaSet 3m1s deployment-controller Scaled down replica set nginx-c5b5c6f7c to 0

                    从Events中可以看出,滚动升级就是让旧的ReplicaSet的Pod不断减少,新的ReplicaSet不断增多的过程。


                    滚动升级可暂停或回滚,从而实现金丝雀发布。


                    文章转载自CodingWithFun,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                    评论