006、kubernetes的弹性伸缩
本文最后更新于 321 天前,其中的信息可能已经过时,如有错误请发送邮件到wuxianglongblog@163.com

kubernetes的弹性伸缩

一.部署heapster监控

1.heapster概述

Heapster是容器集群监控和性能分析工具,HPA、Dashborad、Kubectl top都依赖于heapster收集的数据。

k8s早期版本需要附加插件heapster监控,但是Heapster从kubernetes 1.8以后已经被遗弃了,被metrics-server所替代,后期监控功能逐渐被Prometheus替代。

2.部署heapster监控

image-20210726230847266

如上图所示,kubelet是集成了cAdvisor组件的,因为其监控了4194端口。

heapster插件用到用到以下几个组件:
    heapster:
        采集监控数据。其需要和Api-Server进行通信,从而获取Node节点信息。
        而后基于Node节点的kubelet组件内置的cAdvisor获取监控数据。
    influxdb:
        负责数据存储。
    grafana:
        负责数据展示。

heapster组件的工作原理如下图所示。

image-20210726231035709

3.将软件包上传到指定节点并编辑资源清单

批量导入镜像:
    for image in `ls *.tar.gz`; do docker load -i $image; done

编写资源清单:
(1)"grafana-service.yaml"资源清单
[root@k8s101.oldboyedu.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.oldboyedu.com ~]# 

(2)"heapster-controller.yaml"资源清单
[root@k8s101.oldboyedu.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.oldboyedu.com
      containers:
      - name: heapster
        # image: k8s101.oldboyedu.com:5000/heapster:canary
        image: k8s101.oldboyedu.com:5000/heapster:v1
        imagePullPolicy: IfNotPresent
        command:
        - /heapster
        - --source=kubernetes:http://k8s101.oldboyedu.com:8080?inClusterConfig=false
        - --sink=influxdb:http://monitoring-influxdb:8086
[root@k8s101.oldboyedu.com ~]# 

(3)"heapster-service.yaml"资源清单
[root@k8s101.oldboyedu.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.oldboyedu.com ~]# 

(4)"influxdb-grafana-controller.yaml"清单
[root@k8s101.oldboyedu.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.oldboyedu.com
      containers:
      - name: influxdb
        image: k8s101.oldboyedu.com:5000/heapster_influxdb:v0.5
        volumeMounts:
        - mountPath: /data
          name: influxdb-storage
      - name: grafana
        image: k8s101.oldboyedu.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.oldboyedu.com ~]# 

(5)"influxdb-service.yaml"资源清单
[root@k8s101.oldboyedu.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.oldboyedu.com ~]# 

温馨提示:
    如下图所示,我已经将资源清单和软件打包好了,上传到服务器直接执行即可。前提你的环境得和我的一致哟。

image-20210727001307699

4.应用资源清单

[root@k8s101.oldboyedu.com ~]# kubectl apply -f .
service "monitoring-grafana" created
replicationcontroller "heapster" created
service "heapster" created
replicationcontroller "influxdb-grafana" created
service "monitoring-influxdb" created
[root@k8s101.oldboyedu.com ~]# 

温馨提示:
    imagePullPolicy的值有3个,分别为"Always, Never, IfNotPresent"。
        Always:
            无论本地是否有镜像,总是去仓库下载镜像。
        Never:
            无论本地是否有镜像,始终不去仓库更新。
        IfNotPresent:
            如果本地没有镜像,则会去镜像仓库下载相应的镜像名称。
    详情可参考"kubectl explain pod.spec.containers.imagePullPolicy"命令输出信息哟~

image-20210726235621973

5.重启apiServer等待10s左右即可

systemctl restart kube-apiserver.service 

二.k8s弹性伸缩实战案例

1.查看Pod信息

运行实验环境,启动之前的tomcat和mysql的Pod来进行压力测试。

我们需要添加资源限制,目的是方便进行压力测试,仅需修改"tomcat-deploy.yml"文件内容如下:
[root@k8s101.oldboyedu.com ~]# cat /oldboyedu/heapster-influxdb/tomcat_demo/tomcat-deploy.yml 
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: oldboyedu-web
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: oldboyedu-tomcat-app
    spec:
      containers:
        - name: myweb
          image: k8s101.oldboyedu.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: oldboyedu-mysql  # 指定MySQL的svc资源的名称即可,无需指定IP地址
          - name: MYSQL_SERVICE_PORT
            value: '3306'
[root@k8s101.oldboyedu.com ~]# 

温馨提示:
    为压测之前只有一个Web相关的Pod运行哟,当然还有一个mysql的Pod在运行,我并不将其计算其中。

image-20210728210032071

2.命令行中创建弹性伸缩规则

kubectl autoscale deployment oldboyedu-web --max=5 --min=2 --cpu-percent=5
    --max:
        指定最大的Pod数量,如果指定的数量越大,则弹性伸缩的资源创建的就越多,对服务器资源会进行消耗。

    --minx:
        指定最小的Pod数量。

    --cpu-percent:
        指定CPU的百分比。

温馨提示:
    如下图所示,创建相应的hpa规则后。如果看到"CURRENT"的状态为"<waiting>",说明始终没有获取到监控数据,那么接下来的实验将无法做了。这可能是你的heapster部署的版本兼容性问题,请更换我给的镜像包测试即可。

image-20210728211412269

3.使用ab工具进行压力测试

安装web的ab压力测试工具:
    yum -y install httpd-tools

测试命令如下: 
    ab -n 1000000 -c 40  http://k8s102.oldboyedu.com:30008/demo/
        -n: 
            指定总共压测的次数。
        -c:
            每次压测发起的并发请求数。

image-20210815160641393

4.压力测试截图

image-20210815160802088

image-20210815161632877

如上图所示,当我们的压力测试时,随着web节点压力越大,其使用的CPU白分别就越高,与触发咱们的hpa规则,从而自动创建POD。

如下图所示,随着我们的压力测试结束,意味着并不会产生过多的压力,通常情况下会自动缩容,但必须满足MINPODS的数量条件哟~

image-20210815161858170

三.可能会遇到的报错信息

1.the server could not find the requested resource (get services http:heapster:)

报错原因:
    缺少heapster监控附加组件,无法采集监控数据哟。

解决方案:
    安装heapster即可,参考"部署heapster监控"上述步骤即可。

image-20210815120612288

谨此笔记,记录过往。凭君阅览,如能收益,莫大奢望。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇