採集k8s掛載Nas後的日誌

該文檔主要介紹使用logtail以兩種不同的方式進行k8s掛載Nas後的日誌採集。兩種採集方式的實現原理是一樣的,都是通過將Logtail和業務容器掛載到相同的NAS上,使Logtail和業務容器的日誌數據共享,以此實現日誌採集。下面是兩種採集方式的各自特點:

1. SideCar模式。比較靈活、適合水平擴容,適用於數據量較大的場景;

2. 單獨部署Logtail的Deployment。資源消耗比較低、但靈活性以及伸縮性不強,適用於整體集羣數據量較少的場景(建議整體日誌量不超過每秒10M)。

1. Sidecar NAS採集方式

通過 鏈接 使用PV&PVC的方式配置掛載Nas的nas-pvc

  • 步驟一 創建pv
  • 步驟二 創建pvc
  • 步驟三 根據下面的yaml模板創建含有logtail的Pod,進行單個Pod的內部採集

sideCar模式實驗yaml內容:

apiVersion: batch/v1
kind: Job
metadata:
name: nginx-log-sidecar1-demo
spec:
template:
metadata:
name: nginx-log-sidecar-demo
spec:
# volumes配置
volumes:
- name: nginx-log
persistentVolumeClaim:
claimName: nas-pvc
containers:
# 主容器配置
- name: nginx-log-demo
image: registry.cn-hangzhou.aliyuncs.com/log-service/docker-log-test:latest
command: ["/bin/mock_log"]
args: ["--log-type=nginx", "--stdout=false", "--stderr=true", "--path=/var/log/nginx/access.log", "--total-count=1000000000", "--logs-per-sec=100"]
volumeMounts:
- name: nginx-log
mountPath: /var/log/nginx
# Logtail的Sidecar容器配置
- name: logtail
image: registry.cn-hangzhou.aliyuncs.com/log-service/logtail:latest
env:
# user id
- name: "ALIYUN_LOGTAIL_USER_ID"
value: "${your_aliyun_user_id}"
# user defined id
- name: "ALIYUN_LOGTAIL_USER_DEFINED_ID"
value: "${your_machine_group_user_defined_id}"
# config file path in logtails container
- name: "ALIYUN_LOGTAIL_CONFIG"
value: "/etc/ilogtail/conf/${your_region_config}/ilogtail_config.json"
# env tags config
- name: "ALIYUN_LOG_ENV_TAGS"
value: "_pod_name_|_pod_ip_|_namespace_|_node_name_|_node_ip_"
- name: "_pod_name_"
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: "_pod_ip_"
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: "_namespace_"
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: "_node_name_"
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: "_node_ip_"
valueFrom:
fieldRef:
fieldPath: status.hostIP
# 和主容器共享volume
volumeMounts:
- name: nginx-log
mountPath: /var/log/nginx
# 健康檢查
livenessProbe:
exec:
command:
- /etc/init.d/ilogtaild
- status
initialDelaySeconds: 30
periodSeconds: 30
restartPolicy: "Never"

SLS控制檯採集配置設置如下圖:

  • 日誌路徑與被採集容器的日誌所在路徑一致
  • 注意:由於NAS路徑已經掛載到了Logtail容器上,所以不需要打開docker文件的按鈕

採集上來的系統默認欄位含義:

__source__: pod容器內部IP

__tag__:__hostname__: pod名稱 __tag__:__path__: 日誌路徑 __tag__:__receive_time__: 採集時間 __tag__:__user_defined_id__: 用戶自定義標識

__tag__:_namespace_: pod所屬namaspace

__tag__:_node_ip_: pod所在Node的IP地址 __tag__:_node_name_: pod所屬Node的name __tag__:_pod_ip_: pod容器內部IP __tag__:_pod_name_: pod名稱

用戶參數:

2. 一個Logtail採集所有POD的NAS數據

注意項:副本數spec.replicas只能為1,不能更多,多了會重複採集。

首先,創建一個logtail的deployment,以下是本次使用的模板:

apiVersion: apps/v1
kind: Deployment
metadata:
name: logtail-deployment
namespace: kube-system
labels:
k8s-app: nas-logtail-collecter
spec:
replicas: 1
selector:
matchLabels:
k8s-app : nas-logtail-collecter
template:
metadata:
name: logtail-deployment
labels:
k8s-app : nas-logtail-collecter
spec:
containers:
# Logtail的配置
- name: logtail
image: registry.cn-hangzhou.aliyuncs.com/log-service/logtail:latest
env:
# aliuid
- name: "ALIYUN_LOGTAIL_USER_ID"
value: "${your_aliyun_user_id}"
# user defined id
- name: "ALIYUN_LOGTAIL_USER_DEFINED_ID"
value: "${your_machine_group_user_defined_id}"
# config file path in logtails container
- name: "ALIYUN_LOGTAIL_CONFIG"
value: "/etc/ilogtail/conf/${your_region_config}/ilogtail_config.json"
volumeMounts:
- name: nginx-log
mountPath: /var/log/nginx
# volumes配置
volumes:
- name: nginx-log
persistentVolumeClaim:
claimName: pvc-test-nginx

  • 注意:這裡的 claimName: pvc-test-nginx 以及mountPath: /var/log/nginx 是將logtail的/var/log/nginx掛載了Nas下的/nginx文件夾
  • 相關參數設置請參考方案1中的表格說明

logtail運行成功之後,可以在SLS控制檯根據模板中的ALIYUN_LOGTAIL_USER_DEFINED_ID創建對應的機器組,請參考方案1中的表格說明。

這裡新建2個Pod來測試採集是否成功,其中一個POD的模板為:

apiVersion: v1
kind: Pod
metadata:
name: "test-nginx-2"
spec:
containers:
- name: "nginx-log-demo"
image: "registry.cn-hangzhou.aliyuncs.com/log-service/docker-log-test:latest"
command: ["/bin/mock_log"]
args: ["--log-type=nginx", "--stdout=false", "--stderr=true", "--path=/var/log/nginx/access.log", "--total-count=1000000000", "--logs-per-sec=100"]
volumeMounts:
- name: "nas2"
mountPath: "/var/log/nginx"
volumes:
- name: "nas2"
flexVolume:
driver: "alicloud/nas"
options:
server: "Nas掛載地址"
path: "/nginx/test2"
vers: "4.0"

另一個Pod將 /var/log/nginx 掛載在了 /nginx/test1 目錄下;結合logtail的掛載情況,現在兩個Pod分別掛載在 /nginx/test1 和 /nginx/test2,而logtail掛載在了 /nginx 下。

最後配置logtail的採集配置

因為logtail也掛載了相同的Nas,所以logtail只需要採集自身文件夾下的日誌就可以了,這裡的是否為docker文件選項關閉。

注意:由於NAS路徑已經掛載到了Logtail容器上,所以不需要打開docker文件的按鈕

本文作者:元乙

原文鏈接

更多技術乾貨敬請關注云棲社區知乎機構號:阿里云云棲社區 - 知乎

本文為雲棲社區原創內容,未經允許不得轉載。


推薦閱讀:
相關文章