用户指南

日志采集

最近更新时间:2020-09-03 11:48:21

操作场景

EKS 日志采集功能可以将集群内服务的日志发送至 Kafka 或者 腾讯云日志服务(CLS),适用于需要对 EKS 集群内服务日志进行存储和分析的用户。本文介绍如何使用弹性容器服务(EKS)提供的集群内日志采集功能。

EKS 日志采集功能需要在创建工作负载时为每个弹性集群手动开启。您可根据以下操作开启日志采集功能:

说明事项

EKS 日志采集功能开启后,日志采集 Agent 根据您配置的采集路径和消费端,将采集到的日志以 JSON 的形式发送到您指定的消费端。消费端及采集路径说明如下:

  • 消费端:日志采集服务支持 Kafka 或 CLS 作为日志的消费端。
  • 采集路径:需要采集的日志的路径。采集路径支持采集标准输出(stdout)和绝对路径,支持 * 通配,多个采集路径以“,”分隔。

前提条件

  • 需确认 Kubernetes 集群能够访问日志消费端。
  • 日志长度限制为单条512K,如果超过则会截断。

操作步骤

配置日志采集

EKS 日志采集功能采集到的日志信息将会以 JSON 格式输出到您指定的消费端,并会附加相关的 Kubernetes metadata,包括容器所属 pod 的 label 和 annotation 等信息。具体操作步骤如下:

  1. 登录 容器服务控制台,选择左侧导航栏中的【弹性集群】。
  2. 进入“弹性集群”页面,选择需要日志采集的集群 ID,进入集群管理页面。
  3. 在左侧“工作负载”中选择需要的工作负载类型,进入对应页面后选择【新建】。
  4. 在“实例内容器”中选择【显示高级设置】,并勾选“开启”日志采集。如下图所示:
  5. 参考以下信息进行日志消费端配置,您可选择 CLS 或 Kafka 作为日志消费端。如下图所示:
  6. 选择角色或者密钥进行授权。
    注意:

    • 同一 pod 下的容器只能选择同一种授权方式,以您最后修改的授权方式为准。例如第一个容器选择了密钥授权,第二个选择了角色授权,最终两个容器都是角色授权。
    • 同一 pod 下的容器只能选择同一个角色授权。

角色授权

  • 选择具有访问日志服务 CLS 权限的角色名称,如下图所示:
  • 若无合适的角色,创建过程参考以下步骤:
    1. 登录访问管理控制台,在左侧导航栏选择【角色】。
    2. 在“角色”页面,单击【新建角色】。
    3. 在“选择角色载体” 弹窗中,选择【腾讯云产品服务】,进入【新建自定义角色】页面。
    4. 在“输入角色载体信息”步骤中,选择绑定【云服务器(cvm)】载体,单击【下一步】。
    5. 在“配置角色策略”步骤中,选择【QcloudCLSAccessForApiGateWayRole】策略,单击【下一步】。
    6. 在“审阅”步骤中,输入您的角色名称,审阅您即将创建角色的相关信息,单击【完成】后即完成自定义角色创建。详情请参见 创建角色

密钥授权

  • 选择您利用账号 API 密钥的 SecretId 和 SecretKey 作为变量值进行创建的集群 Secret 配置名称。
  • 若无合适的 Secret,需新建 Secret。详情请参见 Secret 管理。其中 SecretId 和 SecretKey 可在 API 密钥 中查看。
    注意:

    API 密钥对应的用户需具备访问日志服务(CLS)的权限。若无 API 密钥,需新建 API 密钥。详情请参见 访问密钥

  1. 配置采集路径。如下图所示:

    至此已完成日志采集功能配置,您可按需进行该工作负载的其他配置。

配置日志消费端

EKS 日志采集功能支持指定用户自建的 Kafka 实例、日志服务 CLS 指定的日志主题作为日志内容的消费端。日志采集 Agent 会将采集到的日志发送到指定 Kafka 的指定 Topic 或指定的 CLS 日志主题。

配置 Kafka 作为日志消费端

选择 Kafka 作为日志采集的消费端,填写 Kafka 的 Broker 地址及 Topic,需要保证集群内所有资源都能够访问用户指定的 Kafka Topic。如下图所示:

配置 CLS 作为日志消费端

  • 日志服务 CLS 目前只能支持同地域的容器集群进行日志采集上报。详情请参见 创建日志集和日志主题
  • 打开日志主题的【日志索引】。如下图所示:

通过 yaml 配置日志采集

本文提供 采集日志到 Kafka通过 secret 采集日志到 cls,和 通过 role 采集日志到 cls 三种方式,请按需选择:

方式1:采集日志到 Kafka
通过增加环境变量开启日志采集。

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_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 以后不再对外可见。

方式2:通过密钥采集日志到 cls

创建 secret

通过 kubectl 执行以下命令,获取进行 base64编码的 secretid 和 secretkey,详情请参考 secret 管理
其中,secretid 及 secretkey 请替换为您实际使用的 secretid 和 secretkey。

$ echo -n 'secretid' | base64
c2VjcmV0aWQ=
$ echo -n 'secretkey' | base64
c2VjcmV0a2V5

通过 yaml 创建 secret。secretid 及 secretkey 请使用在 创建 secret 步骤中获取的值进行填写。

apiVersion: v1
kind: Secret
metadata:
  name: secretidkey
data:
  secretid: c2VjcmV0aWQ=
  secretkey: c2VjcmV0a2V5

创建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。

方式3:通过角色采集日志到 cls

创建角色

访问管理控制台 新建角色,选择【腾讯云产品服务】,绑定【云服务器 CVM】载体,选择【QcloudCLSAccessForApiGateWayRole】策略。详情请参考 创建角色
在 pod template 中新增 annotation,指定 role 的名称,获取该 role 包含的权限策略。

template:
  metadata:
    annotations:
      eks.tke.cloud.tencent.com/role-name: "eks-pushlog"

创建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。
5. 添加完成后,单击【完成】,即可更新 YAML 增加日志配置。 >! 若 yaml 中同时配置了密钥和角色授权,pod 实际上采用的是角色授权。 >

更新日志采集

您可通过控制台和 yaml 更新日志采集,请参考以下步骤:

通过控制台更新日志采集

  1. 登录 容器服务控制台,选择左侧导航栏中的【弹性集群】。
  2. 选择需要配置日志采集的集群 ID,进入集群管理页面。
  3. 选择左侧【工作负载】,单击需要更新日志采集的工作负载所在行右侧的【更新Pod配置】>【显示高级设置】,修改对应的配置。如下图所示:
  4. 单击【完成】即可更新。

通过 yaml 更新日志采集

找到需要更新日志采集的工作负载对应的 yaml,根据配置对应变量名的变动修改相应的变量值,变量名对应的含义可在 配置日志采集 查看。

目录