跳至內容

如何從 CloudWatch Logs 擷取 Amazon EKS 控制平面日誌?

6 分的閱讀內容
0

我想收集在 Amazon Elastic Kubernetes Service (Amazon EKS) 控制平面上執行元件的日誌。

解決方法

**先決條件:**若要在 Amazon CloudWatch Logs 中檢視您的日誌事件,您必須在叢集中啟用 Amazon EKS 控制平面日誌

若要存取您的 Amazon EKS 控制平面日誌,請使用 CloudWatch Logs Insights。接著,查詢 Amazon EKS 控制平面日誌資料。

檢視您的 Amazon EKS 控制平面日誌

請完成以下步驟:

  1. 開啟 Amazon CloudWatch console (Amazon CloudWatch 主控台)。
  2. 在導覽窗格中,選擇 Logs (日誌),然後選擇 Log Insights
  3. Select log group(s) (選取日誌群組) 功能表中,選取您要查詢的叢集日誌群組。
  4. 選擇 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