workload-classifier

command module
v0.0.0-...-0c34cbd Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 3, 2020 License: Apache-2.0 Imports: 1 Imported by: 0

README

Kubernetes负载分类服务器

下载与构建

需事先准备好go环境

mkdir -p $GOPATH/src/github.com/packagewjx/
cd $GOPATH/src/github.com/packagewjx
git clone git@github.com:packagewjx/workload-classifier.git
go install github.com/packagewjx/workload-classifier

使用方法

运行workload-classifier --help可以获取帮助信息。

$ ./workload-classifier --help                                                 
负载分类器,拥有对alibaba_trace v2018进行处理,以及获取集群最新数据并更新分类的功能

Usage:
  workload-classifier [command]

Available Commands:
  cluster     读取数据文件聚类计算,并输出结果到新文件中
  help        Help about any command
  preprocess  预处理相关指令
  server      负载分类服务器

Flags:
      --config string   config file (default is $HOME/.workload-classifier.yaml)
  -h, --help            help for workload-classifier
  -t, --toggle          Help message for toggle

Use "workload-classifier [command] --help" for more information about a command.
cluster命令
$ ./workload-classifier cluster --help
读取数据文件聚类计算,并输出结果到新文件中

Usage:
  workload-classifier cluster dataFile outputFile numClass [flags]

Flags:
  -a, --algorithm string      指定使用的算法。默认为kmeans,可选值:kmeans (default "kmeans")
  -f, --dataFormat string     数据文件格式
  -h, --help                  help for cluster
      --kMeansRound int       K-Means算法执行的轮次 (default 30)
  -p, --outputPrecision int   输出文件数据精度,默认为2 (default 2)
  -r, --removeColumn ints     需要移除的列号,从0开始计算。使用此字段忽略掉不是数字的列

Global Flags:
      --config string   config file (default is $HOME/.workload-classifier.yaml)

cluster命令是手动聚类使用的命令。设计上本命令能用于任意类型的输入,而不仅仅是负载的特征。本命令支持读取csv类型的文件,计算numClass个聚类后,输出到outputFile中。

preprocess命令
$ ./workload-classifier preprocess --help
预处理相关指令

Usage:
  workload-classifier preprocess [command]

Available Commands:
  convert     将container_usage格式的文件转换为特征,并输出到文件中
  impute      填充NaN数据
  normalize   将转换后的数据标准化
  split       根据AppDU将container_usage.csv分割成小文件

Flags:
  -h, --help   help for preprocess

Global Flags:
      --config string   config file (default is $HOME/.workload-classifier.yaml)

Use "workload-classifier preprocess [command] --help" for more information about a command.

本命令用于预处理从其他数据源获取的文件。目前支持的数据源是阿里巴巴v2018数据源。

split指令用于将原本长度为100多GB的大文件,依照appdu属性,分割成一个个小文件,便于在小内存的服务器上进行处理。

convert指令用于将原始数据转换为本系统所使用的特征。

impute是数据填充指令。目前采用线性方式填充数据,以数据的两端为端点。因为数据集中不可避免的会出现缺失的数据,因为应用不再运行或者出错结束,或者应用重启等情况。

normalize则是用于将数据标准化。因为负载的运行特征均不太相同,使用的资源数量都不同,我们更加关注一个负载的资源使用变化而不是具体使用多少资源,因此需要将所有的数据进行标准化之后再聚类。

server命令
$ ./workload-classifier server --help    
本服务器将从Kubernetes的metrics server中每隔一段时间(通过interval指定)获取一次监控数据,并保存记录。
监控数据仅保留最近一段时间(通过duration设置)。服务器每天定时(通过re-cluster-time设置)聚类,更新分类数据,
以确保数据反映近期的真实情况。用户可以通过本服务器提供的接口获取应用属于哪个类别的数据。

Usage:
  workload-classifier server [flags]

Flags:
  -f, --center-file string         初始中心文件。若不为空,则启动时将会读取此文件并作为各个类别的数据,此过程将删除旧有数据。若为空,则使用原类数据
  -c, --class uint                 聚类类别数量 (default 20)
  -d, --duration duration          保存数据的时间,至少为1天 (default 168h0m0s)
  -h, --help                       help for server
  -i, --interval duration          获取监控数据的间隔,至少为15s (default 1m0s)
      --mysql-host string          Mysql服务器主机端口,格式为:host:port。若为空,则读取环境变量MYSQL_SERVICE_HOST与MYSQL_SERVICE_PORT取得
  -p, --port uint16                服务端口号 (default 2000)
  -t, --re-cluster-time duration   每天定时跑聚类算法的时间,值应该小于24小时 (default 1h0m0s)
  -r, --round uint                 聚类迭代次数 (default 30)

Global Flags:
      --config string   config file (default is $HOME/.workload-classifier.yaml)

API

/namespaces/${名称空间}/appcharacteristics/${应用名称}

用于获取一个应用程序的一天内的运行特征。

应用名称说明:应用名称对应的是Kubernetes内的ReplicaSetDaemonSetStatefulSet的数据,而不是Pod的名称,因为Pod是单独部署的,每个Pod都有独一无二的名称,获取一个Pod的运行特征对部署新的Pod无参考意义,因为名称不同,无法得知是否是同一个应用。因此使用Pod的Owner,也就是上述三者的名称作为应用名称。

返回值定义在pkg/server/types.go文件中,类型如下:

type AppCharacteristics struct {
	AppName `json:",inline"`

	SectionData []*core.SectionData `json:"sectionData"`
}

type AppName struct {
	Name      string `gorm:"uniqueIndex:app;type:VARCHAR(256)"`
	Namespace string `gorm:"uniqueIndex:app;type:VARCHAR(256)"`
}

SectionData定义在pkg/core/types.go文件中,如下:

type SectionData struct {
	CpuAvg float32 `json:"cpuAvg"`
	CpuMax float32 `json:"cpuMax"`
	CpuMin float32 `json:"cpuMin"`
	CpuP50 float32 `json:"cpuP50"`
	CpuP90 float32 `json:"cpuP90"`
	CpuP99 float32 `json:"cpuP99"`
	MemAvg float32 `json:"memAvg"`
	MemMax float32 `json:"memMax"`
	MemMin float32 `json:"memMin"`
	MemP50 float32 `json:"memP50"`
	MemP90 float32 `json:"memP90"`
	MemP99 float32 `json:"memP99"`
}
/recluster

本API不带任何参数,指定服务器进行重新聚类的操作。

/healthz

本API不带任何参数,用于确认服务器是否正常在运行。

Docker容器构建

Makefile中定义了用于构建Docker镜像的命令。主要目标的用途如下

  • docker-scheduler:构建支持负载感知的调度算法插件的Kubernetes调度器。
  • docker-workload-classifier:构建负载分类服务器镜像。
  • docker-push:将构建好的镜像推送到docker hub中

Kubernetes部署

deploy.yaml中是将本负载分类服务器部署到Kubernetes上的命令。在可用的Kubernetes集群中,使用如下命令使用

kubectl apply -f deploy.yaml

命令运行完毕后,在所有镜像拉取下来并运行之后,负载分类服务器将运行,使用下面命令查询其情况

kubectl get deployments -n workload-classifier

Documentation

Overview

Copyright © 2020 NAME HERE <EMAIL ADDRESS>

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL