快速上手:采集Kubernetes Pod日志

下面将带你演示在一个Kubernetes集群中,通过创建LogConfig CRD快速采集Pod的日志。

1. 准备Kubernetes环境

可以使用现有Kubernetes集群,或者部署Kubernetes。本地推荐使用Kind搭建Kubernetes集群。

本文的操作需要在本地使用:

请确保本地有kubectl和helm可执行命令。

2. 部署Loggie DaemonSet

你可以在 installation 页面查看所有发布的部署chart。

可以选择:

下载chart再部署

  1. VERSION=v1.4.0-rc.0
  2. helm pull https://github.com/loggie-io/installation/releases/download/$VERSION/loggie-$VERSION.tgz && tar xvzf loggie-$VERSION.tgz

尝试修改一下其中的values.yaml。 请将以上的<VERSION>替换成具体的版本号。

然后部署安装:

  1. helm install loggie ./loggie -nloggie --create-namespace

当然你也可以:

直接部署:

  1. helm install loggie -nloggie --create-namespace https://github.com/loggie-io/installation/releases/download/$VERSION/loggie-$VERSION.tgz

请将以上的<VERSION>替换成具体的版本号。

想使用其他版本镜像?

为了方便体验最新的Fix和特性,我们提供了main分支每次合并后的镜像版本,可通过 这里 进行选择。
同时你可以在helm install命令中增加--set image=loggieio/loggie:vX.Y.Z来指定具体的Loggie镜像。

部署有问题?

如果尝试部署后出现问题,或者在你的环境中以下演示操作未成功,请参考Kubernetes下部署Loggie,修改相关配置。

3. 采集日志

Loggie定义了Kubernetes CRD LogConfig,一个LogConfig表示采集一类Pods的日志采集任务。

3.1 创建被采集的Pods

我们先创建一个Pod用于被采集日志的对象。

  1. kubectl create deploy nginx --image=nginx

接下来将采集这个Nginx Pod的标准输出stdout日志。

3.2 定义输出源Sink

接着,我们创建一个Loggie定义的CRD Sink实例,表明日志发送的后端。
为了方便演示,这里我们将日志发送至Loggie Agent自身的日志中并打印。

  1. cat << EOF | kubectl apply -f -
  2. apiVersion: loggie.io/v1beta1
  3. kind: Sink
  4. metadata:
  5. name: default
  6. spec:
  7. sink: |
  8. type: dev
  9. printEvents: true
  10. EOF

可以通过kubectl get sink查看到已创建的Sink。

3.3 定义采集任务

Loggie定义CRD LogConfig,表示一个日志采集任务。我们创建一个LogConfig示例如下所示:

  1. cat << EOF | kubectl apply -f -
  2. apiVersion: loggie.io/v1beta1
  3. kind: LogConfig
  4. metadata:
  5. name: nginx
  6. namespace: default
  7. spec:
  8. selector:
  9. type: pod
  10. labelSelector:
  11. app: nginx
  12. pipeline:
  13. sources: |
  14. - type: file
  15. name: mylog
  16. paths:
  17. - stdout
  18. sinkRef: default
  19. EOF

可以看到,上面使用了sinkRef引用了刚才创建的sink default CR。当然,我们还可以直接在Logconfig中使用sink字段,示例如下:

  1. cat << EOF | kubectl apply -f -
  2. apiVersion: loggie.io/v1beta1
  3. kind: LogConfig
  4. metadata:
  5. name: nginx
  6. namespace: default
  7. spec:
  8. selector:
  9. type: pod
  10. labelSelector:
  11. app: nginx
  12. pipeline:
  13. sources: |
  14. - type: file
  15. name: mylog
  16. paths:
  17. - stdout
  18. sink: |
  19. type: dev
  20. printEvents: true
  21. codec:
  22. type: json
  23. pretty: true
  24. EOF

创建完之后,我们可以使用kubectl get lgc查看到创建的CRD实例。

同时,我们还可以通过kubectl describe lgc nginx查看LogConfig的事件,以获取最新的状态。

  1. Events:
  2. Type Reason Age From Message
  3. ---- ------ ---- ---- -------
  4. Normal syncSuccess 52s loggie/kind-control-plane Sync type pod [nginx-6799fc88d8-5cb67] success

上面的nginx LogConfig通过其中的spec.selector来匹配采集哪些Pod的日志,这里我们使用app: nginx选择了刚才创建的nginx Pod。
spec.pipeline则表示Loggie的Pipeline配置,我们只采集容器标准输出的日志,所以在paths中填写stdout即可。

4. 查看日志

首先找到所在的nginx pod节点:

  1. kubectl get po -owide -l app=nginx

然后我们找到该节点的Loggie:

  1. kubectl -nloggie get po -owide |grep ${node}

可以通过:

  1. kubectl -nloggie logs -f ${logge-pod}

查看Loggie打印出的日志,里面展示了采集到的nginx标准输出日志。

更多

上文只是一个简单的快速演示,部署出现问题或者想了解更多Kubernetes下Loggie如何使用?