跳至内容

如何从 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 控制台。
  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

查找已调度容器组的节点

要查找您将容器组调度到的节点,请运行以下查询:

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 替换为您的容器组名称。

查找 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 次。

查找对进程守护程序或附加组件所做的更改

要查找您在 kube-system 命名空间中对进程守护程序或附加组件所做的更改,请运行以下查询:

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

查找修补、更新、创建和删除调用

要查找与特定部署和部署容器组相关的所有修补、更新、创建和删除调用,请运行以下查询:

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、容器组或部署)的用户,请运行以下查询:

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

**注意:**要查找针对您的容器组的删除调用,请将 aws-auth 替换为您的容器组名称。

查找部署的映像版本

要查找某个部署的映像版本,请运行以下查询:

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 替换为您的节点名称。

识别封锁节点的用户

要查找封锁特定节点或使节点不可调度的用户,请运行以下查询:

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 地址。

识别已删除容器组的 podIP

要查找已删除容器组的 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 替换为您的容器组名称。

查找未知容器组的对象输出

要查看不带容器组名称的已删除容器组的描述输出,请运行以下查询:

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 的行。

查找已调度容器组的节点

要查找您将容器组调度到的节点,请运行以下查询:

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 替换为您的容器组名称。

检查驱逐 API

**注意:**如果 AWS Fargate 操作系统 (OS) 修补操作删除了您的容器组或节点,则审计日志中将出现驱逐 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 容器组的任务 ID

要查找 Fargate 容器组的任务 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 地址。

识别收到错误的 URL

要查找收到超过特定数量的 4## 或 5## 错误的 URL,请运行以下查询:

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 错误进行故障排除

要查找与 webhook 相关的错误,请运行以下查询:

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