摘要:前言在資源審計和計費這塊,容器和虛機有很大區(qū)別。支持諸多輸出,稱為。所以本文主要講如何為增加。實際上,基于增加并且更改,也可以做到,只不過需要裝一些包指令,結果就是鏡像變大。實際運行日志截圖由于的出色的寫入性能,運行非常穩(wěn)定。
前言
在k8s資源審計和計費這塊,容器和虛機有很大區(qū)別。相對虛機來講,容器不容易實現(xiàn)。
資源指標收集可以采用heapster,也可以用prometheus。之前文章有介紹過,prometheus的存儲的瓶頸和查詢較大數(shù)據(jù)量,容易oom這兩個問題。所以選擇了heapster。此外,heapster不僅內部實現(xiàn)了很多aggregator和calculator,做了很多聚合層的工作。而采用prometheus,你需要在查詢的時候做聚合。
heapster支持諸多metrics輸出,稱為sink。目前支持的sink如下圖:
而我比較傾向于clickhouse數(shù)據(jù)庫,關于clickhouse,其實前面的文章介紹過很多了。
所以本文主要講如何為heapster增加clickhouse sink。
看代碼,增加一種sink還是很簡單的。典型的工廠設計模式,實現(xiàn) Name,Stop,ExportData 接口方法即可。最后再提供一個初始化函數(shù),供factory調用即可。
初始化方法 NewClickhouseSink具體代碼:
config, err := clickhouse_common.BuildConfig(uri)
if err != nil {
return nil, err
}
client, err := sql.Open("clickhouse", config.DSN)
if err != nil {
glog.Errorf("connecting to clickhouse: %v", err)
return nil, err
}
sink := &clickhouseSink{
c: *config,
client: client,
conChan: make(chan struct{}, config.Concurrency),
}
glog.Infof("created clickhouse sink with options: host:%s user:%s db:%s", config.Host, config.UserName, config.Database)
return sink, nil
基本上就是獲取配置文件,初始化clickhouse 的client。
在factory.go 中 build方法中,加入剛剛實現(xiàn)的初始化函數(shù)
func (this *SinkFactory) Build(uri flags.Uri) (core.DataSink, error) {
switch uri.Key {
case "elasticsearch":
return elasticsearch.NewElasticSearchSink(&uri.Val)
case "gcm":
return gcm.CreateGCMSink(&uri.Val)
case "stackdriver":
return stackdriver.CreateStackdriverSink(&uri.Val)
case "statsd":
return statsd.NewStatsdSink(&uri.Val)
case "graphite":
return graphite.NewGraphiteSink(&uri.Val)
case "hawkular":
return hawkular.NewHawkularSink(&uri.Val)
case "influxdb":
return influxdb.CreateInfluxdbSink(&uri.Val)
case "kafka":
return kafka.NewKafkaSink(&uri.Val)
case "librato":
return librato.CreateLibratoSink(&uri.Val)
case "log":
return logsink.NewLogSink(), nil
case "metric":
return metricsink.NewMetricSink(140*time.Second, 15*time.Minute, []string{
core.MetricCpuUsageRate.MetricDescriptor.Name,
core.MetricMemoryUsage.MetricDescriptor.Name}), nil
case "opentsdb":
return opentsdb.CreateOpenTSDBSink(&uri.Val)
case "wavefront":
return wavefront.NewWavefrontSink(&uri.Val)
case "riemann":
return riemann.CreateRiemannSink(&uri.Val)
case "honeycomb":
return honeycomb.NewHoneycombSink(&uri.Val)
case "clickhouse":
return clickhouse.NewClickhouseSink(&uri.Val)
default:
return nil, fmt.Errorf("Sink not recognized: %s", uri.Key)
}
}
Name 和 Stop
func (sink *clickhouseSink) Name() string {
return "clickhouse"
}
func (tsdbSink *clickhouseSink) Stop() {
// Do nothing
}
stop 函數(shù)在heapster關閉的時候調用,執(zhí)行一些非托管資源的關閉。
ExportData這是核心的地方。
func (sink *clickhouseSink) ExportData(dataBatch *core.DataBatch) {
sink.Lock()
defer sink.Unlock()
if err := sink.client.Ping(); err != nil {
glog.Warningf("Failed to ping clickhouse: %v", err)
return
}
dataPoints := make([]point, 0, 0)
for _, metricSet := range dataBatch.MetricSets {
for metricName, metricValue := range metricSet.MetricValues {
var value float64
if core.ValueInt64 == metricValue.ValueType {
value = float64(metricValue.IntValue)
} else if core.ValueFloat == metricValue.ValueType {
value = float64(metricValue.FloatValue)
} else {
continue
}
pt := point{
name: metricName,
cluster: sink.c.ClusterName,
val: value,
ts: dataBatch.Timestamp,
}
for key, value := range metricSet.Labels {
if _, exists := clickhouseBlacklistLabels[key]; !exists {
if value != "" {
if key == "labels" {
lbs := strings.Split(value, ",")
for _, lb := range lbs {
ts := strings.Split(lb, ":")
if len(ts) == 2 && ts[0] != "" && ts[1] != "" {
pt.tags = append(pt.tags, fmt.Sprintf("%s=%s", ts[0], ts[1]))
}
}
} else {
pt.tags = append(pt.tags, fmt.Sprintf("%s=%s", key, value))
}
}
}
}
dataPoints = append(dataPoints, pt)
if len(dataPoints) >= sink.c.BatchSize {
sink.concurrentSendData(dataPoints)
dataPoints = make([]point, 0, 0)
}
}
}
if len(dataPoints) >= 0 {
sink.concurrentSendData(dataPoints)
}
sink.wg.Wait()
}
主要有以下幾個地方需要注意
數(shù)據(jù)的格式轉換。需要將heapster 中DataBatch 轉化為你目的存儲的格式。其實這塊做過pipeline 多output的人,很容易理解。
批量寫入。一般在大數(shù)據(jù)量的時候,批量寫入是一種有效的手段。
根據(jù)設置參數(shù),并發(fā)寫入目的存儲。用到了golang的協(xié)程。下面這段代碼實現(xiàn)了一個協(xié)程的發(fā)送數(shù)據(jù)。
func (sink *clickhouseSink) concurrentSendData(dataPoints []point) {
sink.wg.Add(1)
// use the channel to block until there"s less than the maximum number of concurrent requests running
sink.conChan <- struct{}{}
go func(dataPoints []point) {
sink.sendData(dataPoints)
}(dataPoints)
}
獲取配置參數(shù)
這塊在clickhouse.go中,主要做了獲取配置參數(shù)和參數(shù)初始化一些默認值,以及對配置參數(shù)校驗的工作。
dockerfile的更改原來的基礎鏡像是基于scratch
FROM scratch COPY heapster eventer / COPY ca-certificates.crt /etc/ssl/certs/ # nobody:nobody USER 65534:65534 ENTRYPOINT ["/heapster"]
由于需要改timezone的問題,改成了基于alpine。
FROM alpine RUN apk add -U tzdata RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime COPY heapster eventer / COPY ca-certificates.crt /etc/ssl/certs/ RUN chmod +x /heapster ENTRYPOINT ["/heapster"]
實際上,基于scratch增加timezone并且更改,也可以做到,只不過需要裝一些包指令,結果就是鏡像變大。與其如此,不如基于我比較熟悉的alpine實現(xiàn)。
總結fork的項目地址。實際運行日志截圖:
由于ck的出色的寫入性能,運行非常穩(wěn)定。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://hztianpu.com/yun/33066.html
摘要:前言在資源審計和計費這塊,容器和虛機有很大區(qū)別。支持諸多輸出,稱為。所以本文主要講如何為增加。實際上,基于增加并且更改,也可以做到,只不過需要裝一些包指令,結果就是鏡像變大。實際運行日志截圖由于的出色的寫入性能,運行非常穩(wěn)定。 前言 在k8s資源審計和計費這塊,容器和虛機有很大區(qū)別。相對虛機來講,容器不容易實現(xiàn)。資源指標收集可以采用heapster,也可以用prometheus。之前文...
摘要:源碼版本簡介是下的一個監(jiān)控項目,用于進行容器集群的監(jiān)控和性能分析。基本的功能及概念介紹可以回顧我之前的一篇文章監(jiān)控之介紹。在源碼分析之前我們先介紹的實現(xiàn)流程,由上圖可以看出會從各個上獲取相關的監(jiān)控信息,然后進行匯總發(fā)送給后臺數(shù)據(jù)庫。 源碼版本 heapster version: release-1.2 簡介 Heapster是Kubernetes下的一個監(jiān)控項目,用于進行容器集群的監(jiān)控...
摘要:在每個上都會運行,它會收集本機以及容器的監(jiān)控數(shù)據(jù)。使用這里主要介紹的使用,及可獲取的。參考資料文檔文檔及可用在官方文檔中都介紹的比較齊全。我們沒有采用該方式,是考慮到如果和監(jiān)控系統(tǒng)相互依賴,會導致異常之后,存在監(jiān)控系統(tǒng)無法使用的隱患。 什么是Heapster? Heapster是容器集群監(jiān)控和性能分析工具,天然的支持Kubernetes和CoreOS。Kubernetes有個出名的監(jiān)控...
摘要:還可以把數(shù)據(jù)導入到第三方工具展示或使用場景共同組成了一個流行的監(jiān)控解決方案原生的監(jiān)控圖表信息來自在中也用到了,將作為,向其獲取,作為水平擴縮容的監(jiān)控依據(jù)監(jiān)控指標流程首先從獲取集群中所有的信息。 概述 該項目將被廢棄(RETIRED) Heapster是Kubernetes旗下的一個項目,Heapster是一個收集者,并不是采集 1.Heapster可以收集Node節(jié)點上的cAdvis...
閱讀 2048·2021-11-22 15:33
閱讀 3058·2021-11-18 10:02
閱讀 2686·2021-11-08 13:16
閱讀 1704·2021-10-09 09:57
閱讀 1448·2021-09-30 09:47
閱讀 2068·2019-08-29 13:05
閱讀 3125·2019-08-29 12:46
閱讀 1066·2019-08-29 12:19