通过Sidecar容器获取GPU-HPN计算类Pod的标准输出和错误输出

GPU-HPN类型的Pod在运行期间,会选择通过标准输出(Stdout)或错误输出(Stderr)打印日志。本文介绍如何通过Sidecar容器的方式,获取GPU-HPN类型Pod的标准输出和错误输出内容。

重要

本文操作仅适用于ACS GPU-HPN类型的Pod。通用计算类Pod和加速计算类Pod获取日志的方式,请参见通过自定义方案采集应用日志

操作步骤

步骤一:部署多容器应用

本步骤将部署一个包含三个容器的GPU-HPN类型工作负载,各容器功能如下:

  • print-stdout容器:打印一条日志到标准输出stdout。

  • print-stderr容器:打印一条日志到标准错误输出stderr。

  • shared-std-volume容器:将所有容器的标准输出,挂载到容器内的/var/log/container-std目录。

  1. 创建dep-with-std-volume.yaml。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: dep-with-std-volume
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: dep-with-std-volume
      template:
        metadata:
          labels:
            alibabacloud.com/compute-class: "gpu-hpn"
            alibabacloud.com/hpn-type: "rdma"
            app: dep-with-std-volume
        spec:
          containers:
          - name: print-stdout
            image: registry.cn-wulanchabu.aliyuncs.com/acs/ubuntu:latest
            # 将日志打印到标准输出
            command: ["bash", "-c", "echo 'this log is from print-stdout container'; tail -f /dev/null"]
            resources:
              requests:
                cpu: "1"
                memory: "1Gi"
              limits:
                cpu: "1"
                memory: "1Gi"
          - name: print-stderr
            image: registry.cn-wulanchabu.aliyuncs.com/acs/ubuntu:latest
            # 将日志打印到标准错误输出
            command: ["bash", "-c", "echo 'this log is from print-stderr container' >&2; tail -f /dev/null"]
            resources:
              requests:
                cpu: "1"
                memory: "1Gi"
              limits:
                cpu: "1"
                memory: "1Gi"
          - name: shared-std-volume
            image: registry.cn-wulanchabu.aliyuncs.com/acs/ubuntu:latest
            command: ["sleep", "infinity"]
            resources:
              requests:
                cpu: "1"
                memory: "1Gi"
              limits:
                cpu: "1"
                memory: "1Gi"
            volumeMounts:
            - mountPath: /var/log/container-std
              name: stdout-volume
          volumes:
          # 声明标准输出的共享volume
          - name: stdout-volume
            emptyDir:
              medium: Stdout
  2. 部署应用。

    kubectl apply -f dep-with-std-volume.yaml
  3. 等待应用启动完成,查看Pod状态。

    kubectl get pod -n default

    预期输出:

    NAME                            READY   STATUS             RESTARTS         AGE
    dep-with-std-volume-xxxx-xxxx   3/3     Running            0                9m

步骤二:验证日志输出

  1. 登录shared-std-volume容器。

    kubectl exec -it dep-with-std-volume-xxxx-xxxx -c shared-std-volume -- /bin/bash
  2. 查看挂载的共享目录。

    ls /var/log/container-std/*

    预期输出:

    /var/log/container-std/print-stderr:
    0.log
    
    /var/log/container-std/print-stdout:
    0.log
    
    /var/log/container-std/shared-std-volume:
    0.log

    可以看到,挂载的目录内有三个子目录,名称与Pod的三个容器名称相同,并且每个目录下存在一个名称为0.log的文件。

  3. 日志文件每行的内容包括:UTC时间、输出来源、换行标记和原始输出内容,以空格进行区分。以下以查看print-stdoutprint-stderr容器的输出内容为例。

    cat /var/log/container-std/print-stdout/*
    cat /var/log/container-std/print-stderr/*

    预期输出:

    2024-10-18T08:48:57.567368449Z stdout F this log is from print-stdout container
    2024-10-18T08:48:57.949367202Z stderr F this log is from print-stderr container
    image
    • 时间:UTC时间,目前不支持自定义。

    • 输出来源:stdout表示标准输出,stderr表示标准错误输出。

    • 当前内容是否有换行:文件内每行最多输出4096个字符,若原始文件内容超出该限制,会在另起一行继续输出。当前行是否有换行情况,会通过字符来标记(FP)。

      • F表示当前行是原始内容的最后一行。

      • P表示当前行并不是原始内容的最后一行。

    • 实际输出内容:来自于容器内打印的输出内容。