LoongCollector是阿里云日志服务(SLS)推出的新一代日志采集 Agent,是 Logtail 的升级版。本文档指导您如何在 Kubernetes 集群中安装 LoongCollector,并提供了 DaemonSet 和 Sidecar 两种安装模式。
准备工作
在安装前,请在集群节点上验证与日志服务服务端点的网络连通性,确保LoongCollector可以正常上报数据。
获取服务接入点:
登录日志服务控制台,在Project列表中,单击目标Project。
单击Project名称右侧的
进入项目概览页面。在基础信息中找到当前Project所在地域的公网和内网Endpoint。
执行连通性测试:登录到将要安装LoongCollector组件的集群节点上,执行以下
curl命令。请将${Project名称}和${SLS_ENDPOINT}替换为您的实际信息。curl https://${Project名称}.${SLS_ENDPOINT}查看测试结果:
如果命令返回
{"Error":{"Code":"OLSInvalidMethod",...}},表明您的节点与日志服务之间的网络是通畅的。说明此测试仅验证网络层连通性。由于请求缺少必要的 API 参数,日志服务返回错误响应是预期结果。
如果命令超时或返回其他网络层错误(如
Connection refused),则表示网络不通,请检查节点的网络配置、安全组规则或 DNS 解析。
选择合适的安装方式
请根据您的集群类型和需求,选择下表中对应的安装方式:
安装方式 | 适用场景 |
采集同阿里云账号、同地域下的 ACK 托管与专有集群日志。 | |
| |
需要对特定业务应用进行日志采集,且有以下需求的场景:
|
ACK集群安装(DaemonSet模式)
如果您当前正在使用logtail-ds,并希望升级到 LoongCollector,请先卸载logtail-ds再安装LoongCollector。
通过阿里云ACK容器服务控制台一键安装LoongCollector,默认将集群容器日志采集到同账号同地域的Project,如需跨账号或跨地域采集请参考自建集群安装(DaemonSet模式)。
为已有ACK托管集群安装
登录容器服务管理控制台,在左侧导航栏选择集群列表。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,单击组件管理。
在日志与监控页签中,找到loongcollector,单击安装。
安装完成后,日志服务会自动在ACK所属地域下创建如下资源,您可登录日志服务控制台查看。
资源类型
资源名称
作用
Project
k8s-log-${cluster_id}资源管理单元,隔离不同业务日志。
机器组
k8s-group-${cluster_id}loongcollector-ds的机器组,主要用于日志采集场景。
k8s-group-${cluster_id}-clusterloongcollector-cluster的机器组,主要用于指标采集场景。
k8s-group-${cluster_id}-singleton单实例机器组,主要用于部分单实例采集配置。
Logstore
config-operation-log重要请勿删除此Logstore。
用于存储LoongCollector组件中的alibaba-log-controller日志,其收费标准与普通Logstore完全相同,具体请参见按写入数据量计费模式计费项。建议不要在此Logstore下创建采集配置。
新建ACK托管集群时安装
登录容器服务管理控制台,在左侧导航栏选择集群列表。
单击创建集群,在组件配置页面,勾选使用日志服务。支持创建新Project或使用已有Project。
本文只描述日志服务相关配置,关于更多配置项说明,请参见创建ACK托管集群。
当您选择创建新Project时,日志服务会默认创建如下资源,您可登录日志服务控制台查看。
资源类型
资源名称
作用
Project
k8s-log-${cluster_id}资源管理单元,隔离不同业务日志。
机器组
k8s-group-${cluster_id}loongcollector-ds的机器组,主要用于日志采集场景。
k8s-group-${cluster_id}-clusterloongcollector-cluster的机器组,主要用于指标采集场景。
k8s-group-${cluster_id}-singleton单实例机器组,主要用于部分单实例采集配置。
Logstore
config-operation-log重要请勿删除此Logstore。
用于存储LoongCollector组件中的alibaba-log-controller日志,其收费标准与普通Logstore完全相同,具体请参见按写入数据量计费模式计费项。建议不要在此Logstore下创建采集配置。
自建集群安装(DaemonSet模式)
适用场景
自建 IDC 机房中的 Kubernetes 集群
部署在其他云厂商的 Kubernetes 集群
跨账号或跨地域采集阿里云 ACK 集群容器日志
请确保您的自建集群满足Kubernetes 1.6及以上版本。
操作指南
下载并解压安装包:在安装并配置了kubectl的机器上,根据集群所在地域选择命令下载LoongCollector及其他依赖组件。
#中国地域 wget https://aliyun-observability-release-cn-shanghai.oss-cn-shanghai.aliyuncs.com/loongcollector/k8s-custom-pkg/3.0.12/loongcollector-custom-k8s-package.tgz; tar xvf loongcollector-custom-k8s-package.tgz; chmod 744 ./loongcollector-custom-k8s-package/k8s-custom-install.sh #海外地域 wget https://aliyun-observability-release-ap-southeast-1.oss-ap-southeast-1.aliyuncs.com/loongcollector/k8s-custom-pkg/3.1.6/loongcollector-custom-k8s-package.tgz; tar xvf loongcollector-custom-k8s-package.tgz; chmod 744 ./loongcollector-custom-k8s-package/k8s-custom-install.sh修改配置文件
values.yaml:进入loongcollector-custom-k8s-package目录,修改配置文件./loongcollector/values.yaml。参数说明
values.yaml
# ===================== 必需要补充的内容 ===================== # 本集群要采集的Project名,例如 k8s-log-custom-sd89ehdq projectName: "" # Project所属地域,例如上海:cn-shanghai region: "" # Project所属主账号uid,请用引号包围,例如"123456789" aliUid: "" # 使用网络,可选参数:公网Internet,内网Intranet,默认使用公网 net: Internet # 主账号或者子账号的AK,SK accessKeyID: "" accessKeySecret: "" # 自定义集群ID,命名只支持大小写,数字,短划线(-)。 clusterID: "" # ...省略非必填参数...projectName
String(必填)Project名称,LoongCollector将上传日志到该Project中。命名规则如下:
项目名称仅支持小写字母、数字和连字符(-)。
必须以小写字母开头,以小写字母和数字结尾。
名称长度为3~63个字符。
region
String(必填)Project所属地域ID,请参考地域查看Project所在地域的ID。
aliUid
String(必填)Project所属的阿里云主账号ID。
net
String(必填)日志数据传输使用的网络类型。
Internet(默认值):公网。
Intranet:内网。
accessKeyID
String(必填)Project所属账号的AccessKey ID。推荐使用RAM用户的AccessKey,并授予RAM用户AliyunLogFullAccess系统策略权限。RAM相关概念请参见RAM用户概览。
accessKeySecret
String(必填)Project所属账号的AccessKey Secret。
clusterID
String(必填)自定义集群ID,命名只支持大小写字母、数字、短划线(-)。
重要不同的Kubernetes集群,请勿配置相同的集群ID。
执行安装脚本:在
loongcollector-custom-k8s-package目录下执行如下命令,安装LoongCollector及其他依赖组件。bash k8s-custom-install.sh install验证安装结果:安装完成后,执行如下命令查看组件状态:
# 检查Pod状态 kubectl get po -n kube-system | grep loongcollector-ds返回结果示例:
loongcollector-ds-gnmnh 1/1 Running 0 63s若组件未成功启动(非Running):
检查配置:请确认
values.yaml配置项是否正确。检查镜像:通过如下命令查看
Events确认容器镜像是否成功拉取。kubectl describe pod loongcollector-ds -n kube-system
组件安装成功后,日志服务会自动创建如下资源,您可登录日志服务控制台查看。
资源类型
资源名称
作用
Project
values.yaml文件中自定义的projectName的值资源管理单元,隔离不同业务日志。
机器组
k8s-group-${cluster_id}日志采集节点集合。
k8s-group-${cluster_id}-clusterloongcollector-cluster的机器组,主要用于指标采集场景。
k8s-group-${cluster_id}-singleton单实例机器组,主要用于部分单实例采集配置。
Logstore
config-operation-log重要请不要删除该Logstore。
用于存储LoongCollector组件中的alibaba-log-controller日志,其收费标准与普通Logstore完全相同,具体请参见按写入数据量计费模式计费项。建议不要在此Logstore下创建采集配置。
Sidecar模式安装
当您需要对特定应用的日志进行精细化管理、实现多租户隔离或确保日志采集与应用生命周期严格绑定时,Sidecar 模式是理想的日志采集方案。该模式通过在业务 Pod 中注入一个独立的 LoongCollector(Logtail) 容器,实现对该 Pod 内日志的专属采集。若尚未部署业务应用,或仅用于测试,可直接使用附录:YAML示例快速验证流程。
1. 修改业务Pod YAML配置
定义共享卷
在
spec.template.spec.volumes中添加三个共享卷(与containers同级):volumes: # 共享日志目录(业务容器写入,Sidecar 读取) - name: ${shared_volume_name} # <-- 名称需与volumeMounts中的name一致 emptyDir: {} # 容器间通信信令目录(用于优雅启停) - name: tasksite emptyDir: medium: Memory # 使用内存作为介质,性能更高 sizeLimit: "50Mi" # 共享主机时区配置:同步Pod内所有容器的时区 - name: tz-config # <-- 名称需与volumeMounts中的name一致 hostPath: path: /usr/share/zoneinfo/Asia/Shanghai # 请按需修改时区配置业务容器挂载
在业务容器(如
your-business-app-container)的volumeMounts中添加以下挂载项:确保业务容器将日志写入
${shared_volume_path}目录,LoongCollector 才能正确采集。volumeMounts: # 挂载共享日志卷到业务日志输出目录 - name: ${shared_volume_name} mountPath: ${shared_volume_path} # 例如:/var/log/app # 挂载通信目录 - name: tasksite mountPath: /tasksite # 与 Loongcollector容器通信的共享目录 # 挂载时区文件 - name: tz-config mountPath: /etc/localtime readOnly: true注入LoongCollector Sidecar容器
在
spec.template.spec.containers数组中追加以下 Sidecar 容器定义:- name: loongcollector image: aliyun-observability-release-registry.cn-shenzhen.cr.aliyuncs.com/loongcollector/loongcollector:v3.1.1.0-20fa5eb-aliyun command: ["/bin/bash", "-c"] args: - | echo "[$(date)] LoongCollector: Starting initialization" # 启动LoongCollector服务 /etc/init.d/loongcollectord start # 等待配置下载和服务就绪 sleep 15 # 验证服务状态 if /etc/init.d/loongcollectord status; then echo "[$(date)] LoongCollector: Service started successfully" touch /tasksite/cornerstone else echo "[$(date)] LoongCollector: Failed to start service" exit 1 fi # 等待业务容器完成(通过 tombstone 文件信号) echo "[$(date)] LoongCollector: Waiting for business container to complete" until [[ -f /tasksite/tombstone ]]; do sleep 2 done # 留出时间上传剩余日志 echo "[$(date)] LoongCollector: Business completed, waiting for log transmission" sleep 30 # 停止服务 echo "[$(date)] LoongCollector: Stopping service" /etc/init.d/loongcollectord stop echo "[$(date)] LoongCollector: Shutdown complete" # 健康检查 livenessProbe: exec: command: ["/etc/init.d/loongcollectord", "status"] initialDelaySeconds: 30 periodSeconds: 10 timeoutSeconds: 5 failureThreshold: 3 # 资源配置 resources: requests: cpu: "100m" memory: "128Mi" limits: cpu: "2000m" memory: "2048Mi" # 环境变量配置 env: - name: ALIYUN_LOGTAIL_USER_ID value: "${your_aliyun_user_id}" - name: ALIYUN_LOGTAIL_USER_DEFINED_ID value: "${your_machine_group_user_defined_id}" - name: ALIYUN_LOGTAIL_CONFIG value: "/etc/ilogtail/conf/${your_region_config}/ilogtail_config.json" # 启用全量排空,确保 Pod 终止前发送所有日志 - name: enable_full_drain_mode value: "true" # 追加 Pod 环境信息作为日志标签 - name: ALIYUN_LOG_ENV_TAGS value: "_pod_name_|_pod_ip_|_namespace_|_node_name_|_node_ip_" # 自动注入 Pod 和 Node 元数据作为日志标签 - name: "_pod_name_" valueFrom: fieldRef: fieldPath: metadata.name - name: "_pod_ip_" valueFrom: fieldRef: fieldPath: status.podIP - name: "_namespace_" valueFrom: fieldRef: fieldPath: metadata.namespace - name: "_node_name_" valueFrom: fieldRef: fieldPath: spec.nodeName - name: "_node_ip_" valueFrom: fieldRef: fieldPath: status.hostIP # 卷挂载(与业务容器共享) volumeMounts: # 只读挂载业务日志目录 - name: ${shared_volume_name} # <-- 共享日志目录名 mountPath: ${dir_containing_your_files} # <-- 共享目录在sidercar中的路径 readOnly: true # 挂载通信目录 - name: tasksite mountPath: /tasksite # 挂载时区 - name: tz-config mountPath: /etc/localtime readOnly: true
2. 改造业务容器生命周期逻辑
根据工作负载类型,需改造业务容器以支持与Sidecar协同退出:
短生命周期任务(Job/CronJob)
# 1. 等待 LoongCollector 准备就绪
echo "[$(date)] Business: Waiting for LoongCollector to be ready..."
until [[ -f /tasksite/cornerstone ]]; do
sleep 1
done
echo "[$(date)] Business: LoongCollector is ready, starting business logic"
# 2. 执行核心业务逻辑(确保日志写入共享目录)
echo "Hello, World!" >> /app/logs/business.log
# 3. 保存退出码
retcode=$?
echo "[$(date)] Business: Task completed with exit code: $retcode"
# 4. 通知LoongCollector业务完成
touch /tasksite/tombstone
echo "[$(date)] Business: Tombstone created, exiting"
exit $retcode长生命周期服务(Deployment / StatefulSet)
# 定义信号处理函数
_term_handler() {
echo "[$(date)] [nginx-demo] Caught SIGTERM, starting graceful shutdown..."
# 发送QUIT信号给Nginx进行优雅停止
if [ -n "$NGINX_PID" ]; then
kill -QUIT "$NGINX_PID" 2>/dev/null || true
echo "[$(date)] [nginx-demo] Sent SIGQUIT to Nginx PID: $NGINX_PID"
# 等待Nginx优雅停止
wait "$NGINX_PID"
EXIT_CODE=$?
echo "[$(date)] [nginx-demo] Nginx stopped with exit code: $EXIT_CODE"
fi
# 通知LoongCollector业务容器已停止
echo "[$(date)] [nginx-demo] Writing tombstone file"
touch /tasksite/tombstone
exit $EXIT_CODE
}
# 注册信号处理
trap _term_handler SIGTERM SIGINT SIGQUIT
# 等待LoongCollector准备就绪
echo "[$(date)] [nginx-demo]: Waiting for LoongCollector to be ready..."
until [[ -f /tasksite/cornerstone ]]; do
sleep 1
done
echo "[$(date)] [nginx-demo]: LoongCollector is ready, starting business logic"
# 启动Nginx
echo "[$(date)] [nginx-demo] Starting Nginx..."
nginx -g 'daemon off;' &
NGINX_PID=$!
echo "[$(date)] [nginx-demo] Nginx started with PID: $NGINX_PID"
# 等待Nginx进程
wait $NGINX_PID
EXIT_CODE=$?
# 非信号导致的退出也要通知LoongCollector
if [ ! -f /tasksite/tombstone ]; then
echo "[$(date)] [nginx-demo] Unexpected exit, writing tombstone"
touch /tasksite/tombstone
fi
exit $EXIT_CODE3. 设置优雅终止时间
在 spec.template.spec 中设置足够的终止宽限期,以确保 LoongCollector 有足够时间上传剩余日志。
spec:
# ... 您现有的其他 spec 配置 ...
template:
spec:
terminationGracePeriodSeconds: 600 # 10分钟优雅停止时间4. 变量说明
变量 | 说明 |
| 设置为您的阿里云账号(主账号)ID。更多信息,请参见配置用户标识。 |
| 自定义设置机器组的自定义标识,用于创建自定义机器组。例如 重要 请确保该标识在您的Project所在地域内唯一。 |
| 请根据日志服务Project所在地域和访问的网络类型填写。其中,地域信息请参见开服地域。 示例:若Project位于华东1(杭州),则以阿里云内网访问时为 |
| 自定义设置卷的名称。 重要
|
| 设置挂载路径,即容器待采集文本日志所在目录。 |
5. 应用配置并验证
执行以下命令部署变更:
kubectl apply -f <YOUR-YAML>查看 Pod 状态,确认 LoongCollector 容器已成功注入:
kubectl describe pod <YOUR-POD-NAME>若看到两个容器(业务容器 +
loongcollector),且状态正常,则注入成功。
6. 创建用户自定义标识机器组
登录日志服务控制台,单击目标Project。
在左侧导航栏中,选择,单击机器组右侧的。
在创建机器组对话框中,配置如下参数,单击确定。
名称:机器组名称,创建后不可修改。命名规则如下:
只能包括小写字母、数字、短划线(-)和下划线(_)。
必须以小写字母或者数字开头和结尾。
长度必须在 2~128 字符之间。
机器组标识:选择用户自定义标识。
用户自定义标识:填入您在1. 修改业务Pod YAML配置YAML文件中为 LoongCollector 容器设置的环境变量
ALIYUN_LOGTAIL_USER_DEFINED_ID的值。必须完全一致,否则无法关联成功。
检查机器组心跳状态:创建完成后,单击目标机器组名称,在机器组状态区域,查看心跳状态。
OK:表示LoongCollector 已成功连接到日志服务,机器组注册成功。
FAIL:
可能是配置未生效,配置生效时间大约需要2分钟,请稍后刷新页面重试。
如果2分钟后仍为FAIL,请参考Logtail机器组问题排查思路进行诊断。
每个 Pod 对应一个独立的 LoongCollector 实例,建议为不同业务或环境使用不同的自定义标识,便于精细化管理。
常见问题
ACK托管集群如何修改LoongCollector配置以实现跨账号或跨地域采集?
如何采集阿里云ACK Edge、ACK One、ACS、ACK Serverless 集群容器日志?
后续步骤
安装完LoongCollector后,您可以查看Kubernetes集群容器日志采集须知了解Kubernetes容器日志采集的核心原理、关键流程、选型建议和最佳实践,并选择合适的方式创建采集配置:
附录:YAML示例
本示例展示了一个完整的 Kubernetes Deployment 配置,包含业务容器(Nginx)和 LoongCollector Sidecar 容器,适用于通过 Sidecar 模式采集容器日志。
使用前请完成以下三项关键替换:
将
${your_aliyun_user_id}替换为您的阿里云主账号 UID;将
${your_machine_group_user_defined_id}替换为步骤三中创建的机器组自定义标识,必须完全一致。将
${your_region_config}替换为与日志服务 Project 所在地域及网络类型匹配的配置名。示例:Project 位于 华东1(杭州),内网访问——>
cn-hangzhou;公网访问——>cn-hangzhou-internet。
短生命周期(Job/CronJob)
apiVersion: batch/v1
kind: Job
metadata:
name: demo-job
spec:
backoffLimit: 3
activeDeadlineSeconds: 3600
completions: 1
parallelism: 1
template:
spec:
restartPolicy: Never
terminationGracePeriodSeconds: 300
containers:
# 业务容器
- name: demo-job
image: debian:bookworm-slim
command: ["/bin/bash", "-c"]
args:
- |
# 等待LoongCollector准备就绪
echo "[$(date)] Business: Waiting for LoongCollector to be ready..."
until [[ -f /tasksite/cornerstone ]]; do
sleep 1
done
echo "[$(date)] Business: LoongCollector is ready, starting business logic"
# 执行业务逻辑
echo "Hello, World!" >> /app/logs/business.log
# 保存退出码
retcode=$?
echo "[$(date)] Business: Task completed with exit code: $retcode"
# 通知LoongCollector业务完成
touch /tasksite/tombstone
echo "[$(date)] Business: Tombstone created, exiting"
exit $retcode
# 资源限制
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "500"
memory: "512Mi"
# 卷挂载
volumeMounts:
- name: app-logs
mountPath: /app/logs
- name: tasksite
mountPath: /tasksite
# LoongCollector Sidecar容器
- name: loongcollector
image: aliyun-observability-release-registry.cn-hongkong.cr.aliyuncs.com/loongcollector/loongcollector:v3.1.1.0-20fa5eb-aliyun
command: ["/bin/bash", "-c"]
args:
- |
echo "[$(date)] LoongCollector: Starting initialization"
# 启动LoongCollector服务
/etc/init.d/loongcollectord start
# 等待配置下载和服务就绪
sleep 15
# 验证服务状态
if /etc/init.d/loongcollectord status; then
echo "[$(date)] LoongCollector: Service started successfully"
touch /tasksite/cornerstone
else
echo "[$(date)] LoongCollector: Failed to start service"
exit 1
fi
# 等待业务容器完成
echo "[$(date)] LoongCollector: Waiting for business container to complete"
until [[ -f /tasksite/tombstone ]]; do
sleep 2
done
echo "[$(date)] LoongCollector: Business completed, waiting for log transmission"
# 给足够时间传输剩余日志
sleep 30
echo "[$(date)] LoongCollector: Stopping service"
/etc/init.d/loongcollectord stop
echo "[$(date)] LoongCollector: Shutdown complete"
# 健康检查
livenessProbe:
exec:
command: ["/etc/init.d/loongcollectord", "status"]
initialDelaySeconds: 30
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 3
# 资源配置
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "500m"
memory: "512Mi"
# 环境变量配置
env:
- name: ALIYUN_LOGTAIL_USER_ID
value: "your-user-id"
- name: ALIYUN_LOGTAIL_USER_DEFINED_ID
value: "your-user-defined-id"
- name: ALIYUN_LOGTAIL_CONFIG
value: "/etc/ilogtail/conf/cn-hongkong/ilogtail_config.json"
- name: ALIYUN_LOG_ENV_TAGS
value: "_pod_name_|_pod_ip_|_namespace_|_node_name_"
# Pod信息注入
- name: "_pod_name_"
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: "_pod_ip_"
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: "_namespace_"
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: "_node_name_"
valueFrom:
fieldRef:
fieldPath: spec.nodeName
# 卷挂载
volumeMounts:
- name: app-logs
mountPath: /app/logs
readOnly: true
- name: tasksite
mountPath: /tasksite
- name: tz-config
mountPath: /etc/localtime
readOnly: true
# 卷定义
volumes:
- name: app-logs
emptyDir: {}
- name: tasksite
emptyDir:
medium: Memory
sizeLimit: "10Mi"
- name: tz-config
hostPath:
path: /usr/share/zoneinfo/Asia/Shanghai
长生命周期(Deployment / StatefulSet)
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-demo
namespace: production
labels:
app: nginx-demo
version: v1.0.0
spec:
replicas: 3
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
selector:
matchLabels:
app: nginx-demo
template:
metadata:
labels:
app: nginx-demo
version: v1.0.0
spec:
terminationGracePeriodSeconds: 600 # 10分钟优雅停止时间
containers:
# 业务容器 - Web应用
- name: nginx-demo
image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
# 启动命令和信号处理
command: ["/bin/sh", "-c"]
args:
- |
# 定义信号处理函数
_term_handler() {
echo "[$(date)] [nginx-demo] Caught SIGTERM, starting graceful shutdown..."
# 发送QUIT信号给Nginx进行优雅停止
if [ -n "$NGINX_PID" ]; then
kill -QUIT "$NGINX_PID" 2>/dev/null || true
echo "[$(date)] [nginx-demo] Sent SIGQUIT to Nginx PID: $NGINX_PID"
# 等待Nginx优雅停止
wait "$NGINX_PID"
EXIT_CODE=$?
echo "[$(date)] [nginx-demo] Nginx stopped with exit code: $EXIT_CODE"
fi
# 通知LoongCollector业务容器已停止
echo "[$(date)] [nginx-demo] Writing tombstone file"
touch /tasksite/tombstone
exit $EXIT_CODE
}
# 注册信号处理
trap _term_handler SIGTERM SIGINT SIGQUIT
# 等待LoongCollector准备就绪
echo "[$(date)] [nginx-demo]: Waiting for LoongCollector to be ready..."
until [[ -f /tasksite/cornerstone ]]; do
sleep 1
done
echo "[$(date)] [nginx-demo]: LoongCollector is ready, starting business logic"
# 启动Nginx
echo "[$(date)] [nginx-demo] Starting Nginx..."
nginx -g 'daemon off;' &
NGINX_PID=$!
echo "[$(date)] [nginx-demo] Nginx started with PID: $NGINX_PID"
# 等待Nginx进程
wait $NGINX_PID
EXIT_CODE=$?
# 非信号导致的退出也要通知LoongCollector
if [ ! -f /tasksite/tombstone ]; then
echo "[$(date)] [nginx-demo] Unexpected exit, writing tombstone"
touch /tasksite/tombstone
fi
exit $EXIT_CODE
# 资源配置
resources:
requests:
cpu: "200m"
memory: "256Mi"
limits:
cpu: "1000m"
memory: "1Gi"
# 卷挂载
volumeMounts:
- name: nginx-logs
mountPath: /var/log/nginx
- name: tasksite
mountPath: /tasksite
- name: tz-config
mountPath: /etc/localtime
readOnly: true
# LoongCollector Sidecar容器
- name: loongcollector
image: aliyun-observability-release-registry.cn-shenzhen.cr.aliyuncs.com/loongcollector/loongcollector:v3.1.1.0-20fa5eb-aliyun
command: ["/bin/bash", "-c"]
args:
- |
echo "[$(date)] LoongCollector: Starting initialization"
# 启动LoongCollector服务
/etc/init.d/loongcollectord start
# 等待配置下载和服务就绪
sleep 15
# 验证服务状态
if /etc/init.d/loongcollectord status; then
echo "[$(date)] LoongCollector: Service started successfully"
touch /tasksite/cornerstone
else
echo "[$(date)] LoongCollector: Failed to start service"
exit 1
fi
# 等待业务容器完成
echo "[$(date)] LoongCollector: Waiting for business container to complete"
until [[ -f /tasksite/tombstone ]]; do
sleep 2
done
echo "[$(date)] LoongCollector: Business completed, waiting for log transmission"
# 给足够时间传输剩余日志
sleep 30
echo "[$(date)] LoongCollector: Stopping service"
/etc/init.d/loongcollectord stop
echo "[$(date)] LoongCollector: Shutdown complete"
# 健康检查
livenessProbe:
exec:
command: ["/etc/init.d/loongcollectord", "status"]
initialDelaySeconds: 30
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 3
# 资源配置
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "2000m"
memory: "2048Mi"
# 环境变量配置
env:
- name: ALIYUN_LOGTAIL_USER_ID
value: "${your_aliyun_user_id}"
- name: ALIYUN_LOGTAIL_USER_DEFINED_ID
value: "${your_machine_group_user_defined_id}"
- name: ALIYUN_LOGTAIL_CONFIG
value: "/etc/ilogtail/conf/${your_region_config}/ilogtail_config.json"
# 启用全量排空模式,确保Pod停止时发送所有日志
- name: enable_full_drain_mode
value: "true"
# 追加 Pod 环境信息作为日志标签
- name: "ALIYUN_LOG_ENV_TAGS"
value: "_pod_name_|_pod_ip_|_namespace_|_node_name_|_node_ip_"
# 获取 Pod 和 Node 的信息
- name: "_pod_name_"
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: "_pod_ip_"
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: "_namespace_"
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: "_node_name_"
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: "_node_ip_"
valueFrom:
fieldRef:
fieldPath: status.hostIP
# 卷挂载
volumeMounts:
- name: nginx-logs
mountPath: /var/log/nginx
readOnly: true
- name: tasksite
mountPath: /tasksite
- name: tz-config
mountPath: /etc/localtime
readOnly: true
# 卷定义
volumes:
- name: nginx-logs
emptyDir: {}
- name: tasksite
emptyDir:
medium: Memory
sizeLimit: "50Mi"
- name: tz-config
hostPath:
path: /usr/share/zoneinfo/Asia/Shanghai
> 创建机器组