服务的伸缩性

伸缩性是指系统可以根据需求和成本调整自身处理能力的一种能力,构建可伸缩的服务有可能要求服务的处理能力在数天内扩大数倍,又需要在数天后将处理能力还原回去。

在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

参考