由於ECI不支援DaemonSet,在ECI上啟動並執行Job任務運行結束後,Pod會立即退出,因此可能會出現日誌尚未完全採集的情況。建議您為Job掛載NAS檔案系統來儲存記錄檔。本文介紹在ACK叢集中使用ECI來運行Job任務時,如何採集Job任務的日誌。
前提條件
已建立一個ACK叢集並在該叢集上部署了虛擬節點。具體操作,請參見建立ACK託管叢集和通過虛擬節點將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任務日誌。
如果您使用了阿里雲Log ServiceSLS,通過配置環境變數的方式為Job掛載Volume,可以直接同步處理阿里雲Log Service。更多資訊,請參見通過環境變數方式採集日誌。
操作步驟
下文以名為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.yamlYAML檔案內容樣本如下:
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預期返回樣本如下:
