kubernetes日志備份解決ELK中日志丟失問(wèn)題
背景
為解決日志在ELK中偶發(fā)性丟失問(wèn)題,需要對(duì)應(yīng)用日志進(jìn)行備份,當(dāng)關(guān)鍵日志缺失后可以對(duì)原始日志進(jìn)行查詢。應(yīng)用日志除了傳ELK,在本地(docker內(nèi)部)也保存一份原始文件,路徑為/opt/logs
并且通過(guò)logback相關(guān)配置可以對(duì)日志進(jìn)行自動(dòng)歸檔。
方案
總體方案
總體方案是在主機(jī)上通過(guò)本地文件系統(tǒng)找到應(yīng)用在容器內(nèi)的日志文件,借助rsync進(jìn)行備份,再通過(guò)crontab配置定時(shí)任務(wù)就能實(shí)現(xiàn)日志的備份。
實(shí)現(xiàn)
docker本質(zhì)就是一個(gè)根文件系統(tǒng)(roots)+Linux內(nèi)核程序,docker內(nèi)部所有的文件在宿主機(jī)上都有對(duì)應(yīng)的映射,通過(guò)docker inspect
命令可以查看容器在宿主機(jī)上文件系統(tǒng)路徑
# docker inspect 84be0c7fd47b --format '{{.GraphDriver.Data.MergedDir }}' /u01/docker/overlay2/a3226f727cf8217bff0bfc8036201834260a50502c7e6b5eb0672a5305665c0e/merged
我們進(jìn)入該目錄
root@k8s-node-dev-10:/u01/docker/overlay2/a3226f727cf8217bff0bfc8036201834260a50502c7e6b5eb0672a5305665c0e/merged# ll total 156444 drwxr-xr-x 1 root root 3488 Oct 19 01:42 ./ drwx--x--- 5 root root 3488 Oct 19 01:42 ../ -rw-r--r-- 1 root root 159961293 Oct 19 01:41 app.jar drwxr-xr-x 1 root root 3488 May 15 01:13 bin/ drwxr-xr-x 1 root root 3488 Oct 19 01:42 dev/ -rwxr-xr-x 1 root root 0 Oct 19 01:42 .dockerenv* -rwxrwxrwx 1 root root 1756 May 29 00:59 entrypoint.sh* drwxr-xr-x 1 root root 3488 Oct 19 01:42 etc/ drwxr-xr-x 2 root root 3488 May 9 2019 home/ drwxr-xr-x 1 root root 3488 May 15 01:15 lib/ drwxr-xr-x 2 root root 3488 May 15 01:13 lib64/ drwxr-xr-x 5 root root 3488 May 9 2019 media/ drwxr-xr-x 2 root root 3488 May 9 2019 mnt/ drwxr-xr-x 1 root root 3488 Oct 19 01:42 opt/ dr-xr-xr-x 2 root root 3488 May 9 2019 proc/ drwx------ 1 root root 3488 Oct 30 06:49 root/ drwxr-xr-x 1 root root 3488 Oct 19 01:42 run/ drwxr-xr-x 1 root root 3488 May 15 01:13 sbin/ drwxr-xr-x 2 root root 3488 May 9 2019 srv/ drwxr-xr-x 2 root root 3488 May 9 2019 sys/ drwxrwxrwt 2 root root 3488 May 9 2019 tmp/ drwxr-xr-x 1 root root 3488 Oct 19 01:42 usr/ drwxr-xr-x 1 root root 3488 May 9 2019 var/
可以發(fā)現(xiàn)就是容器內(nèi)的Linux文件系統(tǒng),我們可以通過(guò)以下腳本,顯示出所有容器在主機(jī)上的文件系統(tǒng)路徑
for container in $(docker ps --all --quiet --format '{{ .Names }}'); do log_path=$(docker inspect $container --format '{{.GraphDriver.Data.MergedDir }}') echo $log_path done
由于日志保存在容器內(nèi)部的/opt/logs
目錄下,對(duì)應(yīng)主機(jī)路徑就是log_path/opt/logs
目錄,找到文件路徑后,我們需要知道該文件對(duì)應(yīng)的服務(wù)名稱,從路徑上我們只能得到一個(gè)類似a3226f727cf8217bff0bfc8036201834260a50502c7e6b5eb0672a5305665c0e
的ID,那怎么根據(jù)這個(gè)ID獲取到服務(wù)名稱呢,kubernetes在啟動(dòng)應(yīng)用docker容器時(shí),會(huì)給容器打上標(biāo)簽,其中就包含了應(yīng)用名稱,我們通過(guò)inspect命令就可以查看
# docker inspect 84be0c7fd47b .... "Labels": { "annotation.io.kubernetes.container.hash": "f44b328d", "annotation.io.kubernetes.container.ports": "[{\"name\":\"8080tcp2\",\"containerPort\":8080,\"protocol\":\"TCP\"}]", "annotation.io.kubernetes.container.restartCount": "0", "annotation.io.kubernetes.container.terminationMessagePath": "/dev/termination-log", "annotation.io.kubernetes.container.terminationMessagePolicy": "File", "annotation.io.kubernetes.pod.terminationGracePeriod": "30", "io.kubernetes.container.logpath": "/var/log/pods/xinyou-application_xinyou-service-message-7745fd9699-drkzg_26e825a2-8f5e-4b5b-aed1-758139fc019c/xinyou-service-message/0.log", "io.kubernetes.container.name": "xinyou-message-service", "io.kubernetes.docker.type": "container", "io.kubernetes.pod.name": "xinyou-message-service-7745fd9699-drkzg", "io.kubernetes.pod.namespace": "xinyou-application", "io.kubernetes.pod.uid": "26e825a2-8f5e-4b5b-aed1-758139fc019c", "io.kubernetes.sandbox.id": "7bc9954a02c7e43a1a21b8cc47e09f86ada8f6e8584c49150c67d77dc13b6832" } ....
其中io.kubernetes.container.name
就是服務(wù)名稱,io.kubernetes.pod.name
是pod名稱,io.kubernetes.container.name
就是命名空間,所以拿到ID后我們可以通過(guò)inspect獲取到服務(wù) 名稱,有了原始文件路徑,服務(wù)名稱后,就可以寫(xiě)備份腳本
#!/bin/bash for container in $(docker ps --all --quiet --format '{{ .Names }}'); do log_path=$(docker inspect $container --format '{{.GraphDriver.Data.MergedDir }}') log_path=${log_path}/opt/logs/ service_name=$(docker inspect $container --format '{{ index .Config.Labels "io.kubernetes.container.name" }}') pod_name=$(docker inspect $container --format '{{ index .Config.Labels "io.kubernetes.pod.name" }}') target_path=/u01/logbackup/$service_name/$pod_name if [ -d "$log_path" ]; then echo "sync $service_name/$pod_name from $log_path to $target_path" mkdir -p $target_path rsync -av "$log_path" "$target_path" >log_backup.log fi done
解釋下腳本內(nèi)容
通過(guò)
docker ps --all
獲取到所有容器列表,因?yàn)榧恿?code>--all命令,所以也包含停止運(yùn)行的容器,這里為什么要包含停止運(yùn)行的容器,原因是腳本執(zhí)行是周期性的,假設(shè)在執(zhí)行周期內(nèi)容器停止運(yùn)行了,那么就會(huì)失去這段時(shí)間的日志,所以就算是停止運(yùn)行的容器也要同步日志。log_path就是日志在主機(jī)上的路徑
service_name就是服務(wù)名稱,讀取的是io.kubernetes.container.name這個(gè)標(biāo)簽
target_path備份目標(biāo)路徑,這里路徑加上了pod_name,原因是一個(gè)主機(jī)上可能運(yùn)行服務(wù)的多個(gè)副本,如果不加上pod_name,有可能兩個(gè)副本的日志會(huì)相互覆蓋,因?yàn)槿罩久Q是一樣的。
通過(guò)rsync命令進(jìn)行同步,rsync命令可以實(shí)現(xiàn)增量同步,速度和效率都遠(yuǎn)遠(yuǎn)比cp命令高
腳本只對(duì)包含
opt/logs
的容器進(jìn)行日志備份,如果有額外情況需要更改腳本
配置crontab就可以定時(shí)執(zhí)行腳本進(jìn)行備份任務(wù)
* * * * * /u01/scripts/log_backup.sh
這里是一分鐘執(zhí)行一次,這個(gè)頻率其實(shí)可以更低,因?yàn)槲覀冇袑⑼V沟娜萜靼M(jìn)去,所以頻率低一些也不會(huì)有日志丟失。
以下是日志同步后的日志備份目錄文件夾分布情況:
root@k8s-node-dev-10:/u01/logbackup# tree -d . ├── xinyou-mes │ └── xinyou-mes-6c5cd57447-qgk29 ├── xinyou-gateway │ └── xinyou-gateway-67bff75986-qsgsq ├── xinyou-bbc-service │ └── xinyou-bbc-service-7455c4dc86-kj6tp ├── xinyou-ddr-service │ └── xinyou-ddr-service-c774bbbb7-mh7fk ├── xinyou-iam-service │ └── xinyou-iam-service-59b844df47-5h5gs ├── xinyou-review-service │ └── xinyou-review-service-856c5f545c-lxmz6 ├── xinyou-sass-oa │ └── xinyou-sass-oa-77845c55bb-jjmf2 ├── xinyou-service-message │ └── xinyou-service-message-7745fd9699-drkzg └── xinyou-tables-service └── xinyou-tables-service-7fd66d4c95-7pcst
以上就是kubernetes日志備份方案細(xì)節(jié)探究的詳細(xì)內(nèi)容,更多關(guān)于kubernetes日志備份的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Rainbond上部署API?Gateway?Kong及環(huán)境配置教程
這篇文章主要為大家介紹了Rainbond上部署API?Gateway?Kong及環(huán)境配置教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04云原生技術(shù)kubernetes之volumes容器的使用
這篇文章主要為大家介紹了云原生技術(shù)kubernetes之volumes容器使用方式,?有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03Kubernetes調(diào)度管理優(yōu)先級(jí)和搶占機(jī)制詳解
這篇文章主要為大家介紹了Kubernetes調(diào)度管理優(yōu)先級(jí)和搶占機(jī)制詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11某集團(tuán)任意文件下載到虛擬主機(jī)getshell的方法
這篇文章主要介紹了某集團(tuán)任意文件下載到虛擬主機(jī)getshell的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-01-01K8S?實(shí)用工具之合并多個(gè)kubeconfig實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了K8S?實(shí)用工具之合并多個(gè)kubeconfig實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03Kubernetes應(yīng)用配置管理創(chuàng)建使用詳解
這篇文章主要為大家介紹了Kubernetes應(yīng)用配置管理創(chuàng)建使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11