如何從 CloudWatch Logs 擷取 Amazon EKS 控制平面日誌?
我想收集在 Amazon Elastic Kubernetes Service (Amazon EKS) 控制平面上執行元件的日誌。
解決方法
**先決條件:**若要在 Amazon CloudWatch Logs 中檢視您的日誌事件,您必須在叢集中啟用 Amazon EKS 控制平面日誌。
若要存取您的 Amazon EKS 控制平面日誌,請使用 CloudWatch Logs Insights。接著,查詢 Amazon EKS 控制平面日誌資料。
檢視您的 Amazon EKS 控制平面日誌
請完成以下步驟:
- 開啟 Amazon CloudWatch console (Amazon CloudWatch 主控台)。
- 在導覽窗格中,選擇 Logs (日誌),然後選擇 Log Insights。
- 在 Select log group(s) (選取日誌群組) 功能表中,選取您要查詢的叢集日誌群組。
- 選擇 Run (執行) 以檢視結果。
**注意:**若要將結果匯出為 .csv 檔案或將結果複製到剪貼簿,請選擇 Export results (匯出結果)。若要取得特定使用案例的資料,請變更範例查詢。
常見 Amazon EKS 使用案例的範例查詢
**注意:**您可以在 CloudWatch Logs Insights 中儲存並重新執行查詢。
以下查詢是常見 Amazon EKS 使用案例的範例。
尋找變更性修改
若要找出對 aws-auth ConfigMap 所做的變更性修改,請執行以下查詢:
fields @logStream, @timestamp, @message | filter @logStream like /^kube-apiserver-audit/ | filter requestURI like /\/api\/v1\/namespaces\/kube-system\/configmaps/ | filter objectRef.name = "aws-auth" | filter verb like /(create|delete|patch|update)/ | sort @timestamp desc | limit 50
找出遭拒絕的請求
若要找出包含 denied (拒絕) 狀態的訊息,請執行以下查詢:
fields @logStream, @timestamp, @message | filter @logStream like /authenticator/ | filter @message like "denied" | sort @timestamp asc | limit 50
尋找已排程 Pod 的節點
若要找出您將 Pod 排程到哪個節點,請執行以下查詢:
fields @timestamp, @message | filter @logStream like /kube-scheduler/ | filter @message like "example-pod-name" | filter @message like "ip-" | sort @timestamp asc | limit 3
**注意:**將 example-pod-name 替換為您的 Pod 名稱。
尋找 HTTP 5xx 伺服器錯誤
若要找出 Kubernetes API 伺服器請求的 HTTP 5xx 伺服器錯誤,請執行以下查詢:
fields @logStream, @timestamp, responseStatus.code, @message | filter @logStream like /^kube-apiserver-audit/ | filter responseStatus.code >= 500 | limit 50
對 CronJob 物件啟用問題進行疑難排解
若要找出 cronjob-controller 所做的 API 操作,請執行以下查詢:
fields @logStream, @timestamp, @message | filter @logStream like /kube-apiserver-audit/ | filter user.username like "system:serviceaccount:kube-system:cronjob-controller" | display @logStream, @timestamp, @message, objectRef.namespace, objectRef.name | sort @timestamp desc | limit 50
尋找 replicaset-controller API 操作
若要找出 replicaset-controller 所做的 API 操作,請執行以下查詢:
fields @logStream, @timestamp, @message | filter @logStream like /kube-apiserver-audit/ | filter user.username like "system:serviceaccount:kube-system:replicaset-controller" | display @logStream, @timestamp, requestURI, verb, user.username | sort @timestamp desc | limit 50
尋找並計算 HTTP 回應代碼
若要計算對 Kubernetes API 伺服器所發出呼叫的 HTTP 回應代碼數量,請執行以下查詢:
fields @logStream, @timestamp, @message |filter @logStream like /^kube-apiserver-audit/ | stats count(*) as count by responseStatus.code | sort count desc
範例輸出:
responseStatus.code,count 200,35066 201,525 403,125 404,116 101,2
**注意:**輸出顯示 HTTP 200 有 35,066 個成功請求、HTTP 201 有 525 個已建立資源,以及 HTTP 403 有 125 個禁止請求。輸出也顯示 HTTP 404 有 116 個找不到錯誤,以及 HTTP 101 有 2 個切換通訊協定請求。
尋找對 DaemonSets 或附加元件所做的變更
若要找出您在 kube-system 命名空間中對 DaemonSets 或附加元件所做的變更,請執行以下查詢:
filter @logStream like /^kube-apiserver-audit/ | fields @logStream, @timestamp, @message | filter verb like /(create|update|delete)/ and strcontains(requestURI,"/apis/apps/v1/namespaces/kube-system/daemonsets") | sort @timestamp desc | limit 50
尋找 patch、update、create 和 delete 呼叫
若要找出與特定部署及部署 Pod 相關的所有 patch、update、create 和 delete 呼叫,請執行以下查詢:
fields @timestamp, verb, objectRef.name, objectRef.resource, requestObject.message | filter objectRef.name like /example-deployment-name/ | filter objectRef.resource not like /serviceaccounts/ | filter objectRef.resource not like /events/ | filter verb like /create|delete|patch|update/ | sort @timestamp asc
**注意:**將 example-deployment-name 替換為您的部署名稱。若要排除事件,您可以從查詢中移除 | filter objectRef.resource not like /events/。
識別刪除節點或資源的使用者
若要找出刪除節點的使用者,請執行以下查詢:
fields @logStream, @timestamp, @message | filter @logStream like /^kube-apiserver-audit/ | filter verb == "delete" and requestURI like "/api/v1/nodes" | sort @timestamp desc | limit 10
若要找出刪除資源 (例如 ConfigMap、Pod 或部署) 的使用者,請執行以下查詢:
fields @timestamp,verb, user.username, user.extra.arn.0, user.extra.canonicalArn.0 | filter objectRef.name like /aws-auth/ | filter verb like /delete/ | sort @timestamp asc
**注意:**若要找出您 Pod 的 delete 呼叫,請將 aws-auth 替換為您的 Pod 名稱。
尋找部署的映像版本
若要找出部署的映像版本,請執行以下查詢:
fields @timestamp, verb, objectRef.name, objectRef.resource | filter objectRef.name like /example-deployment-name/ | filter @message like /image/ | filter objectRef.resource like /deployments/ | parse requestObject.spec.template.spec 'image':*, as image | sort @timestamp asc | limit 10000
**注意:**將 example-deployment-name 替換為您的部署名稱。
識別特定節點的事件
若要找出未更新的節點,請執行以下查詢:
fields @timestamp, @message, @logStream | sort @timestamp asc | filter @message like "node example-node-name hasn't been updated for"
**注意:**將 example-node-name 替換為您的節點名稱。
若要檢查特定節點參數的最後轉換時間,請執行以下查詢:
fields @timestamp | parse responseObject.status.conditions.0 "lastTransitionTime*" as MemoryPressure | parse responseObject.status.conditions.1 "lastTransitionTime*" as DiskPressure | parse responseObject.status.conditions.2 "lastTransitionTime*" as PIDPressure | parse responseObject.status.conditions.3 "lastTransitionTime*" as ReadyStatus | parse responseObject.status.conditions.3 "lastTransitionTime*" as Timepass | filter objectRef.name like /example-node-name/ | filter verb like /patch/ | filter @message like /lastTransitionTime/ | sort @timestamp asc
**注意:**將 example-node-name 替換為您的節點名稱。
識別將節點設為 cordoned 的使用者
若要找出將特定節點設為 cordoned 或讓節點無法排程的使用者,請執行以下查詢:
fields @timestamp, objectRef.name as node_name, verb,user.username, user.extra.sessionName.0 as name, requestObject.spec.unschedulable as unschedulable_flag| filter @logStream like /kube-apiserver-audit/ | filter @message like /example-node-IP/ | filter verb like /patch/ | filter requestObject.spec.unschedulable like /1/
**注意:**將 example-node-IP 替換為您的節點 IP 位址。
識別已刪除 Pod 的 podIP
若要找出已刪除 Pod 的 podIP,請執行以下查詢:
fields @timestamp,objectRef.name as pod, requestObject.status.podIP as podIP | filter @logStream like /kube-apiserver-audit/ | filter objectRef.name = "example-pod-name" | filter verb like /patch/ | filter ispresent(requestObject.status.podIP) | sort @timestamp asc
**注意:**將 example-pod-name 替換為您的 Pod 名稱。
尋找未知 Pod 的物件輸出
若要在不知道 Pod 名稱的情況下檢視已刪除 Pod 的 describe 輸出,請執行以下查詢:
fields @timestamp, requestURI, requestObject.message | filter requestURI like '/api/v1/namespaces/example-namespace/events' | filter responseObject.involvedObject.name like /example-deployment-name/ | sort @timestamp asc
**注意:**將 example-deployment-name 替換為您的部署名稱,並將 example-namespace 替換為您的命名空間。如果多個命名空間中沒有多個名稱相同的物件,請移除包含 filter requestURI like 的那一行。
尋找已排程 Pod 的節點
若要找出您將 Pod 排程到哪個節點,請執行以下查詢:
fields @timestamp, @message | filter @logStream like /kube-scheduler/ | filter @message like "example-pod-name" | filter @message like "ip-" | sort @timestamp asc | limit 3
**注意:**將 example-pod-name 替換為您的 Pod 名稱。
檢查是否有移出 API
**注意:**如果 AWS Fargate 作業系統 (OS) 修補刪除了您的 Pod 或節點,則移出 API 會出現在稽核日誌中。
若要檢查您的稽核日誌中是否出現移出 API,請執行以下查詢:
filter @logStream like /kube-apiserver-audit/ | fields @timestamp, user.username,user.extra.canonicalArn.0, responseStatus.code, responseObject.status, responseStatus.message | sort @timestamp asc | filter verb == "create" and objectRef.subresource == 'eviction'
若要找出移出 API 操作的事件,請執行以下查詢:
fields @logStream, @timestamp, @message | sort @timestamp asc | filter user.username == "eks:node-manager" and requestURI like "eviction" and requestURI like "pod"
尋找 Fargate Pod 的任務 ID
若要找出 Fargate Pod 的任務 ID,請執行以下查詢:
fields @timestamp, verb, responseObject.spec.providerID as InstanceID | filter @message like /example-fargate-node-IP/ | filter ispresent(responseObject.spec.providerID)
**注意:**將 example-fargate-node-IP 替換為您的 Fargate 節點 IP 位址。
識別接收錯誤的網址
若要找出接收超過特定數量 4## 或 5## 錯誤的網址,請執行以下查詢:
fields requestURI | filter @logStream like "kube-apiserver-audit-i" | filter count > example-filter-count | stats count(*) as count by requestURI, responseStatus.code | filter responseStatus.code >= 400 | sort count desc
**注意:**將 example-filter-count 替換為查詢輸出必須顯示的最小錯誤數。
對 Webhook 錯誤進行疑難排解
若要找出 webhooks 的錯誤,請執行以下查詢:
fields @timestamp, @message | filter @logStream like /kube-apiserver/ and @logStream not like /kube-apiserver-audit/ | filter @message like /failed calling webhook/ | sort @timestamp desc | stats count(*) by bin(1m)
列出失敗的 API 伺服器運作狀態檢查
若要列出失敗的 API 伺服器運作狀態檢查,請執行以下查詢:
fields @message | sort @timestamp asc | filter @logStream like "kube-apiserver" | filter @logStream not like "kube-apiserver-audit" | filter @message like "healthz check failed"
計算 Kubernetes 物件與 CloudWatch Logs userAgent 索引
若要依 Kubernetes 物件與 CloudWatch Logs userAgent 索引計算請求數,請執行以下查詢:
fields @timestamp, @message, @logStream | filter @logStream like "kube-apiserver-audit" | display @logStream, requestURI, verb | stats count(*) as count by objectRef.resource, userAgent | sort count desc | display objectRef.resource, userAgent, count
檢視常見日誌
若要檢視最常出現的日誌,請執行以下查詢:
fields @timestamp, @message, @logStream | filter @logStream not like /kube-apiserver-audit/ | parse @message "*] *" as loggingTimeStamp, loggingMessage | stats count(*) as count by loggingMessage | sort count desc
- 語言
- 中文 (繁體)

相關內容
已提問 3 年前
已提問 3 年前
AWS 官方已更新 7 個月前
