安装配置

LoongCollector是阿里云日志服务(SLS)推出的新一代日志采集 Agent,是 Logtail 的升级版。本文档指导您如何在 Kubernetes 集群中安装 LoongCollector,并提供了 DaemonSet 和 Sidecar 两种安装模式。

准备工作

在安装前,请在集群节点上验证与日志服务服务端点的网络连通性,确保LoongCollector可以正常上报数据。

  1. 获取服务接入点:

    1. 登录日志服务控制台,在Project列表中,单击目标Project。

    2. 单击Project名称右侧的image进入项目概览页面。

    3. 在基础信息中找到当前Project所在地域的公网和内网Endpoint。

  2. 执行连通性测试:登录到将要安装LoongCollector组件的集群节点上,执行以下 curl 命令。请将 ${Project名称}${SLS_ENDPOINT} 替换为您的实际信息。

    curl https://${Project名称}.${SLS_ENDPOINT}
  3. 查看测试结果:

    • 如果命令返回{"Error":{"Code":"OLSInvalidMethod",...}},表明您的节点与日志服务之间的网络是通畅的。

      说明

      此测试仅验证网络层连通性。由于请求缺少必要的 API 参数,日志服务返回错误响应是预期结果。

    • 如果命令超时或返回其他网络层错误(如 Connection refused),则表示网络不通,请检查节点的网络配置、安全组规则或 DNS 解析。

选择合适的安装方式

请根据您的集群类型和需求,选择下表中对应的安装方式:

安装方式

适用场景

ACK集群安装(DaemonSet模式)

采集同阿里云账号、同地域下的 ACK 托管与专有集群日志。

自建集群安装(DaemonSet模式)

  • 跨阿里云账号或跨地域采集阿里云 ACK 集群日志。

  • 采集部署在自建 IDC 机房中的 Kubernetes 集群日志。

  • 采集部署在其他云服务商上的 Kubernetes 集群日志。

Sidecar模式安装

需要对特定业务应用进行日志采集,且有以下需求的场景:

  • 资源隔离:避免 DaemonSet 模式影响节点上其他 Pod。

  • 精细化采集:为每个应用单独配置采集源、过滤规则、输出目标等。

ACK集群安装(DaemonSet模式)

说明

如果您当前正在使用logtail-ds,并希望升级到 LoongCollector,请先卸载logtail-ds再安装LoongCollector。

通过阿里云ACK容器服务控制台一键安装LoongCollector,默认将集群容器日志采集到同账号同地域的Project,如需跨账号或跨地域采集请参考自建集群安装(DaemonSet模式)

为已有ACK托管集群安装

  1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,单击组件管理

  3. 日志与监控页签中,找到loongcollector,单击安装

  4. 安装完成后,日志服务会自动在ACK所属地域下创建如下资源,您可登录日志服务控制台查看

    资源类型

    资源名称

    作用

    Project

    k8s-log-${cluster_id}

    资源管理单元,隔离不同业务日志。

    机器组

    k8s-group-${cluster_id}

    loongcollector-ds的机器组,主要用于日志采集场景。

    k8s-group-${cluster_id}-cluster

    loongcollector-cluster的机器组,主要用于指标采集场景。

    k8s-group-${cluster_id}-singleton

    单实例机器组,主要用于部分单实例采集配置。

    Logstore

    config-operation-log

    重要

    请勿删除此Logstore。

    用于存储LoongCollector组件中的alibaba-log-controller日志,其收费标准与普通Logstore完全相同,具体请参见按写入数据量计费模式计费项建议不要在此Logstore下创建采集配置。

新建ACK托管集群时安装

  1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

  2. 单击创建集群,在组件配置页面,勾选使用日志服务。支持创建新Project使用已有Project。

    本文只描述日志服务相关配置,关于更多配置项说明,请参见创建ACK托管集群
  3. 当您选择创建新Project时,日志服务会默认创建如下资源,您可登录日志服务控制台查看

    资源类型

    资源名称

    作用

    Project

    k8s-log-${cluster_id}

    资源管理单元,隔离不同业务日志。

    机器组

    k8s-group-${cluster_id}

    loongcollector-ds的机器组,主要用于日志采集场景。

    k8s-group-${cluster_id}-cluster

    loongcollector-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及以上版本。

操作指南

  1. 下载并解压安装包:在安装并配置了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
  2. 修改配置文件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。

  3. 执行安装脚本:在loongcollector-custom-k8s-package目录下执行如下命令,安装LoongCollector及其他依赖组件。

    bash k8s-custom-install.sh install
  4. 验证安装结果:安装完成后,执行如下命令查看组件状态:

    # 检查Pod状态
    kubectl get po -n kube-system | grep loongcollector-ds

    返回结果示例:

    loongcollector-ds-gnmnh   1/1     Running   0    63s

    若组件未成功启动(非Running):

    1. 检查配置:请确认values.yaml配置项是否正确。

    2. 检查镜像:通过如下命令查看Events确认容器镜像是否成功拉取。

      kubectl describe pod loongcollector-ds -n kube-system
  5. 组件安装成功后,日志服务会自动创建如下资源,您可登录日志服务控制台查看

    资源类型

    资源名称

    作用

    Project

    values.yaml文件中自定义的projectName的值

    资源管理单元,隔离不同业务日志。

    机器组

    k8s-group-${cluster_id}

    日志采集节点集合。

    k8s-group-${cluster_id}-cluster

    loongcollector-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配置

  1. 定义共享卷

    在 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  # 请按需修改时区
    
  2. 配置业务容器挂载

    在业务容器(如 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
    
  3. 注入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_CODE

3. 设置优雅终止时间

在 spec.template.spec 中设置足够的终止宽限期,以确保 LoongCollector 有足够时间上传剩余日志。

spec:
  # ... 您现有的其他 spec 配置 ...
  template:
    spec:
      terminationGracePeriodSeconds: 600  # 10分钟优雅停止时间

4. 变量说明

变量

说明

${your_aliyun_user_id}

设置为您的阿里云账号(主账号)ID。更多信息,请参见配置用户标识

${your_machine_group_user_defined_id}

自定义设置机器组的自定义标识,用于创建自定义机器组。例如nginx-log-sidecar

重要

请确保该标识在您的Project所在地域内唯一。

${your_region_config}

请根据日志服务Project所在地域和访问的网络类型填写。其中,地域信息请参见开服地域

示例:若Project位于华东1(杭州),则以阿里云内网访问时为cn-hangzhou,公网访问时使用cn-hangzhou-internet

${shared_volume_name}

自定义设置卷的名称。

重要

volumeMounts节点下的name参数与volumes节点下的name参数需设置为一致,即确保LoongCollector容器和业务容器挂载相同的卷上。

${dir_containing_your_files}

设置挂载路径,即容器待采集文本日志所在目录。

5. 应用配置并验证

  1. 执行以下命令部署变更:

    kubectl apply -f <YOUR-YAML>
  2. 查看 Pod 状态,确认 LoongCollector 容器已成功注入:

    kubectl describe pod <YOUR-POD-NAME>

    若看到两个容器(业务容器 + loongcollector),且状态正常,则注入成功。

6. 创建用户自定义标识机器组

  1. 登录日志服务控制台,单击目标Project。

  2. 在左侧导航栏中,选择image资源 > 机器组,单击机器组右侧的机器组 > 创建机器组

  3. 创建机器组对话框中,配置如下参数,单击确定

    • 名称:机器组名称,创建后不可修改。命名规则如下:

      • 只能包括小写字母、数字、短划线(-)和下划线(_)。

      • 必须以小写字母或者数字开头和结尾。

      • 长度必须在 2~128 字符之间。

    • 机器组标识:选择用户自定义标识

    • 用户自定义标识:填入您在1. 修改业务Pod YAML配置YAML文件中为 LoongCollector 容器设置的环境变量ALIYUN_LOGTAIL_USER_DEFINED_ID 的值。必须完全一致,否则无法关联成功。

  4. 检查机器组心跳状态:创建完成后,单击目标机器组名称,在机器组状态区域,查看心跳状态。

    • OK:表示LoongCollector 已成功连接到日志服务,机器组注册成功。

    • FAIL:

      • 可能是配置未生效,配置生效时间大约需要2分钟,请稍后刷新页面重试。

      • 如果2分钟后仍为FAIL,请参考Logtail机器组问题排查思路进行诊断。

每个 Pod 对应一个独立的 LoongCollector 实例,建议为不同业务或环境使用不同的自定义标识,便于精细化管理。

常见问题

ACK托管集群如何修改LoongCollector配置以实现跨账号或跨地域采集?

如果您通过阿里云ACK容器服务控制台安装了loongcollector,默认将采集集群容器日志到同账号的日志服务Project下。此时您可以通过以下两种方式实现集群容器日志的跨账号或跨地域采集:

方法一:卸载后重新安装。

  1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,单击组件管理

  3. 日志与监控页签中,找到loongcollector,单击卸载

  4. 参考自建集群安装(DaemonSet模式)重新安装即可。

方法二:更新Helm配置,重新部署loongcollector。

  1. 登录容器服务管理控制台,在左侧导航栏,选择应用 > Helm

  2. Helm应用管理页面,找到loongcollector,单击其右侧操作列中的更新按钮,进入更新发布页面,参考如下表格修改相关配置,其他配置保持不变,单击确定

    集群与Project

    需要修改的配置

    同账号,不同地域

    region:Project所在地域对应的RegionID

    net:Internet,不同地域之间无法通过内网互通,请使用公网传输数据。

    不同账号,同地域

    aliUid:日志服务所属的主账号ID,多个账号之间使用半角逗号(,)相隔。

    net:Intranet,同地域建议优先使用内网传输数据。

    不同账号,不同地域

    aliUid:日志服务所属的主账号ID,多个账号之间使用半角逗号(,)相隔。

    region:Project所在地域的RegionID

    net:Internet,不同地域之间无法通过内网互通,请使用公网传输数据。

  3. 创建机器组

    1. 登录日志服务控制台,单击目标Project。

    2. 在左侧导航栏中,选择image资源 > 机器组,单击机器组右侧的机器组 > 创建机器组

    3. 创建机器组对话框中,配置如下参数,然后单击确定

      1. 设置机器组名称。

      2. 机器组标识:选择用户自定义标识

      3. 用户自定义标识:k8s-group-${cluster_id},请将${cluster_id}替换集群实际的clusterID

    4. 创建完成后,在机器组列表,单击新建的机器组,在机器组配置 > 机器组状态区域,查看心跳状态。如果心跳为OK则表示创建成功。若心跳失败,请检查用户标识与用户自定义标识内容是否正确。

  4. 修改完成后,单击 更新 使配置生效。


如何采集阿里云ACK Edge、ACK One、ACS、ACK Serverless 集群容器日志?

后续步骤

安装完LoongCollector后,您可以查看Kubernetes集群容器日志采集须知了解Kubernetes容器日志采集的核心原理、关键流程、选型建议和最佳实践,并选择合适的方式创建采集配置:

附录:YAML示例

本示例展示了一个完整的 Kubernetes Deployment 配置,包含业务容器(Nginx)和 LoongCollector Sidecar 容器,适用于通过 Sidecar 模式采集容器日志。

使用前请完成以下三项关键替换:

  1. ${your_aliyun_user_id}替换为您的阿里云主账号 UID;

  2. ${your_machine_group_user_defined_id}替换为步骤三中创建的机器组自定义标识,必须完全一致。

  3. 将 ${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

相关参考

地域

  1. 登录日志服务控制台,在Project列表中,单击目标Project。

  2. 单击Project名称右侧的image进入项目概览页面。

  3. 在基础信息中可查看当前Project的地域名称,地域名称对应RegionID请参考下表。

    地域代表云服务资源的物理数据中心所在的地理位置RegionID 是云服务地域的唯一标识符。

    地域名称

    RegionID

    华北1(青岛)

    cn-qingdao

    华北2(北京)

    cn-beijing

    华北3(张家口)

    cn-zhangjiakou

    华北5(呼和浩特)

    cn-huhehaote

    华北6(乌兰察布)

    cn-wulanchabu

    华东1(杭州)

    cn-hangzhou

    华东2(上海)

    cn-shanghai

    华东5(南京-本地地域-关停中)

    cn-nanjing

    华东6(福州-本地地域-关停中)

    cn-fuzhou

    华南1(深圳)

    cn-shenzhen

    华南2(河源)

    cn-heyuan

    华南3(广州)

    cn-guangzhou

    菲律宾(马尼拉)

    ap-southeast-6

    韩国(首尔)

    ap-northeast-2

    马来西亚(吉隆坡)

    ap-southeast-3

    日本(东京)

    ap-northeast-1

    泰国(曼谷)

    ap-southeast-7

    西南1(成都)

    cn-chengdu

    新加坡

    ap-southeast-1

    印度尼西亚(雅加达)

    ap-southeast-5

    中国香港

    cn-hongkong

    德国(法兰克福)

    eu-central-1

    美国(弗吉尼亚)

    us-east-1

    美国(硅谷)

    us-west-1

    英国(伦敦)

    eu-west-1

    阿联酋(迪拜)

    me-east-1

    沙特(利雅得)

    me-central-1

Loongcollector网络传输类型

服务入口(Endpoint)表示日志服务对外服务的访问域名,是访问一个项目(Project)及其内部日志数据的URL,与Project所在的地域相关。日志服务提供私网域名、公网域名与传输加速域名。可通过如下操作查看域名:

  1. 登录日志服务控制台,在Project列表中,单击目标Project。

  2. 单击Project名称右侧的image进入项目概览页面。

  3. 在访问域名中可查看当前Project的域名信息,不同的网络传输方式对应不同的域名。合适的网络传输方式有利于日志数据的传输更快速稳定。

网络类型

对应域名类型

描述

适用场景

阿里云内网

私网域名

阿里云内网为千兆共享网络,日志数据通过阿里云内网传输比公网传输更快速、稳定,内网包括VPC和经典网络。

ECS实例和日志服务Project属于同一地域或自建服务器打通内网的情况。

说明

推荐在ECS所在地域创建日志服务Project,通过阿里云内网采集ECS中日志,不消耗公网带宽。

公网

公网域名

使用公网传输日志数据,不仅会受到网络带宽的限制,还可能会因网络抖动、延迟、丢包等影响数据采集的速度和稳定性。

以下两种情况,可以选择公网传输数据。

  • ECS实例和日志服务Project属于不同地域。

  • 服务器为其他云厂商服务器或自建IDC。

传输加速

传输加速域名

利用阿里云CDN边缘节点进行日志采集加速,相对公网采集在网络延迟、稳定性上具有很大优势,但流量需额外计费。 

如果业务服务器、日志服务Project分别属于国内地域和国外地域,使用公网传输数据可能会出现网络延迟高、传输不稳定等问题,您可以选择传输加速传输数据。更多信息,请参见传输加速

Loongcollector运行模式

特性

DaemonSet模式

Sidecar模式

部署方式

每个节点部署1个采集容器

每个Pod部署1个采集容器

资源消耗

低(共享节点资源)

较高(每个Pod单独占用)

适用场景

节点级统一日志采集

特定应用独立隔离采集

隔离性

节点级共享

Pod级独立

DaemonSet模式原理

在集群的每个Node节点上部署一个 LoongCollector,负责采集该节点上所有容器的日志;特点:运维简单、资源占用少、配置方式灵活;但是隔离性较弱。

  • DaemonSet模式中,Kubernetes集群确保每个节点(Node)只运行一个LoongCollector容器,用于采集当前节点内所有容器(Containers)的日志。

  • 当新节点加入集群时,Kubernetes集群会自动在新节点上创建LoongCollector容器;当节点退出集群时,Kubernetes集群会自动销毁当前节点上的LoongCollector容器。通过DaemonSet的自动扩缩容机制以及标识型机器组,无需手动管理LoongCollector实例。

image

Sidecar模式原理

每个 Pod 中伴随业务容器注入一个 LoongCollector Sidecar容器,并将业务容器的日志目录通过K8sVolume机制(如emptyDir、hostPath、PVC等)挂载为共享卷。这样,日志文件会同时出现在业务容器和Sidecar容器的挂载路径下,LoongCollector就能直接读取这些日志文件;特点:多租户隔离性好、性能好;但资源占用较多,配置与维护较复杂。

  • Sidecar模式中,每个容器组(Pod)运行一个LoongCollector容器,用于采集当前容器组(Pod)所有容器(Containers)的日志。不同Pod的日志采集相互隔离。

  • 为了采集同一Pod中其他容器的日志文件,需要通过共享存储卷的方式来完成,需要将同一份存储卷分别挂载到业务容器和LoongCollector容器。

  • 当一个节点上的 Pod 数据量异常庞大,远超出 Daemonset 的采集性能上限时,Sidecar模式允许我们为LoongCollector分配特定的资源,从而提升其日志采集的性能和稳定性。

  • 在 Serverless 容器中缺乏节点的概念,传统的 Daemonset 部署模式无法应用。此时,SideCar 模式能够有效地与无服务器架构结合,保证日志采集过程的灵活性和适应性。

image