美文网首页
Kubernetes学习笔记——2.5 伸缩应用

Kubernetes学习笔记——2.5 伸缩应用

作者: IFELSE | 来源:发表于2018-03-20 08:58 被阅读0次

    by kowen 2018.02.27
    本文翻译自Scale Your App

    学习目标

    • 使用kubectl伸缩(Scale)应用

    伸缩应用

    我们已经能够创建部署,并且通过服务将它暴露出去。但这个部署只是创建了一个Pod运行应用,当访问量增加的时候,我们需要扩充服务来满足用户需求。

    伸缩(Scaling)功能是通过修改部署副本的数量完成的。

    伸缩概述

    image.png
    image.png

    扩展(scaling out)部署会确保新的Pod被创建并部署到有足够可用资源的Node上面。缩减(scaling in)会根据最新状态减少Pod的个数。Kubernetes支持自动伸缩功能,但本教程不涉及该内容。缩减Pod个数到0也是可能的,这样会停止该部署的所有Pod。

    应用运行了多个实例,必须要有一种方法来给它们分发流量。服务有一个内置的load-balancer自动将网络流量分发到各个Pod。服务会使用endpoint持续监控Pod,保证流量只被发送到可用的Pod上。

    一旦你的应用有个多个运行实例,你就可以滚动更新,而服务不受影响。

    交互式教程

    伸缩一个部署

    查看所有部署

    $ kubectl get deployments
    NAME                  DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
    kubernetes-bootcamp   1         1         1            1           58s
    

    DESIRED状态显示的是配置的副本个数
    CURRENT状态显示的是目前运行的副本个数
    UP-TO-DATE状态显示的是已更新以匹配所需(已配置)状态的副本数量
    AVAILABLE状态显示实际用户可用的副本数量

    下面将部署调整为4个副本。使用kubectl scale命令,后面加上部署类型、名称和需要的实例个数。

    $ kubectl scale deployments/kubernetes-bootcamp --replicas=4
    deployment "kubernetes-bootcamp" scaled
    

    查看是否成功

    $ kubectl get deployments
    NAME                  DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
    kubernetes-bootcamp   4         4         4            4           7m
    

    可以看到目前已经有4个运行实例了。接下来看一下pod个数是否变化:

    $ kubectl get pods -o wide
    NAME                                   READY     STATUS    RESTARTS   AGE       IP      NODE
    kubernetes-bootcamp-5dbf48f7d4-b94f5   1/1       Running   0          1m        172.18.0.6   host01
    kubernetes-bootcamp-5dbf48f7d4-dqxw7   1/1       Running   0          1m        172.18.0.5   host01
    kubernetes-bootcamp-5dbf48f7d4-txdnl   1/1       Running   0          1m        172.18.0.7   host01
    kubernetes-bootcamp-5dbf48f7d4-v68pr   1/1       Running   0          8m        172.18.0.2   host01
    

    现在有4个不同IP地址的Pod。所有的变化都保存在部署实践日志里。使用以下命令查看:

    $ kubectl describe deployments/kubernetes-bootcamp
    Name:                   kubernetes-bootcamp
    Namespace:              default
    CreationTimestamp:      Tue, 27 Feb 2018 07:07:13 +0000
    Labels:                 run=kubernetes-bootcamp
    Annotations:            deployment.kubernetes.io/revision=1
    Selector:               run=kubernetes-bootcamp
    Replicas:               4 desired | 4 updated | 4 total | 4 available | 0 unavailable
    StrategyType:           RollingUpdate
    MinReadySeconds:        0
    RollingUpdateStrategy:  1 max unavailable, 1 max surge
    Pod Template:
      Labels:  run=kubernetes-bootcamp
      Containers:
       kubernetes-bootcamp:
        Image:        gcr.io/google-samples/kubernetes-bootcamp:v1
        Port:         8080/TCP
        Environment:  <none>
        Mounts:       <none>
      Volumes:        <none>
    Conditions:
      Type           Status  Reason
      ----           ------  ------
      Available      True    MinimumReplicasAvailable
    OldReplicaSets:  <none>
    NewReplicaSet:   kubernetes-bootcamp-5dbf48f7d4 (4/4 replicas created)
    Events:
      Type    Reason             Age   From                   Message
      ----    ------             ----  ----                   -------
      Normal  ScalingReplicaSet  10m   deployment-controller  Scaled up replica set kubernetes-bootcamp-5dbf48f7d4 to 1
      Normal  ScalingReplicaSet  3m    deployment-controller  Scaled up replica set kubernetes-bootcamp-5dbf48f7d4 to 4
    

    负载均衡

    让我们确认以下服务是否有流量负载均衡。查看服务暴露的IP地址和端口:

    $ kubectl describe services/kubernetes-bootcamp
    Name:                     kubernetes-bootcamp
    Namespace:                default
    Labels:                   run=kubernetes-bootcamp
    Annotations:              <none>
    Selector:                 run=kubernetes-bootcamp
    Type:                     NodePort
    IP:                       10.100.97.40
    Port:                     <unset>  8080/TCP
    TargetPort:               8080/TCP
    NodePort:                 <unset>  32620/TCP
    Endpoints:                172.18.0.2:8080,172.18.0.5:8080,172.18.0.6:8080 + 1 more...
    Session Affinity:         None
    External Traffic Policy:  Cluster
    Events:                   <none>
    

    创建环境变量NODE_PORT保存端口

    $ export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')
    echo NODE_PORT=$NODE_PORT
    NODE_PORT=32620
    

    通过curl访问服务,多运行几次,可以看到每次访问到不同的Pod。

    $ curl $(minikube ip):$NODE_PORT
    Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5dbf48f7d4-b94f5 | v=1
    $ curl $(minikube ip):$NODE_PORT
    Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5dbf48f7d4-txdnl | v=1
    $ curl $(minikube ip):$NODE_PORT
    Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5dbf48f7d4-v68pr | v=1
    

    收缩

    将服务缩减为2个实例副本

    $ kubectl scale deployments/kubernetes-bootcamp --replicas=2
    deployment "kubernetes-bootcamp" scaled
    

    查看是否成功

    $ kubectl get deployments
    NAME                  DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
    kubernetes-bootcamp   2         2         2            2           27m
    

    查看Pod个数

    $ kubectl get pods -o wide
    NAME                                   READY     STATUS    RESTARTS   AGE       IP      NODE
    kubernetes-bootcamp-5dbf48f7d4-dqxw7   1/1       Running   0          20m       172.18.0.5   host01
    kubernetes-bootcamp-5dbf48f7d4-v68pr   1/1       Running   0          27m       172.18.0.2   host01
    

    可以看到有两个Pod被终止了。

    相关文章

      网友评论

          本文标题:Kubernetes学习笔记——2.5 伸缩应用

          本文链接:https://www.haomeiwen.com/subject/bkdyxftx.html