k8s應用內部日誌收集

k8s應用內部日誌收集



日誌收集架構圖
問題描述:將pod的日誌文件通過emptydir方式掛載出來,但是kubelet掛載出來的日誌文件目錄默認只有podID名,很難辨別日誌文件是那個pod,那個containers的。

解決方案:在pod創建的時候通過軟鏈接將podname,namespace,containersname,containerid等信息對應到pod的日誌目錄,從而解決上述問題。

源碼改動:

1.k8s/pkg/kubelet/dockertools/docker_manager.go
func (dm *DockerManager) runContainerInPod() 方法添加

//軟鏈接/var/lib/kubelet/pods 獲取容器的pod名,用於Elasticsearch日誌蒐集服務
// /var/lib/kubelet/pods/+podUID+/volumes/kubernetes.io~empty-dir/data/*->/var/log/containers/applog.podName.containerName.id.log
    for i := 0; i < len(pod.Spec.Volumes); i++ {
        if pod.Spec.Volumes[i].EmptyDir != nil {
            emptydirname := pod.Spec.Volumes[i].Name
            cname := container.Name
            str := "logdir" + cname
            if emptydirname == str && cname != "POD" {
                podUID := kubecontainer.GetPodUID(pod)
                containerLogFile_emptdir := path.Join("/var/lib/kubelet/pods", podUID, "volumes/kubernetes.io~empty-dir", emptydirname)
                symlinkFile_emptdir := LogSymlink_emptdir(dm.containerLogsDir, kubecontainer.GetPodFullName(pod), container.Name, id.ID)
                if err = dm.os.Symlink(containerLogFile_emptdir, symlinkFile_emptdir); err != nil {
                    glog.Errorf("Failed to create symbolic link to the application's log file of pod %q container %q: %v", format.Pod(pod), container.Name, err)
                }
            }
        }
    }
1.k8s/pkg/kubelet/dockertools/docker.go
func LogSymlink_emptdir(containerLogsDir, podFullName, containerName, dockerId string) string {
    return path.Join(containerLogsDir, fmt.Sprintf("applog.%s.%s.%s.%s", podFullName, containerName, dockerId, LogSuffix))
}

實驗效果:
在/var/log/containers下可以看到容器內應用日誌的軟鏈接,進而可以獲取到emtpdir掛載出來日誌對應的podname,containername,id



  • ES結果:
  • "_index""logstash-2016.10.19",
  • "_type""fluentd",
  • "_id""AVfcB42cEKo1rP0QdbCf",
  • "_version"1,
  • "_score"1,
  • "_source": {
    • "message""test31",
    • "pod_name""test",
    • "namespace_name""default",
    • "container_name""test",
    • "container_id""286ca6a92d26b46342860b19cbba3406f7e9d3d8df41e3497d7f09d055495424",
    • "logdir""3.log",
    • "tag":"k8s.applog.test_default.test.286ca6a92d26b46342860b19cbba3406f7e9d3d8df41e3497d7f09d055495424.log.3.log",
    • "@timestamp""2016-10-19T16:21:03+08:00"
    }

fluentd配置:

<source>  type tail
  format none
  path /var/log/containers/applog*/*
  pos_file /var/log/es-containers-app.log.pos
  time_format %Y-%m-%dT%H:%M:%S.%NZ
  tag reform.*
  read_from_head true
</source>

<match reform.**>
  type record_reformer
  renew_record false
  enable_ruby true
  tag k8s.${tag_suffix[4]}
  <record>
    pod_name ${tag_suffix[5].split('_')[0]}
    namespace_name ${tag_suffix[5].split('_')[1].split('.')[0]}
    container_name ${tag_suffix[6].split('.')[0]}
    container_id ${tag_suffix[7].split('.')[0]}
    logdir ${tag_suffix[9]}
  </record>

</match>


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章