操作场景
在 TKE Serverless 集群中,用户可以通过环境变量配置日志采集,按行采集日志、不解析。也可以通过 自定义资源定义(CustomResourceDefinitions,CRD)的方式配置日志采集。
本文介绍如何通过环境变量实现 TKE Serverless 集群的日志采集功能。该功能支持将集群内服务的日志发送至 日志服务 CLS 或用户自建 Kafka,适用于需要对 TKE Serverless 集群内服务日志进行存储和分析的用户。
TKE Serverless 集群日志采集功能需要在创建工作负载时手动开启。您可根据以下操作开启日志采集功能:
说明事项
TKE Serverless 集群日志采集功能开启后,日志采集 Agent 根据您配置的采集路径和消费端,将采集到的日志以 JSON 的形式发送到您指定的消费端。消费端及采集路径说明如下:
- 消费端:日志采集服务支持 Kafka 或 CLS 作为日志的消费端。
- 采集路径:需要采集的日志的路径。采集路径支持采集标准输出(stdout)和绝对路径,支持 * 通配,多个采集路径以“,”分隔。
前提条件
- 需确认 Kubernetes 集群能够访问日志消费端。
- 日志长度限制为单条2M,如果超过则会截断。
操作步骤
通过控制台配置日志采集
TKE Serverless 集群日志采集功能采集到的日志信息将会以 JSON 格式输出到您指定的消费端,并会附加相关的 Kubernetes metadata,包括容器所属 Pod 的 label 和 annotation 等信息。具体操作步骤如下:
登录 容器服务控制台,选择左侧导航栏中的集群。
在集群管理页面,单击 Serverless 集群 ID,进入集群详情页。
在左侧“工作负载”中选择需要的工作负载类型,进入对应页面后选择新建。
在“实例内容器”中选择显示高级设置,并勾选“开启”日志采集。如下图所示:
参考以下信息进行日志消费端配置,您可选择 CLS 或 Kafka 作为日志消费端。
- 选择 CLS 作为日志消费端,并选择日志集和日志主题。如下图所示:
若无合适的日志集,请参考 新建日志集及日志主题。
日志服务 CLS 目前仅支持同地域的容器集群进行日志采集上报。
- 打开日志主题的日志索引。索引配置是使用日志服务 CLS 进行检索分析的必要条件。若未开启,则无法查看日志。配置索引的详细操作,请参见 日志服务配置索引。
您可在 日志服务控制台>日志主题中,选择日志主题名称,在“索引配置”页面开启索引。如下图所示:
选择 Kafka 为消费端,推荐使用 CKafka,消费、生产方式与原生版体验一致,并支持配置告警。
在容器配置中填写 Kafka 的 Broker 地址及 Topic,需要保证集群内所有资源都能够访问用户指定的 Kafka Topic。如下图所示:
Kafka 的 Topic 配置中 cleanup.policy
参数需选择 delete,选择 compact 会导致 CLS 无法上报到 Kafka 而造成数据丢失。如下图所示:
选择角色或者密钥进行授权。
注意
- 同一 pod 下的容器只能选择同一种授权方式,以您最后修改的授权方式为准。例如第一个容器选择了密钥授权,第二个选择了角色授权,最终两个容器都是角色授权。
- 同一 pod 下的容器只能选择同一个角色授权。
选择具有访问日志服务 CLS 权限的角色名称,如下图所示:
若无合适的角色,创建过程参考以下步骤:
新建策略
在新建角色之前,您需要创建一个策略,该策略决定了您的角色具备的权限。
- 登录访问管理控制台,在左侧导航栏选择 策略。
- 在“策略”页面,单击新建自定义策略。
- 在“选择创建策略方式” 弹窗中,选择按策略生成器创建。
- 在“可视化策略生成器”中,“服务”选择 “日志服务(cls)”,“操作”选择“写操作:pushLog”,如下图所示:
- 单击下一步,进入“关联用户/用户组”页面。
- 确认策略名称,单击完成即可创建策略。
新建角色
创建策略完成后,需要将该策略绑定至一个角色,使得该角色具备策略相应的权限。
登录访问管理控制台,在左侧导航栏选择 角色。
在“角色”页面,单击新建角色。
在“选择角色载体” 弹窗中,选择腾讯云产品服务,进入新建自定义角色页面。
在“输入角色载体信息”步骤中,选择绑定云服务器(cvm)载体,单击下一步。
注意
必须选择云服务器(cvm)作为角色载体,选择容器服务则无法完成授权。
在“配置角色策略”步骤中,选择 已创建的策略,单击下一步。
在“审阅”步骤中,输入您的角色名称,审阅您即将创建角色的相关信息,单击完成后即完成自定义角色创建。详情请参见 创建角色。
- 选择您利用账号 API 密钥的 SecretId 和 SecretKey 作为变量值进行创建的集群 Secret 配置名称。
- 若无合适的 Secret,需新建 Secret。详情请参见 Secret 管理。其中 SecretId 和 SecretKey 可在 API 密钥 中查看。
注意
API 密钥对应的用户需具备访问日志服务 CLS 的权限。若无 API 密钥,需新建 API 密钥。详情请参见 访问密钥。
配置采集路径。如下图所示:
至此已完成日志采集功能配置,您可按需进行该工作负载的其他配置。
通过 yaml 配置日志采集
本文提供采集日志到 Kafka、通过 secret 采集日志到 CLS 和通过 role 采集日志到 CLS 三种方式,请按需选择:
注意:
若 yaml 中同时配置了密钥和角色授权,pod 实际上采用的是角色授权。
通过增加环境变量开启日志采集。
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:创建角色
新建策略
在新建角色之前,您需要创建一个策略,该策略决定了您的角色具备的权限。
- 登录访问管理控制台,在左侧导航栏选择 策略。
- 在“策略”页面,单击新建自定义策略。
- 在“选择创建策略方式” 弹窗中,选择按策略生成器创建。
- 在“可视化策略生成器”中,“服务”选择 “日志服务(cls)“,”操作“选择”写操作:pushLog“,如下图所示:
- 单击下一步,进入”关联用户/用户组“页面。
- 确认策略名称,单击完成即可创建策略。
新建角色
创建策略完成后,需要将该策略绑定至一个角色,使得该角色具备策略相应的权限。
- 登录访问管理控制台,在左侧导航栏选择 角色。
- 在“角色”页面,单击新建角色。
- 在“选择角色载体” 弹窗中,选择腾讯云产品服务,进入新建自定义角色页面。
- 在“输入角色载体信息”步骤中,选择绑定云服务器(cvm)载体,单击下一步。
注意
必须选择云服务器(cvm)作为角色载体,选择容器服务则无法完成授权。
- 在“配置角色策略”步骤中,选择 已创建的策略,单击下一步。
- 在“审阅”步骤中,输入您的角色名称,审阅您即将创建角色的相关信息,单击完成后即完成自定义角色创建。详情请参见 创建角色。
完成创建角色步骤后,需要在 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 更新日志采集,请参考以下步骤:
- 登录 容器服务控制台,选择左侧导航栏中的集群。
- 在集群管理页面,单击 Serverless 集群 ID,进入集群详情页。
- 选择左侧工作负载,单击需要更新日志采集的工作负载所在行右侧的更新Pod配置 > 显示高级设置,修改对应的配置。如下图所示:
- 单击完成即可更新。
找到需要更新日志采集的工作负载对应的 yaml,根据配置对应变量名的变动修改相应的变量值,变量名对应的含义可在 配置日志采集 查看。
常见问题
如遇问题,您可先查询 Serverless 集群日志采集相关问题。如果您的问题仍未解决,请 联系我们。
本页内容是否解决了您的问题?