本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。
如果需要只使用一个Logtail实例收集Kubernetes节点上所有容器的日志,可以使用DaemonSet方式在Kubernetes集群上部署Logtail。本文介绍DaemonSet方式采集容器文本日志的工作原理、使用限制、前提条件、操作步骤等信息。
工作原理
DaemonSet模式
在DaemonSet模式中,Kubernetes集群确保每个节点(Node)只运行一个Logtail容器,用于采集当前节点内所有容器(Containers)的日志。
当新节点加入集群时,Kubernetes集群会自动在新节点上创建Logtail容器;当节点退出集群时,Kubernetes集群会自动销毁当前节点上的Logtail容器。通过DaemonSet的自动扩缩容机制以及标识型机器组,用户无需手动管理Logtail实例。
容器发现
Logtail容器采集其他容器的日志,必须发现和确定哪些容器正在运行,这个过程称为容器发现。
在容器发现阶段,Logtail容器不与Kubernetes集群的kube-apiserver进行通信,而是直接和节点上的容器运行时守护进程(Container Runtime Daemon)进行通信,从而获取当前节点上的所有容器信息,避免容器发现对集群kube-apiserver产生压力。kube-apiserver是集群的中央管理组件,负责提供Kubernetes API的服务,更多信息请参见kube-apiserver。
Logtail支持通过Namespace名称、Pod名称、Pod标签、容器环境变量等条件指定或排除采集相应容器的日志。
容器文件路径映射
在Kubernetes集群中,因为Pod之间资源隔离,所以Logtail容器无法直接访问其他Pod中的容器的文件。但是,容器内的文件系统都是由宿主机的文件系统挂载形成,通过将宿主机根目录所在的文件系统挂载到Logtail容器,就可以访问宿主机上的任意文件,从而间接采集业务容器文件系统的文件。容器内文件路径与宿主机文件路径之间的关系被称为文件路径映射。
某个文件在当前容器内的路径是/log/app.log
,假设映射后的宿主机路径是/var/lib/docker/containers/<container-id>/log/app.log
。Logtail默认将宿主机根目录所在的文件系统挂载到自身的/logtail_host
目录下,因此Logtail实际采集的文件路径为/logtail_host/var/lib/docker/containers/<container-id>/log/app.log
。
Logtail采集配置的管理方式
通过控制台管理Logtail采集配置
操作步骤简单,不需连接Kubernetes集群,使用阿里云账号进行鉴权。
(推荐)通过CRD管理Logtail采集配置
通过CRD可以自定义Kubernetes资源,为了便于通过云原生方式管理Logtail采集配置,日志服务定义了AliyunLogConfig
这种CRD,它基本等价于Logtail采集配置。用户可以向kube-apiserver提交YAML配置文件来创建AliyunLogConfig
资源,从而创建相应的Logtail采集配置。这种配置方式需要连接Kubernetes集群,并额外使用Kubernetes鉴权。
通过CRD方式创建的配置,在控制台上对其修改不会同步到CRD中。因此,如需修改由CRD创建的配置内容,只能修改CRD资源,不要直接在控制台操作,避免配置不一致。
使用限制
容器运行时:Logtail只支持Docker和Containerd两种容器引擎。对于Docker只支持overlay、overlay2这两种存储驱动,其他存储驱动需将日志所在目录通过数据卷挂载为临时目录。
存储卷挂载方式:如果NAS以PVC的方式挂载到数据目录,不支持使用Daemonset方式部署Logtail,建议使用Sidecar方式或Deployment方式部署Logtail并完成日志采集。具体操作,请参见通过Sidecar方式采集Kubernetes容器文本日志和通过业务容器和Logtail容器共享PVC实现日志采集。
日志文件路径:
容器内文件路径暂不支持存在软链接,请按实际路径配置采集目录。
如果业务容器的数据目录通过数据卷(Volume)挂载,则填写的文件路径不能短于挂载点路径。例如
/var/log/service
目录是数据卷挂载的路径,则设置采集目录为/var/log
将无法采集该目录下的日志,因为采集目录比挂载路径短。必须设置采集目录为/var/log/service
或更深的目录。
日志文件采集停止:
docker:当容器被停止时,Logtail会立刻释放容器文件句柄,容器可正常退出。如果在容器停止前,出现因网络延迟、资源占用多等原因导致的采集延时,可能会丢失容器停止前的部分日志。
containerd:当容器被停止时,Logtail会持续持有容器内文件的句柄(即保持对日志文件的打开状态),直至所有日志文件内容发送完毕。因此,当出现网络延迟、资源占用多等原因导致的采集延时时,可能会导致业务容器不能及时销毁。
前提条件
已安装Logtail组件。具体操作,请参见安装Logtail组件(阿里云Kubernetes集群)。
在安装Logtail组件时所使用的Project中已创建Logstore。具体操作,请参见创建Logstore。
安装Logtail的主机需开放80(HTTP)端口和443(HTTPS)端口。ECS实例的端口由安全组规则控制,添加安全组规则的步骤请参见添加安全组规则。
目标容器持续新增日志。Logtail只采集增量日志。如果下发logtail采集配置后,日志文件无更新,则Logtail不会采集该文件中的日志。更多信息,请参见读取日志。
对于不同容器引擎,必须确认对应的UNIX域套接字存在,而且确保Logtail有相应UNIX域套接字的访问权限。
Docker:
/run/docker.sock
。Containerd:
/run/containerd/containerd.sock
。
创建Logtail采集配置
通过CRD方式创建的配置,在控制台上对其修改不会同步到CRD中。因此,如需修改由CRD创建的配置内容,只能修改CRD资源,不要直接在控制台操作,避免导致配置不一致。
控制台
登录日志服务控制台。
单击控制台右侧的快速接入数据,在接入数据区域单击Kubernetes-文件卡片。
选择目标Project和Logstore,单击下一步。选择您在安装Logtail组件时所使用的Project。Logstore为您自定义创建的Logstore。
在机器组配置页面。
根据实际场景,单击以下页签:
- 重要
不同页签的后续配置步骤不同,请根据实际需求正确选择。
确认目标机器组已在应用机器组列表中,然后单击下一步。在ACK中安装Logtail组件后,日志服务自动创建名为
k8s-group-${your_k8s_cluster_id}
的机器组,您可以直接使用该机器组。重要如果需要新建机器组,请单击创建机器组,按照右侧面板进行创建。更多信息,请参见通过控制台向导创建应用并配置日志服务。
如果机器组心跳为FAIL,您可单击自动重试。如果还未解决,请参见Logtail机器组无心跳进行排查。
创建Logtail采集配置,单击下一步创Logtail采集配置,日志服务开始采集日志。
说明Logtail采集配置生效时间最长需要3分钟,请耐心等待。
创建索引和预览数据,然后单击下一步。日志服务默认开启全文索引。您也可以根据采集到的日志,手动创建字段索引,或者单击自动生成索引,日志服务将自动生成字段索引。更多信息,请参见创建索引。
重要如果需要查询日志中的所有字段,建议使用全文索引。如果只需查询部分字段、建议使用字段索引,减少索引流量。如果需要对字段进行分析(SELECT语句),必须创建字段索引。
单击查询日志,系统将跳转至Logstore查询分析页面。
您需要等待1分钟左右,待索引生效后,才能在原始日志页签中,查看已采集到的日志。更多信息,请参见查询和分析日志。
CRD
创建Logtail采集配置
您只需要定义AliyunLogConfig CRD即可创建Logtail配置。创建完成后,系统自动应用该Logtail配置。如果您要删除Logtail配置只需删除对应的CRD资源即可。
登录Kubernetes集群。
执行如下命令创建一个YAML文件。
cube.yaml
为文件名,请根据实际情况替换。vim cube.yaml
在YAML文件输入如下脚本,并根据实际情况设置其中的参数。
重要请确保
configName
字段值在安装Logtail组件的Project中唯一。如果多个CRD关联同一个Logtail配置,则删除或修改任意一个CRD均会影响到该Logtail配置,导致其他关联该Logtail配置的CRD状态与日志服务中Logtail配置的状态不一致。
apiVersion: log.alibabacloud.com/v1alpha1 # 使用默认值,无需修改。 kind: AliyunLogConfig # 使用默认值,无需修改。 metadata: name: simple-stdout-example # 设置资源名,在当前Kubernetes集群内唯一。 spec: project: k8s-my-project # [可选]设置Project名称。默认为安装Logtail组件时设置的Project。 logstore: k8s-stdout # 设置Logstore名称。如果您所指定的Logstore不存在,日志服务会自动创建。 logstoreMode: standard # [可选]设置Logstore类型,该参数值仅在新建Logstore时生效。 shardCount: 2 # [可选]设置Shard数量。默认值为2,取值范围1~10。 lifeCycle: 90 # [可选]设置Logstore中数据的存储时间,该参数值仅在新建Logstore时生效。默认值为90,取值范围为1~3650。其中,3650天为永久存储。 logtailConfig: # 设置Logtail配置。 inputType: plugin # 设置采集的数据源类型。file表示采集文本日志或plugin表示采集标准输出。 configName: simple-stdout-example # 设置Logtail配置的名称,必须与资源名(metadata.name)相同。 inputDetail: # 设置Logtail配置的详细信息,具体配置请参见本文下方的示例。 ...
执行如下命令使Logtail配置生效。Logtail配置生效后,Logtail开始采集各个容器上的标准输出或文本日志,并发送到日志服务中。
cube.yaml
为文件名,请根据实际情况替换。kubectl apply -f cube.yaml
重要采集到日志后,您需要先创建索引,才能在Logstore中查询和分析日志。具体操作,请参见创建索引。
查看Logtail采集配置
控制台
登录日志服务控制台。
在Project列表区域,单击目标Project。
- 在 页签中,单击目标日志库前面的>,依次选择 。
- 单击目标Logtail采集配置,查看Logtail采集配置详情。
CRD
查看当前Kubernetes集群中所有的Logtail采集配置
查看Logtail采集配置的详细信息和状态
查询分析已采集的日志
在Project列表中,单击目标Project,进入对应的Project详情页面。
在对应的日志库右侧的图标,选择查询分析,查看Kubernetes集群输出的日志。
CRD配置示例
采集容器文本日志时,需将inputType
设置为file
,并将具体信息填写到inputDetail
内,具体字段及说明请参见上文的创建Logtail配置。
通过Kubernetes信息过滤容器
容器日志文本默认字段
每条容器文本日志默认包含的字段如下表所示。
字段名称 | 说明 |
__tag__:__hostname__ | 容器宿主机的名称。 |
__tag__:__path__ | 容器内日志文件的路径。 |
__tag__:_container_ip_ | 容器的IP地址。 |
__tag__:_image_name_ | 容器使用的镜像名称。 |
__tag__:_pod_name_ | Pod的名称。 |
__tag__:_namespace_ | Pod所属的命名空间。 |
__tag__:_pod_uid_ | Pod的唯一标识符(UID)。 |
问题排查
当您使用Logtail采集容器(标准容器、Kubernetes)日志遇到异常情况时,您可以参见如下内容进行排查。
- 本页导读 (1)