s3cmd 拉取日志

327 阅读3分钟

背景

项目刚上云(使用 k8s、Docker 那一套),正式环境已经跑起来了。当然就免不了出错,出错就得找日志、看日志。最开始只是查看问题,在单独的 Pod 中,进去使用 vi 那一套还能勉强查看。直到有一天,领导要求下载最近三天的日志文件。咋也不知道非得下载下来干嘛,领导叫你干就干。

由于 dashboard 页面提供的功能不足,日志文件可以下载,但是只能下载当天的。所以只能找个折中的办法来下载。这时请教集团运维那边的人,说是 s3cmd 可以。得了,学习,搞上吧!

s3cmd

介绍

s3cmd 是一个免费的命令行工具客户端,用于在 Amazon S3 和其他使用 S3 协议的云存储服务提供商上传、下载等功能。

思路

(前提:我们没有主机,只有这些分配好的资源,所以我们不能使用 kubectl 命令啥的,只能单独操作自己的 Pod)

思路:有一个 s3cmd 服务,然后将 Pod 里面的日志文件上传到 COS 云存储中,然后从 COS 下载。

将 s3cmd 打成镜像

vim /root/.s3cfg  配置如下四个参数即可
access_key = xxxx    //云存储的 access_key
secret_key = xxxxxxxx  //云存储的 secret_key
host_base = 你的云存储ip
host_bucket = %(bucket)s.你的云存储ip

将这些配置文件修改,然后把整个 s3cmd 打成一个 docker 服务。上传到镜像仓库备用。

cke 配置文件

主要的地方:

  • nodeName :一定要换成业务服务所在的 node 节点
  • volumes.hostPath.path 和业务的路径一致;volumeMounts.mountPath 和业务的路径一致

然后应用下面的配置文件,即可启动一个服务。此时进到服务控制台,比如业务Pod配置: volumes.hostPath.path=/var/log,那么此时进去到 s3cmd 下的 /var/log 就能看见和业务 Pod 一样的内容,即是那些日志文件,然后使用 s3cmd 命令将文件上传到 COS。再从 COS 下载即可

apiVersion: apps/v1
kind: Deployment
metadata:
  name: s3cmd
  namespace: xxx
  labels:
    app: s3cmd
spec:
  replicas: 1
  selector:
    matchLabels:
      app: s3cmd
  template:
    metadata:
      labels:
        app: s3cmd
    spec:
    # 这里你换成你们 k8s node 节点
      nodeName: 192.168.0.1
      volumes:
          - name: log-volume
            hostPath:
              path: /xx/xx/xx/xx/
              type: ''
      containers:
      - name: s3cmd
        image: xxxxx/s3cmdtool:latest
        command: ["/bin/sh"]
        args: ["-c", "while true; do echo i am alive!; sleep 30;done"]
        volumeMounts:
            - name: log-volume
              mountPath: xxxxx/xx
			  

简单命令

这里只举例了一个命令行的用法:就是工作中需要的,把业务 Pod 中的文件上传到 COS,当然还有其他很多用法

s3cmd put test.bin s3://cos/file.dump

将 test.bin 上传到 cos 这个桶下,并重命名为 file.dump

总结

  1. 文章只是提供了一些思路,比如 将 s3cmd 打成 Docker ,然后用配置文件生产 K8s 服务等都需要学习。
  2. s3cmd 工具的了解和学习,还有其他很多命令等着学习
  3. 如果不能直接达成目得,可以请教他人,并折中促成
  4. 还是应该上一个 ELK(Elasticsearch、Logstash、Kibana),因为发布到生成环境是三个节点,目前不支持日志文件挂在到同一个目录下。