由于ECI不支持DaemonSet,在ECI上运行的Job任务运行结束后,Pod会立即退出,因此可能会出现日志尚未完全采集的情况。建议您为Job挂载NAS文件系统来保存日志文件。本文介绍在ACK集群中使用ECI来运行Job任务时,如何采集Job任务的日志。
前提条件
已创建一个ACK集群并在该集群上部署了虚拟节点。具体操作,请参见创建Kubernetes托管版集群和通过虚拟节点将Pod调度到ECI上运行。
已为Namespace添加
alibabacloud.com/eci=true
的Label。通过配置Namespace Label的方式可以将Pod调度到ECI上运行。更多信息,请参见调度Pod到x86架构的虚拟节点。
背景信息
在ACK集群中,对于在标准节点的ECS上运行的Job任务,可以通过DaemonSet的方式来采集日志。但是对于在虚拟节点的ECI上运行的Job任务,由于ECI不支持DaemonSet,当Job任务运行结束后,Pod会立即退出,此时日志可能还未被采集完成。
针对上述场景,您可以采用以下方式来采集ECI上运行的Job任务的日志:
为Job挂载NAS文件系统,将输出的日志保存到NAS文件系统上。
将收集了Job任务日志的NAS文件系统挂载到另一个Pod上,获取NAS文件系统中存储的Job任务日志。
如果您使用了阿里云日志服务SLS,通过配置环境变量的方式为Job挂载Volume,可以直接同步阿里云日志服务。更多信息,请参见通过环境变量方式采集日志。
操作步骤
下文以名为vk的Namespace为例说明操作步骤,该Namespace已添加alibabacloud.com/eci=true
的Label,部署在该Namespace下的Pod将被调度到ECI上运行。实际配置时请替换为您要使用的Namespace。
准备Job任务的YAML配置文件。
vim job.yaml
以下为一个计算π值的Job任务配置示例:
apiVersion: batch/v1 kind: Job metadata: name: pi spec: template: spec: containers: - name: pi image: resouer/ubuntu-bc command: ["sh", "-c", "echo 'scale=1000; 4*a(1)' | bc -l > /eci/a.log 2>&1"] # 输出结果重定向到指定文件 volumeMounts: - name: log-volume mountPath: /eci readOnly: false restartPolicy: Never volumes: # 挂载NAS文件系统用于存储日志 - name: log-volume nfs: server: 04edd48c7c-****.cn-hangzhou.nas.aliyuncs.com path: / readOnly: false backoffLimit: 4
部署Job。
kubectl apply -f job.yaml -n vk
查看Pod状态,确认Job是否已正常运行。
kubectl get pod -n vk
预期返回示例如下:
准备用于采集Job任务日志的Pod的配置文件。
vim log-collection.yaml
YAML文件内容示例如下:
apiVersion: v1 kind: Pod metadata: name: log-collection spec: containers: - image: nginx:latest name: log-collection command: ['/bin/sh', '-c', 'echo &(cat /eci/a.log)'] # 输出Job任务的日志文件 volumeMounts: - mountPath: /eci name: log-volume restartPolicy: Never volumes: # 挂载存储了Job任务日志的NAS文件系统 - name: log-volume nfs: server: 04edd48c7c-****.cn-hangzhou.nas.aliyuncs.com path: / readOnly: false
部署Pod。
kubectl apply -f log-collection.yaml -n vk
确认Pod运行结束,然后查看Job任务的日志文件。
kubectl get pod -n vk kubectl logs log-collection -n vk
预期返回示例如下: