美文网首页
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