zoukankan      html  css  js  c++  java
  • 运维之扩容与升级

    本文我们将对Kubernetes的常用运维操作扩容与升级做简单说明。

    1.Node的扩容

    Node的扩容简单言之就是增加新的Node节点。在节点上安装Kubelet,Kube-proxy及Docker, 并修改参数使其指向Master地址。基于Kuberlet的自动注册机制,新的Node将会自动加入现有的Kubernetes集群中。

    2.Pod的动态扩容和缩放

    在实际运维过程中,我们常常需要对某个服务动态扩容以满足突增的流量,或者动态减少服务实例节约服务器资源。
    下面我们将动态增加redis-slave的pod副本由2个增加为3个。
    #kubectl scale rc redis-slave –replicas=3

    [root@CentOS7 python]# kubectl get pods
    NAME                 READY     STATUS    RESTARTS   AGE
    frontend-02x2s       1/1       Running   1          1d
    frontend-8xtuj       1/1       Running   1          1d
    frontend-ko8b2       1/1       Running   1          1d
    redis-master-2v6pp   1/1       Running   1          1d
    redis-slave-5k126    1/1       Running   1          1d
    redis-slave-9dqti    1/1       Running   1          1d
    [root@CentOS7 python]# kubectl scale rc redis-slave --replicas=3 scaled
    [root@CentOS7 python]# kubectl get pods
    NAME                 READY     STATUS    RESTARTS   AGE
    frontend-02x2s       1/1       Running   1          1d
    frontend-8xtuj       1/1       Running   1          1d
    frontend-ko8b2       1/1       Running   1          1d
    redis-master-2v6pp   1/1       Running   1          1d
    redis-slave-0d33n    1/1       Running   0          59s
    redis-slave-5k126    1/1       Running   1          1d
    redis-slave-9dqti    1/1       Running   1          1d

    同样的我们也可以减少pod的副本,以下我们将redis-slave由3个副本减为1个。

    [root@CentOS7 python]# kubectl scale rc redis-slave --replicas=1 scaled
    [root@CentOS7 python]# kubectl get pods
    NAME                 READY     STATUS    RESTARTS   AGE
    frontend-02x2s       1/1       Running   1          1d
    frontend-8xtuj       1/1       Running   1          1d
    frontend-ko8b2       1/1       Running   1          1d
    redis-master-2v6pp   1/1       Running   1          1d
    redis-slave-0d33n    1/1       Running   0          2m

    3.应用的滚动升级

    在实际运维过程中,如何不停止服务而进行升级将变得越来越常见,Kubernetes提供了Rolling-update的功能来解决上述场景。
    我们假设PHP的image有一个新的v2版本,我们需要将现有PHP服务滚动升级为v2。

    3.1制作新镜像

    简单起见,我们通过docker commit来制作一个新镜像,首先用原镜像启动一个新容器,你可以在容器里修改,然后退出。

    [root@CentOS7 python]# docker run -it docker.io/kubeguide/guestbook-php-frontend /bin/bash
    root@68b765a2b8db:/var/www/html# exit
    exit
    好,现在我们用docker commit来保存刚才我们编辑过的容器,我们把它命名为guestbook-php-frontend:v2
    [root@CentOS7 python]# docker commit 68b765a2b8db guestbook-php-frontend:v2
    afa8c93501405642879a30d14ddeb087e48d8fb7a7a04dd2ab8f5556fd9db99b
    [root@CentOS7 python]# docker images
    REPOSITORY                                            TAG                 IMAGE ID            CREATED              VIRTUAL SIZE
    guestbook-php-frontend                                v2                  afa8c9350140        About a minute ago   509.6 MB
    daocloud.io/daocloud/daocloud-toolset                 latest              01869b5aa54e        3 weeks ago          150.2 MB
    docker.io/mysql                                       latest              4b95c7a7999d        4 weeks ago          374 MB
    registry.access.redhat.com/rhel7/pod-infrastructure   latest              2b96d2bcbc46        6 weeks ago          428 MB
    docker.io/kubeguide/guestbook-php-frontend            latest              38658844a359        8 months ago         509.6 MB
    docker.io/kubeguide/redis-master                      latest              423e126c2ad4        8 months ago         419.1 MB
    docker.io/kubeguide/guestbook-redis-slave             latest              00206e07dd92        9 months ago         109.5 MB
    我们看到新增加了一个镜像guestbook-php-frontend,tag为v2,接下来我们将通过两种方法来演示滚动升级。

    3.2通过配置文件

    创建 frontend-controller-v2.yaml

    apiVersion: v1
    kind: ReplicationController
    metadata:
      name: frontend-v2
      labels:
        name: frontend
    spec:
      replicas: 3
      selector:
        name: frontend-v2
      template:
        metadata:
          labels:
            name: frontend-v2
        spec:
          containers:
          - name: php-redis
            image: guestbook-php-frontend:v2
            env:
            - name: GET_HOSTS_FROM
              value: env
            ports:
            - containerPort: 80
    

    Kubectl的执行过程如下:

     [root@CentOS7 kube-guestbook]#kubectl rolling-update frontend -f frontend-controller-v2.yaml
    查看pods创建过程, 我们看到新的POD副本从1开始增加,旧的POD副本从3逐步减少,最终旧的POD副本被删除。这样就完成了应用的升级。

    3.3通过新版镜像

    另一种方法是不使用配置文件,直接用kubectl rolling-update 加上–image参数指定新版镜像名称来滚动升级
    kubectl rolling-update frontend –image=guestbook-php-frontend:v2

    更新完成,查看RC,我们看到与配置文件不同,Kubectl给rc增加了一个key为”deployment”的label,当然这个名字可以通过–deployment-label-key参数修改。

    [root@localhost ~]# kubectl get rc
    CONTROLLER     CONTAINER(S)   IMAGE(S)                                    SELECTOR                                                    REPLICAS
    frontend       php-redis      guestbook-php-frontend:v2                   deployment=cdb7f26e49a90eae43e257284310b1cf,name=frontend   3
    

    如果在更新过程中发现配置错误,可以通过执行kubectl rolling-update –rollback完成回滚
    kubectl rolling-update frontend –image=guestbook-php-frontend:v2 –rollback

  • 相关阅读:
    1052. 爱生气的书店老板
    766. 托普利茨矩阵
    643.子数组的最大平均数I
    450. 删除二叉搜索树中的节点
    1489.找到最小生成树里的关键边和伪关键边
    839相似字符串
    1631.最小体力消耗路径
    SnowFlake雪花算法源码分析&灵活改造,常见分布式ID生成解决方案
    【目标检测】三、Faster R-CNN与R-FCN
    【目标检测】二、Fast R-CNN与SVD
  • 原文地址:https://www.cnblogs.com/dongdongwq/p/5518718.html
Copyright © 2011-2022 走看看