Kubernetes Pod容量伸缩
2017-01-16
服务的伸缩性 #
伸缩性是指系统可以根据需求和成本调整自身处理能力的一种能力,构建可伸缩的服务有可能要求服务的处理能力在数天内扩大数倍,又需要在数天后将处理能力还原回去。
在Kubernetes集群中我们可以通过Replication Controller的scale机制完成服务的扩容或缩容,实现具有伸缩性的服务。
创建如下tomcat的RC:
1apiVersion: v1
2kind: ReplicationController
3metadata:
4 name: tomcat
5spec:
6 replicas: 2
7 template:
8 metadata:
9 labels:
10 app: tomcat
11 spec:
12 containers:
13 - name: tomcat
14 image: tomcat
15 ports:
16 - containerPort: 8080
17 resources:
18 requests:
19 cpu: "200m"
20 limits:
21 cpu: "500m"
创建如下tomcat的svc:
1apiVersion: v1
2kind: Service
3metadata:
4 name: tomcat
5spec:
6 type: NodePort
7 ports:
8 - port: 8080
9 nodePort: 31000
10 selector:
11 app: tomcat
kubectl sacle手动伸缩 #
Pod扩容:
1kubectl scale rc tomcat --replicas=5
2
3kubectl get pod -o wide | grep tomcat
4tomcat-8dxf1 1/1 Running 0 1m 10.244.1.3 cent2
5tomcat-j97tf 1/1 Running 0 1m 10.244.4.15 cent1
6tomcat-ng3zk 1/1 Running 0 1m 10.244.1.2 cent2
7tomcat-tjq4n 1/1 Running 0 14m 10.244.4.12 cent1
8tomcat-zg2qj 1/1 Running 0 14m 10.244.4.14 cent1
Pod缩容:
1kubectl scale rc tomcat --replicas=2
2
3kubectl get pod -o wide | grep tomcat
4tomcat-tjq4n 1/1 Running 0 18m 10.244.4.12 cent1
5tomcat-zg2qj 1/1 Running 0 18m 10.244.4.14 cent1
在Dashboard的RC页面更容易的完成Pod的伸缩。
kubectl autoscale自动伸缩 #
Kubernetes有一个HPA(Horizontal Pod Autoscaler)的东东,可以实现基于CPU使用率的Pod自动伸缩的功能。
HPA基于Master Node上的kube-controller-manager服务启动参数--horizontal-pod-autoscaler-sync-period
定义的时长(默认为30秒),周期性的检测Pod的CPU使用率(需要事先安装heapster)。使用kubeadm初始化的集群,如果需要设置--horizontal-pod-autoscaler-sync-period
可以在Master Node上的/etc/kubernetes/manifests/kube-controller-manager.json中修改。
1kubectl autoscale rc tomcat --min=1 --max=6 --cpu-percent=25
2replicationcontroller "tomcat" autoscaled
查看创建的hpa,结果发现当前的CPU使用率CURRENT显示为waiting,于是怀疑heapster中没有CPU统计数据
1kubectl get hpa tomcat
2NAME REFERENCE TARGET CURRENT MINPODS MAXPODS AGE
3tomcat ReplicationController/tomcat 25% <waiting> 1 6 13s
查看hpa的事件,kubectl describe hpa
,有这些错误信息MetricsNotAvailableYet unable to get metrics for resource cpu: no metrics returned from heapster
。因为heapster的默认的启动参数是--source=kubernetes:https://kubernetes.default
,因为使用的是域名,确定是dns解析出问题了,后来检查flannel相关Pod,修复后正常。
1kubectl get hpa tomcat
2NAME REFERENCE TARGET CURRENT MINPODS MAXPODS AGE
3tomcat ReplicationController/tomcat 25% 0% 1 6 19m
对tomcat service进行压力测试
1kubectl run -i --tty load-generator --image=busybox /bin/sh
2
3If you don't see a command prompt, try pressing enter.
4/ # while true; do wget -q -O- http://tomcat.default.svc.cluster.local:8080 > /dev/null; done
或直接在Node上运行:
1while true; do wget -q -O- http://192.168.61.100:31000 > /dev/null; done
查看hpa状态:
1kubectl get hpa tomcat
2NAME REFERENCE TARGET CURRENT MINPODS MAXPODS AGE
3tomcat ReplicationController/tomcat 25% 123% 1 6 26m
查看Pod:
1kubectl get pod
2NAME READY STATUS RESTARTS AGE
3tomcat-29gzk 1/1 Running 0 3m
4tomcat-c01bc 1/1 Running 0 3m
5tomcat-cx34q 1/1 Running 0 3m
6tomcat-fxw1l 1/1 Running 0 27m
当停止压力测试之后,过一段时间,Pod数量又会恢复到1。
另外也可以使用yml文件来定义创建,参考HorizontalPodAutoscaler v1