by kowen 2018.02.27
本文翻译自Scale Your App
学习目标
- 使用kubectl伸缩(Scale)应用
伸缩应用
我们已经能够创建部署,并且通过服务将它暴露出去。但这个部署只是创建了一个Pod运行应用,当访问量增加的时候,我们需要扩充服务来满足用户需求。
伸缩(Scaling)功能是通过修改部署副本的数量完成的。
伸缩概述
image.pngimage.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被终止了。
网友评论