tencent cloud

文档反馈

使用环境变量配置日志采集

最后更新时间:2024-12-19 22:29:21

    操作场景

    在 TKE Serverless 集群中,用户可以通过环境变量配置日志采集,按行采集日志、不解析。也可以通过 自定义资源定义(CustomResourceDefinitions,CRD)的方式配置日志采集
    本文介绍如何通过环境变量实现 TKE Serverless 集群的日志采集功能。该功能支持将集群内服务的日志发送至 日志服务 CLS 或用户自建 Kafka,适用于需要对 TKE Serverless 集群内服务日志进行存储和分析的用户。
    TKE Serverless 集群日志采集功能需要在创建工作负载时手动开启。您可根据以下操作开启日志采集功能:

    说明事项

    TKE Serverless 集群日志采集功能开启后,日志采集 Agent 根据您配置的采集路径和消费端,将采集到的日志以 JSON 的形式发送到您指定的消费端。消费端及采集路径说明如下:
    消费端:日志采集服务支持 Kafka 或 CLS 作为日志的消费端。
    采集路径:需要采集的日志的路径。采集路径支持采集标准输出(stdout)和绝对路径,支持 * 通配,多个采集路径以“,”分隔。

    前提条件

    需确认 Kubernetes 集群能够访问日志消费端。
    日志长度限制为单条2M,如果超过则会截断。
    注意:
    若日志输出速率过快,为避免 OOM,需要调整此参数配置,详情请参见 如何调整日志采集配置

    操作步骤

    通过控制台配置日志采集

    TKE Serverless 集群日志采集功能采集到的日志信息将会以 JSON 格式输出到您指定的消费端,并会附加相关的 Kubernetes metadata,包括容器所属 Pod 的 label 和 annotation 等信息。具体操作步骤如下:
    1. 登录 容器服务控制台,选择左侧导航栏中的集群
    2. 在集群管理页面,单击 Serverless 集群 ID,进入集群详情页。
    3. 在工作负载中选择需要的工作负载类型,进入对应页面后选择新建
    4. 在实例内容器中选择显示高级设置,并勾选“开启”日志采集。如下图所示:
    
    
    
    5. 参考以下信息进行日志消费端配置,您可选择 CLS 或 Kafka 作为日志消费端。
    配置CLS作为日志消费端
    配置Kafka作为日志消费端
    1. 选择 CLS 作为日志消费端,并选择日志集和日志主题。如下图所示:
    
    若无合适的日志集,请参考 新建日志集及日志主题
    注意:
    日志服务 CLS 目前仅支持同地域的容器集群进行日志采集上报。
    2. 打开日志主题的日志索引。索引配置是使用日志服务 CLS 进行检索分析的必要条件。若未开启,则无法查看日志。配置索引的详细操作,请参见 日志服务配置索引。 您可在 日志服务控制台>日志主题中,选择日志主题名称,在“索引配置”页面开启索引。如下图所示:
    
    
    选择 Kafka 为消费端,推荐使用 CKafka,消费、生产方式与原生版体验一致,并支持配置告警。 在容器配置中填写 Kafka 的 Broker 地址及 Topic,需要保证集群内所有资源都能够访问用户指定的 Kafka Topic。如下图所示:
    
    
    注意:
    Kafka 的 Topic 配置中 cleanup.policy 参数需选择 delete,选择 compact 会导致 CLS 无法上报到 Kafka 而造成数据丢失。如下图所示:
    
    
    
    6. 选择角色或者密钥进行授权。
    注意:
    同一 pod 下的容器只能选择同一种授权方式,以您最后修改的授权方式为准。例如第一个容器选择了密钥授权,第二个选择了角色授权,最终两个容器都是角色授权。
    同一 pod 下的容器只能选择同一个角色授权。
    角色授权
    密钥授权
    选择具有访问日志服务 CLS 权限的角色名称,如下图所示:
    
    
    若无合适的角色,创建过程参考以下步骤:
    1. 
    新建策略
    在新建角色之前,您需要创建一个策略,该策略决定了您的角色具备的权限。
    1.1 登录访问管理控制台,在左侧导航栏选择 策略
    1.2 在策略页面,单击新建自定义策略
    1.3 在“选择创建策略方式” 弹窗中,选择按策略生成器创建
    1.4 在可视化策略生成器中,选择 “日志服务(cls)”,选择“写操作:pushLog”,如下图所示:
    
    
    1.5 单击下一步,进入“关联用户/用户组”页面。
    1.6 确认策略名称,单击完成即可创建策略。
    2. 新建角色 创建策略完成后,需要将该策略绑定至一个角色,使得该角色具备策略相应的权限。
    2.1 登录访问管理控制台,在左侧导航栏选择 角色
    2.2 在“角色”页面,单击新建角色
    2.3 在“选择角色载体” 弹窗中,选择腾讯云产品服务,进入新建自定义角色页面。
    2.4 在“输入角色载体信息”步骤中,选择绑定云服务器(cvm)载体,单击下一步
    注意:
    必须选择云服务器(cvm)作为角色载体,选择容器服务则无法完成授权。
    2.5 在“配置角色策略”步骤中,选择 已创建的策略,单击下一步
    2.6 在“审阅”步骤中,输入您的角色名称,审阅您即将创建角色的相关信息,单击完成后即完成自定义角色创建。详情请参见 创建角色
    选择您利用账号 API 密钥的 SecretId 和 SecretKey 作为变量值进行创建的集群 Secret 配置名称。
    
    
    
    若无合适的 Secret,需新建 Secret。详情请参见 Secret 管理。其中 SecretId 和 SecretKey 可在 API 密钥 中查看。
    注意:
    API 密钥对应的用户需具备访问日志服务 CLS 的权限。若无 API 密钥,需新建 API 密钥。详情请参见 访问密钥
    
    7. 配置采集路径。如下图所示:
    
    
    至此已完成日志采集功能配置,您可按需进行该工作负载的其他配置。

    通过 yaml 配置日志采集

    本文提供采集日志到 Kafka、通过 secret 采集日志到 CLS 和通过 role 采集日志到 CLS 三种方式,请按需选择:
    注意:
    若 yaml 中同时配置了密钥和角色授权,pod 实际上采用的是角色授权。
    采集日志到Kafka
    通过secret采集日志到CLS
    通过role采集日志到CLS
    通过增加环境变量开启日志采集。
    apiVersion: apps/v1beta2
    kind: Deployment
    metadata:
    annotations:
    deployment.kubernetes.io/revision: "1"
    labels:
    k8s-app: kafka
    qcloud-app: kafka
    name: kafka
    namespace: default
    spec:
    replicas: 1
    selector:
    matchLabels:
    k8s-app: kafka
    qcloud-app: kafka
    template:
    metadata:
    annotations:
    eks.tke.cloud.tencent.com/cpu: "0.25"
    eks.tke.cloud.tencent.com/mem: "0.5Gi"
    labels:
    k8s-app: kafka
    qcloud-app: kafka
    spec:
    containers:
    - env:
    - name: EKS_LOGS_OUTPUT_TYPE
    value: kafka
    - name: EKS_LOGS_KAFKA_BROKERS
    value: 10.0.16.42:9092
    - name: EKS_LOGS_KAFKA_TOPIC
    value: eks
    - name: EKS_LOGS_KAFKA_MESSAGE_KEY
    valueFrom:
    fieldRef:
    fieldPath: metadata.name
    - name: EKS_LOGS_METADATA_ON
    value: "true"
    - name: EKS_LOGS_LOG_PATHS
    value: stdout,/tmp/busy*.log
    image: busybox:latest
    command: ["/bin/sh"]
    args: ["-c", "while true; do echo hello world; date; echo hello >> /tmp/busy.log; sleep 1; done"]
    imagePullPolicy: Always
    name: while
    resources:
    requests:
    cpu: 250m
    memory: 512Mi
    字段说明:
    字段名
    含义
    EKS_LOGS_OUTPUT_TYPE
    消费端支持 kafka 和 cls,根据该 key 判断是否启用日志收集。
    EKS_LOGS_LOG_PATHS
    日志路径,支持 stdout(表示采集标准输出)和绝对路径,支持 * 通配,多个路径用“,”分隔。
    EKS_LOGS_METADATA_ON
    支持 true 或 false。不填写则默认为 true。
    EKS_LOGS_KAFKA_TOPIC
    日志主题。
    EKS_LOGS_KAFKA_BROKERS
    kafka brokers,ip1:port1,ip1:port2,ip2:port2格式,多个用“,”分隔。对外用此环境变量,EKS_LOGS_KAFKA_HOST 以后不再对外可见。
    EKS_LOGS_KAFKA_MESSAGE_KEY
    非必填。支持指定一个 key,将日志投递到指定分区。
    对于未开启按 key 投递,日志将随机投递到不同分区里。
    开启按 key 投递,带有同样 key 的日志,将投递到相同的分区里。
    
    注意:此处 key 从 Pod 的字段获取变量值,以上示例皆以 Pod name 为例,同时还支持 namespace、PodIP 等,详情可参见 kubernetes 社区文档
    对于开启按 key 投递到 kafka 指定分区,验证方式如下:
    未开启时,查询消息不显示 key,如下图所示:
    
    
    当开启后,查询消息显示 key,如下图所示:
    
    

    创建 secret

    注意:
    以下示例为通过 yaml 手动创建 secret。如通过控制台创建 secret,则不需要进行64编码,详情请参考 secret 管理
    通过 kubectl 执行以下命令,获取进行 base64编码的 secretid 和 secretkey。其中,secretid 及 secretkey 请替换为您账号的 secretid 和 secretkey,可在 API 密钥 中查看。
    $ echo -n 'secretid' | base64
    c2VjcmV0aWQ=
    $ echo -n 'secretkey' | base64
    c2VjcmV0a2V5
    通过 yaml 手动创建 secret。secretid 及 secretkey 请使用在 创建 secret 步骤中获取的值进行填写。
    apiVersion: v1
    kind: Secret
    metadata:
    name: secretidkey
    data:
    secretid: ""
    secretkey: ""

    创建deployment

    通过增加环境变量开启日志采集。
    apiVersion: apps/v1beta2
    kind: Deployment
    metadata:
    annotations:
    deployment.kubernetes.io/revision: "1"
    labels:
    k8s-app: cls
    qcloud-app: cls
    name: cls
    namespace: default
    spec:
    replicas: 1
    selector:
    matchLabels:
    k8s-app: cls
    qcloud-app: cls
    template:
    metadata:
    annotations:
    eks.tke.cloud.tencent.com/cpu: "0.25"
    eks.tke.cloud.tencent.com/mem: "0.5Gi"
    labels:
    k8s-app: cls
    qcloud-app: cls
    spec:
    containers:
    - env:
    - name: EKS_LOGS_OUTPUT_TYPE
    value: cls
    - name: EKS_LOGS_LOGSET_NAME
    value: eks
    - name: EKS_LOGS_TOPIC_ID
    value: 617c8270-e8c8-46e2-a90b-d94c4bebe519
    - name: EKS_LOGS_SECRET_ID
    valueFrom:
    secretKeyRef:
    name: secretidkey
    key: secretid
    - name: EKS_LOGS_SECRET_KEY
    valueFrom:
    secretKeyRef:
    name: secretidkey
    key: secretkey
    - name: EKS_LOGS_LOG_PATHS
    value: stdout,/tmp/busy*.log
    - name: EKS_LOGS_METADATA_ON
    value: "true"
    image: busybox:latest
    command: ["/bin/sh"]
    args: ["-c", "while true; do echo hello world; date; echo hello >> /tmp/busy.log; sleep 1; done"]
    imagePullPolicy: Always
    name: hello
    - env:
    - name: EKS_LOGS_OUTPUT_TYPE
    value: cls
    - name: EKS_LOGS_LOGSET_NAME
    value: eks
    - name: EKS_LOGS_TOPIC_ID
    value: 617c8270-e8c8-46e2-a90b-d94c4bebe519
    - name: EKS_LOGS_SECRET_ID
    valueFrom:
    secretKeyRef:
    name: secretidkey
    key: secretid
    - name: EKS_LOGS_SECRET_KEY
    valueFrom:
    secretKeyRef:
    name: secretidkey
    key: secretkey
    - name: EKS_LOGS_LOG_PATHS
    value: stdout,/tmp/busy*.log
    - name: EKS_LOGS_METADATA_ON
    value: "true"
    image: busybox:latest
    command: ["/bin/sh"]
    args: ["-c", "while true; do echo hello world; date; echo hello >> /tmp/busy.log; sleep 1; done"]
    imagePullPolicy: Always
    name: world
    字段说明:
    字段名
    含义
    EKS_LOGS_OUTPUT_TYPE
    消费端支持 kafka 和 cls,根据该 key 判断是否启用日志收集。
    EKS_LOGS_LOG_PATHS
    日志路径,支持 stdout(表示采集标准输出)和绝对路径,支持 * 通配,多个路径用“,”分隔。
    EKS_LOGS_METADATA_ON
    支持 true 或 false。不填写则默认为 true。
    EKS_LOGS_LOGSET_NAME
    CLS 日志集名称。
    EKS_LOGS_TOPIC_ID
    CLS 日志集的主题 ID。
    EKS_LOGS_SECRET_ID
    SecretId。
    EKS_LOGS_SECRET_KEY
    SecretKey。
    

    步骤1:创建角色

    1. 
    新建策略
    在新建角色之前,您需要创建一个策略,该策略决定了您的角色具备的权限。
    1.1 登录访问管理控制台,在左侧导航栏选择 策略
    1.2 在策略页面,单击新建自定义策略
    1.3 在“选择创建策略方式” 弹窗中,选择按策略生成器创建
    1.4 在“可视化策略生成器”中,选择 “日志服务(cls)”,选择“写操作:pushLog”,如下图所示:
    
    
    
    1.5 单击下一步,进入关联用户/用户组页面。
    1.6 确认策略名称,单击完成即可创建策略。
    2. 新建角色 创建策略完成后,需要将该策略绑定至一个角色,使得该角色具备策略相应的权限。
    2.1 登录访问管理控制台,在左侧导航栏选择 角色
    2.2 在角色页面,单击新建角色
    2.3 在“选择角色载体” 弹窗中,选择腾讯云产品服务,进入新建自定义角色页面。
    2.4 在“输入角色载体信息”步骤中,选择绑定云服务器(cvm)载体,单击下一步
    注意:
    必须选择云服务器(cvm)作为角色载体,选择容器服务则无法完成授权。
    2.5 在“配置角色策略”步骤中,选择 已创建的策略,单击下一步
    2.6 在“审阅”步骤中,输入您的角色名称,审阅您即将创建角色的相关信息,单击完成后即完成自定义角色创建。详情请参见 创建角色
    完成创建角色步骤后,需要在 pod template 中新增 annotation,指定 role 的名称,获取该 role 包含的权限策略。
    template:
    metadata:
    annotations:
    eks.tke.cloud.tencent.com/role-name: "eks-pushlog"

    步骤2:创建 deployment

    apiVersion: apps/v1beta2
    kind: Deployment
    metadata:
    annotations:
    deployment.kubernetes.io/revision: "1"
    labels:
    k8s-app: cls
    qcloud-app: cls
    name: cls
    namespace: default
    spec:
    replicas: 1
    selector:
    matchLabels:
    k8s-app: cls
    qcloud-app: cls
    template:
    metadata:
    annotations:
    eks.tke.cloud.tencent.com/cpu: "0.25"
    eks.tke.cloud.tencent.com/mem: "0.5Gi"
    eks.tke.cloud.tencent.com/role-name: "eks-pushlog"
    labels:
    k8s-app: cls
    qcloud-app: cls
    spec:
    containers:
    - env:
    - name: EKS_LOGS_OUTPUT_TYPE
    value: cls
    - name: EKS_LOGS_LOGSET_NAME
    value: eks
    - name: EKS_LOGS_TOPIC_ID
    value: 617c8270-e8c8-46e2-a90b-d94c4bebe519
    - name: EKS_LOGS_LOG_PATHS
    value: stdout,/tmp/busy*.log
    - name: EKS_LOGS_METADATA_ON
    value: "true"
    image: busybox:latest
    command: ["/bin/sh"]
    args: ["-c", "while true; do echo hello world; date; echo hello >> /tmp/busy.log; sleep 1; done"]
    imagePullPolicy: Always
    name: hello
    - env:
    - name: EKS_LOGS_OUTPUT_TYPE
    value: cls
    - name: EKS_LOGS_LOGSET_NAME
    value: eks
    - name: EKS_LOGS_TOPIC_ID
    value: 617c8270-e8c8-46e2-a90b-d94c4bebe519
    - name: EKS_LOGS_LOG_PATHS
    value: stdout,/tmp/busy*.log
    - name: EKS_LOGS_METADATA_ON
    value: "true"
    image: busybox:latest
    command: ["/bin/sh"]
    args: ["-c", "while true; do echo hello world; date; echo hello >> /tmp/busy.log; sleep 1; done"]
    imagePullPolicy: Always
    name: world
    字段说明:
    字段名
    含义
    EKS_LOGS_OUTPUT_TYPE
    消费端支持 kafka 和 cls,根据该 key 判断是否启用日志收集。
    EKS_LOGS_LOG_PATHS
    日志路径,支持 stdout(表示采集标准输出)和绝对路径,支持 * 通配,多个路径用“,”分隔。
    EKS_LOGS_METADATA_ON
    支持 true 或 false。不填写则默认为 true。
    EKS_LOGS_LOGSET_NAME
    CLS 日志集名称。
    EKS_LOGS_TOPIC_ID
    CLS 日志集的主题 ID。
    

    更新日志采集

    您可通过控制台和 yaml 更新日志采集,请参考以下步骤:
    通过控制台更新日志采集
    通过yaml更新日志采集
    1. 登录 容器服务控制台,选择左侧导航栏中的集群
    2. 在集群管理页面,单击 Serverless 集群 ID,进入集群详情页。
    3. 选择左侧工作负载,单击需要更新日志采集的工作负载所在行右侧的更新 Pod 配置 > 显示高级设置,修改对应的配置。如下图所示:
    
    
    4. 单击完成即可更新。
    找到需要更新日志采集的工作负载对应的 yaml,根据配置对应变量名的变动修改相应的变量值,变量名对应的含义可在 配置日志采集 查看。

    常见问题

    如遇问题,您可先查询 Serverless 集群日志采集相关问题。如果您的问题仍未解决,请 联系我们
    联系我们

    联系我们,为您的业务提供专属服务。

    技术支持

    如果你想寻求进一步的帮助,通过工单与我们进行联络。我们提供7x24的工单服务。

    7x24 电话支持