by kowen 2018.02.27
本文翻譯自Scale Your App
學(xué)習(xí)目標(biāo)
- 使用kubectl伸縮(Scale)應(yīng)用
伸縮應(yīng)用
我們已經(jīng)能夠創(chuàng)建部署哀卫,并且通過服務(wù)將它暴露出去。但這個(gè)部署只是創(chuàng)建了一個(gè)Pod運(yùn)行應(yīng)用,當(dāng)訪問量增加的時(shí)候惑艇,我們需要擴(kuò)充服務(wù)來滿足用戶需求。
伸縮(Scaling)功能是通過修改部署副本的數(shù)量完成的。
伸縮概述
擴(kuò)展(scaling out)部署會(huì)確保新的Pod被創(chuàng)建并部署到有足夠可用資源的Node上面∠爬撸縮減(scaling in)會(huì)根據(jù)最新狀態(tài)減少Pod的個(gè)數(shù)。Kubernetes支持自動(dòng)伸縮功能瑰艘,但本教程不涉及該內(nèi)容是鬼。縮減Pod個(gè)數(shù)到0也是可能的紫新,這樣會(huì)停止該部署的所有Pod屑咳。
應(yīng)用運(yùn)行了多個(gè)實(shí)例,必須要有一種方法來給它們分發(fā)流量弊琴。服務(wù)有一個(gè)內(nèi)置的load-balancer自動(dòng)將網(wǎng)絡(luò)流量分發(fā)到各個(gè)Pod。服務(wù)會(huì)使用endpoint持續(xù)監(jiān)控Pod杖爽,保證流量只被發(fā)送到可用的Pod上敲董。
一旦你的應(yīng)用有個(gè)多個(gè)運(yùn)行實(shí)例,你就可以滾動(dòng)更新慰安,而服務(wù)不受影響腋寨。
交互式教程
伸縮一個(gè)部署
查看所有部署
$ kubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
kubernetes-bootcamp 1 1 1 1 58s
DESIRED狀態(tài)顯示的是配置的副本個(gè)數(shù)
CURRENT狀態(tài)顯示的是目前運(yùn)行的副本個(gè)數(shù)
UP-TO-DATE狀態(tài)顯示的是已更新以匹配所需(已配置)狀態(tài)的副本數(shù)量
AVAILABLE狀態(tài)顯示實(shí)際用戶可用的副本數(shù)量
下面將部署調(diào)整為4個(gè)副本。使用kubectl scale
命令化焕,后面加上部署類型萄窜、名稱和需要的實(shí)例個(gè)數(shù)。
$ 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
可以看到目前已經(jīng)有4個(gè)運(yùn)行實(shí)例了撒桨。接下來看一下pod個(gè)數(shù)是否變化:
$ 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
現(xiàn)在有4個(gè)不同IP地址的Pod查刻。所有的變化都保存在部署實(shí)踐日志里。使用以下命令查看:
$ 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
負(fù)載均衡
讓我們確認(rèn)以下服務(wù)是否有流量負(fù)載均衡凤类。查看服務(wù)暴露的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>
創(chuàng)建環(huán)境變量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訪問服務(wù)穗泵,多運(yùn)行幾次,可以看到每次訪問到不同的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
收縮
將服務(wù)縮減為2個(gè)實(shí)例副本
$ 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個(gè)數(shù)
$ 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
可以看到有兩個(gè)Pod被終止了佃延。