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监控"上述步骤即可。
posted @ 2022-04-12 22:10  kirin(麒麟)  阅读(81)  评论(0编辑  收藏  举报
Δ