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
目录。
创建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
部署应用。
kubectl apply -f dep-with-std-volume.yaml
等待应用启动完成,查看Pod状态。
kubectl get pod -n default
预期输出:
NAME READY STATUS RESTARTS AGE dep-with-std-volume-xxxx-xxxx 3/3 Running 0 9m
步骤二:验证日志输出
登录shared-std-volume容器。
kubectl exec -it dep-with-std-volume-xxxx-xxxx -c shared-std-volume -- /bin/bash
查看挂载的共享目录。
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
的文件。日志文件每行的内容包括:UTC时间、输出来源、换行标记和原始输出内容,以空格进行区分。以下以查看
print-stdout
和print-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
时间:UTC时间,目前不支持自定义。
输出来源:
stdout
表示标准输出,stderr
表示标准错误输出。当前内容是否有换行:文件内每行最多输出4096个字符,若原始文件内容超出该限制,会在另起一行继续输出。当前行是否有换行情况,会通过字符来标记(
F
或P
)。F
表示当前行是原始内容的最后一行。P
表示当前行并不是原始内容的最后一行。
实际输出内容:来自于容器内打印的输出内容。