kubernetes的弹性伸缩
版权声明:原创作品,谢绝转载!否则将追究法律责任。
当你的才华还撑不起你的野心的时候,你就应该静下心来学习。
当你的能力还驾驭不了你的目标的时候,你就应该沉下心来历练。
问问自己,想要怎样的人生。
一.部署heapster监控
1.heapster概述
Heapster是容器集群监控和性能分析工具,HPA、Dashborad、Kubectl top都依赖于heapster收集的数据。
k8s早期版本需要附加插件heapster监控,但是Heapster从kubernetes 1.8以后已经被遗弃了,被metrics-server所替代,后期监控功能逐渐被Prometheus替代。
2.部署heapster监控
heapster插件用到用到以下几个组件:
heapster:
采集监控数据。其需要和Api-Server进行通信,从而获取Node节点信息。
而后基于Node节点的kubelet组件内置的cAdvisor获取监控数据。
influxdb:
负责数据存储。
grafana:
负责数据展示。
heapster组件的工作原理如下图所示。
3.将软件包上传到指定节点并编辑资源清单
批量导入镜像:
for image in `ls *.tar.gz`; do docker load -i $image; done
编写资源清单:
(1)"grafana-service.yaml"资源清单
[root@k8s101.oldzhang.com ~]# cat grafana-service.yaml
apiVersion: v1
kind: Service
metadata:
labels:
kubernetes.io/cluster-service: 'true'
kubernetes.io/name: monitoring-grafana
name: monitoring-grafana
namespace: kube-system
spec:
# In a production setup, we recommend accessing Grafana through an external Loadbalancer
# or through a public IP.
# type: LoadBalancer
ports:
- port: 80
targetPort: 3000
selector:
name: influxGrafana
[root@k8s101.oldzhang.com ~]#
(2)"heapster-controller.yaml"资源清单
[root@k8s101.oldzhang.com ~]# cat heapster-controller.yaml
apiVersion: v1
kind: ReplicationController
metadata:
labels:
k8s-app: heapster
name: heapster
version: v6
name: heapster
namespace: kube-system
spec:
replicas: 1
selector:
k8s-app: heapster
version: v6
template:
metadata:
labels:
k8s-app: heapster
version: v6
spec:
nodeName: k8s102.oldzhang.com
containers:
- name: heapster
# image: k8s101.oldzhang.com:5000/heapster:canary
image: k8s101.oldzhang.com:5000/heapster:v1
imagePullPolicy: IfNotPresent
command:
- /heapster
- --source=kubernetes:http://k8s101.oldzhang.com:8080?inClusterConfig=false
- --sink=influxdb:http://monitoring-influxdb:8086
[root@k8s101.oldzhang.com ~]#
(3)"heapster-service.yaml"资源清单
[root@k8s101.oldzhang.com ~]# cat heapster-service.yaml
apiVersion: v1
kind: Service
metadata:
labels:
kubernetes.io/cluster-service: 'true'
kubernetes.io/name: Heapster
name: heapster
namespace: kube-system
spec:
ports:
- port: 80
targetPort: 8082
selector:
k8s-app: heapster
[root@k8s101.oldzhang.com ~]#
(4)"influxdb-grafana-controller.yaml"清单
[root@k8s101.oldzhang.com ~]# cat influxdb-grafana-controller.yaml
apiVersion: v1
kind: ReplicationController
metadata:
labels:
name: influxGrafana
name: influxdb-grafana
namespace: kube-system
spec:
replicas: 1
selector:
name: influxGrafana
template:
metadata:
labels:
name: influxGrafana
spec:
nodeName: k8s102.oldzhang.com
containers:
- name: influxdb
image: k8s101.oldzhang.com:5000/heapster_influxdb:v0.5
volumeMounts:
- mountPath: /data
name: influxdb-storage
- name: grafana
image: k8s101.oldzhang.com:5000/heapster_grafana:v2.6.0
env:
- name: INFLUXDB_SERVICE_URL
value: http://monitoring-influxdb:8086
# The following env variables are required to make Grafana accessible via
# the kubernetes api-server proxy. On production clusters, we recommend
# removing these env variables, setup auth for grafana, and expose the grafana
# service using a LoadBalancer or a public IP.
- name: GF_AUTH_BASIC_ENABLED
value: "false"
- name: GF_AUTH_ANONYMOUS_ENABLED
value: "true"
- name: GF_AUTH_ANONYMOUS_ORG_ROLE
value: Admin
- name: GF_SERVER_ROOT_URL
value: /api/v1/proxy/namespaces/kube-system/services/monitoring-grafana/
volumeMounts:
- mountPath: /var
name: grafana-storage
volumes:
- name: influxdb-storage
emptyDir: {}
- name: grafana-storage
emptyDir: {}
[root@k8s101.oldzhang.com ~]#
(5)"influxdb-service.yaml"资源清单
[root@k8s101.oldzhang.com ~]# cat influxdb-service.yaml
apiVersion: v1
kind: Service
metadata:
labels: null
name: monitoring-influxdb
namespace: kube-system
spec:
ports:
- name: http
port: 8083
targetPort: 8083
- name: api
port: 8086
targetPort: 8086
selector:
name: influxGrafana
[root@k8s101.oldzhang.com ~]#
温馨提示:
如下图所示,我已经将资源清单和软件打包好了,上传到服务器直接执行即可。前提你的环境得和我的一致哟。
4.应用资源清单
[root@k8s101.oldzhang.com ~]# kubectl apply -f .
service "monitoring-grafana" created
replicationcontroller "heapster" created
service "heapster" created
replicationcontroller "influxdb-grafana" created
service "monitoring-influxdb" created
[root@k8s101.oldzhang.com ~]#
温馨提示:
imagePullPolicy的值有3个,分别为"Always, Never, IfNotPresent"。
Always:
无论本地是否有镜像,总是去仓库下载镜像。
Never:
无论本地是否有镜像,始终不去仓库更新。
IfNotPresent:
如果本地没有镜像,则会去镜像仓库下载相应的镜像名称。
详情可参考"kubectl explain pod.spec.containers.imagePullPolicy"命令输出信息哟~
二.k8s弹性伸缩实战案例
1.查看Pod信息
运行实验环境,启动之前的tomcat和mysql的Pod来进行压力测试。
我们需要添加资源限制,目的是方便进行压力测试,仅需修改"tomcat-deploy.yml"文件内容如下:
[root@k8s101.oldzhang.com ~]# cat /oldzhang/heapster-influxdb/tomcat_demo/tomcat-deploy.yml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: oldzhang-web
spec:
replicas: 1
template:
metadata:
labels:
app: oldzhang-tomcat-app
spec:
containers:
- name: myweb
image: k8s101.oldzhang.com:5000/tomcat-app:v1
ports:
- containerPort: 8080
resources:
limits:
cpu: 100m # 1m代表千分之一使用率,那么100m代表的是CPU的十分之一的使用率哟~
requests:
cpu: 100m
env:
- name: MYSQL_SERVICE_HOST
# value: '10.254.87.39' # 指定MySQL的svc资源的VIP地址即可.
value: oldzhang-mysql # 指定MySQL的svc资源的名称即可,无需指定IP地址
- name: MYSQL_SERVICE_PORT
value: '3306'
[root@k8s101.oldzhang.com ~]#
温馨提示:
为压测之前只有一个Web相关的Pod运行哟,当然还有一个mysql的Pod在运行,我并不将其计算其中。
2.命令行中创建弹性伸缩规则
kubectl autoscale deployment oldzhang-web --max=5 --min=2 --cpu-percent=5
--max:
指定最大的Pod数量,如果指定的数量越大,则弹性伸缩的资源创建的就越多,对服务器资源会进行消耗。
--minx:
指定最小的Pod数量。
--cpu-percent:
指定CPU的百分比。
温馨提示:
如下图所示,创建相应的hpa规则后。如果看到"CURRENT"的状态为"<waiting>",说明始终没有获取到监控数据,那么接下来的实验将无法做了。这可能是你的heapster部署的版本兼容性问题,请更换我给的镜像包测试即可。
3.使用ab工具进行压力测试
安装web的ab压力测试工具:
yum -y install httpd-tools
测试命令如下:
ab -n 1000000 -c 40 http://k8s102.oldzhang.com:30008/demo/
-n:
指定总共压测的次数。
-c:
每次压测发起的并发请求数。
4.压力测试截图
三.可能会遇到的报错信息
1.the server could not find the requested resource (get services http:heapster:)
报错原因:
缺少heapster监控附加组件,无法采集监控数据哟。
解决方案:
安装heapster即可,参考"部署heapster监控"上述步骤即可。
本文来自博客园,作者:kirin(麒麟),转载请注明原文链接:https://www.cnblogs.com/kirin365/articles/16137863.html