1. 程式人生 > >騰訊雲容器服務大容量日誌的處理記錄

騰訊雲容器服務大容量日誌的處理記錄

win 同事 size 匹配 持久化存儲 openssl stdout tps 個人開發者

一、項目背景

1.1 項目痛點

在目前小程序為主的大背景下,有客戶大部分業務在騰訊雲,使用的大部分為容器服務,在大規模的使用容器下,需要對容器內業務的日誌采集及分析,在騰訊雲對應容器服務的日誌提供了兩種消費方式:Kafka、日誌服務CLS。
但是對應業務線眾多,在騰訊雲容器服務只能指定十條日誌收集規則,完全滿足不了大規模日誌收集場景,客戶已經指定分業務兩種消費方式均使用了起來,Kafka&日誌服務,但是在Ckafka查看日誌發現最高每分鐘20W條消息,盡管已經最大程度的提升了消費端的能力(消費端使用Logstash,然後重新將數據導入ELK集群中使用),但是在每分鐘20w條的大數據下,查看CKafka內部有大量未消費條目存在,長此以往,CKafka性能及存量均無法滿足,且和騰訊咨詢發現目前該地域Ckafka已經售完,需要一周時間來底層擴容。

  • 客戶痛點如下圖:(來自同事的ppt)
    技術分享圖片

1.2 名稱解釋:

  • 容器服務:騰訊雲容器服務(Tencent Kubernetes Engine,TKE)基於原生 kubernetes 提供以容器為核心的、高度可擴展的高性能容器管理服務。騰訊雲容器服務完全兼容原生 kubernetes API ,擴展了騰訊雲的 CBS、CLB 等 kubernetes 插件,為容器化的應用提供高效部署、資源調度、服務發現和動態伸縮等一系列完整功能,解決用戶開發、測試及運維過程的環境一致性問題,提高了大規模容器集群管理的便捷性,幫助用戶降低成本,提高效率。容器服務提供免費使用,涉及的其他雲產品另外單獨計費。詳細可參考:騰訊雲容器服務
  • 對象存儲:對象存儲服務(Cloud Object Storage,COS)是面向企業和個人開發者提供的高可用,高穩定,強安全的雲端存儲服務。您可以將任意數量和形式的非結構化數據放入 COS,並在其中實現數據的管理和處理。COS 支持標準的 Restful API 接口,您可以快速上手使用,按實際使用量計費,無最低使用限制。詳細可參考:騰訊雲對象存儲
  • 日誌服務:日誌服務(Cloud Log Service)提供一站式的日誌數據解決方案。您無需關註擴縮容等資源問題,五分鐘快速便捷接入,即可享受從日誌采集、日誌存儲到日誌內容搜索、統計分析等全方位穩定可靠的日誌服務。幫助您輕松解決業務問題定位,指標監控、安全審計等日誌問題。大大降低日誌運維門檻。詳細可參考騰訊雲日誌服務
  • 消息隊列CKafka:CKafka(Cloud Kafka)是一個分布式的、高吞吐量、高可擴展性的消息系統,100% 兼容開源 Kafka API(0.9版本)。 Ckafka 基於發布/訂閱模式,通過消息解耦,使生產者和消費者異步交互,無需彼此等待。 Ckafka 具有數據壓縮、同時支持離線和實時數據處理等優點,適用於日誌壓縮收集、監控數據聚合等場景。騰訊雲消息隊列CKafka

二、問題分析

針對大量日誌在Ckafka未消費,且騰訊無法開出Ckafka的背景下,先為客戶提出三種解決方案:

  • 容器日誌源選擇指定容器,針對項目選擇指定服務下的容器。然後消費端選擇到ckafka下不同的topic,這樣來分攤kafka壓力。(一個規則只能指定一個topic,容器太多,10條規則無法滿足)
  • 增加ckafka的消費能力(例如多增加幾個logstash),kafka只是消息隊列,消息得不到消費kafka就壓力大。(根據和客戶商討,目前logstash的consumer_threads已經設置為topic的最大分區數,如果要增加logstash的實例,那麽需要增加topic的partitions數,也無法滿足)
  • 將容器日誌消費端選擇為cls的topic,然後在cls裏將日誌投遞存放到cos,後面再從cos裏取出來進行消費。(待確認,如果可以將數據通過cls存放到cos,後期在利用logstash來進行消費,那就可以解決此問題)

三、問題解決

3.1 容器服務配置

先進行簡單容器服務創建測試應用

  • 測試的容器測試服務集群
    技術分享圖片
  • 新建服務
    選擇namespace,及服務所在的地域
    技術分享圖片
    進行部署設置,可以選擇公共容器,也可現在自定義容器,配置容器網絡及邏輯卷等信息,最後配置端口映射。
    技術分享圖片
  • 創建好後就可以通過公網負載均衡進行容器訪問
    技術分享圖片
    技術分享圖片
  • 新建日誌收集規則
    技術分享圖片
  • 指定消費端
    技術分享圖片

    3.2 日誌服務投遞配置

  • 創建日誌集管理
    技術分享圖片
  • 創建日誌投遞規則,將cls的內容投遞到cos內
    在日誌投遞中,可以開啟高級過濾功能,利用此功能可以將不同日誌投遞到不同bucket,或同一個bucket的不同目錄下,來進行日誌區分,以便後期消費。

例如日誌格式:

__CONTENT__: {"docker":{"container_id":"894905ad526dd90f548bf35ece4b81f4d68359722d7ec719f3b81628da32fe20"},"kubernetes":{"container_name":"nginx","host":"172.16.9.11","labels":{"pod-template-hash":"1074266372","qcloud-app":"nginx"},"log":"default_nginx","master_url":"https://192.168.255.1:443","namespace_name":"default","pod_id":"5d4ae59f-9f6c-11e8-89c8-5254000e53ff","pod_name":"nginx-54c86bb7c6-wvm6z"},"log":"192.168.1.1 - - [25/Aug/2018:13:17:14 +0000] \"GET / HTTP/1.1\" 200 612 \"-\" \"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.89 Safari/537.36\" \"-\"\n","stream":"stdout","time":"2018-08-25T13:17:14.310411833Z"}
根據container_name來進行正則日誌過濾:.*\"container_name\":\"([^\"]+)\".* 

註意:這裏根據騰訊雲官網給的僅有的一個實例進行測試無法通過,經過多次測試均為已經投遞但是數據沒有從cls到cos內部,經過後面自己測試結果如下:

  • key必須制定為索引__CONTENT__
  • 正則表達式:可以根據具體的容器分類來做,這裏建議使用container_name便於區分
  • value為日誌經過正則匹配到的內容,和value的相同及命中此條日誌,從而將此條日誌進行按照規則投遞到cos內。

技術分享圖片

技術分享圖片
技術分享圖片

  • 查看COS內的日誌投遞信息

技術分享圖片
技術分享圖片

3.3 消費終端CVM配置

  • 安裝COSFS工具

詳細操作方法可參考:COSFS操作

sudo yum install automake gcc-c++ git libcurl-devel libxml2-devel fuse-devel make openssl-devel
git clone https://github.com/tencentyun/cosfs /usr/cosfs
cd /usr/cosfs
./autogen.sh
./configure
make
sudo make install

寫入配置文件:

echo <bucketname>:<SecretId>:<SecretKey> > /etc/passwd-cosfs
chmod 640 /etc/passwd-cosfs
  • 掛載日常存儲的COS
    cosfs your-bucketname your-mount-point -ourl=cos-domain-name -odbglevel=info

    your-bucketname 需要替換為用戶真實的信息;
    your-mount-point 替換為本地需要掛載的目錄(如 /mnt);
    cos-domain-name 為存儲桶對應的訪問域名,形式為 http://cos.<Region>.myqcloud.com (適用於XML API),其中 為地域簡稱,如: ap-guangzhou 、 eu-frankfurt 等.
    查看文件

技術分享圖片

  • 安裝ELK
    ELK安裝可參考
    ELK自動安裝腳本
    Centos7_ELK5.4.1配置部署
    在這裏使用logstash的input-file插件,將path制定到本地掛載的cos上
input {
    file {
        path => "/cosdata/access-log2018/08/*"
    }
    }
output {
    elasticsearch {
        hosts => "127.0.0.1:9200"
    }
    stdout { codec => rubydebug }
}

3.4 進行簡單消費測試

  • 查看ES中日誌數據
    通過訪問es的9200端口可以
    技術分享圖片
  • 利用Kibana查看日誌
    技術分享圖片

四、反思總結

  • 我這在客戶大量的數據下,騰訊的文檔寫的真的不是很全,在cls日誌投遞功能的高級過濾段,文檔完全沒介紹其中的正則改怎麽寫,自己嘗試發現不行後,工單及VIP客戶支持,大概兩天才內部測試完成後給出了模板,希望後續可以完善一些產品的細節文檔,文檔完善才能使用戶更好的使用產品。其次希望騰訊能對每個地域的線下IDC機房的資源進行更改的前期規劃和後期擴容管理,以免像類似這種,需要等待一周時間才能某地域的某種雲產品,這對於互聯網公司的方案及業務有很大的影響。
  • 通過此次方式,是使用cos將數據持久化存儲來減輕CKafka的壓力,分業務適合用對日誌數據不是非常及時的後期分析及處理消費場景。

騰訊雲容器服務大容量日誌的處理記錄