使用 Amazon CloudWatch Container Insights 轻松监控容器化应用程序

监控容器化应用程序需要精确度和效率。处理从应用程序收集和汇总指标的复杂性的一种方法是使用 Amazon CloudWatch Container Insights。随着容器性能指标的变化,Container Insights 提供实时数据,使您能够通过明智的决策保持一致的应用程序性能。
本教程以本系列第 1 部分的 Amazon EKS 集群为基础,深入探讨了如何设置 Amazon CloudWatch Container Insights。上一教程的集群配置中包括附加到服务账户 (IRSA) 的 IAM 角色和 OpenID Connect (OIDC) 终端节点的 Amazon CloudWatch IAM 策略。有关本系列的第一部分,请参阅构建预配置为运行高流量微服务的 Amazon EKS 集群。或者,要使用本教程所需的组件设置现有集群,请使用 EKS 官方文档验证先决条件部分中的说明。
在本教程中,您将配置 Amazon EKS 集群、部署容器化应用程序,并使用 Container Insights 监控应用程序的性能。Container Insights 可以处理轻量级应用程序(如微服务)以及更复杂的系统(如数据库或用户身份验证系统),从而提供无缝监控。
注意:如果您处于初始 12 个月阶段,请注意 Amazon CloudWatch Container Insights 不属于 AWS 免费套餐,因此使用可能会产生额外费用。
大约
✅ AWS 体验 200 – 中级
⏱ 完成时间 30 分钟
🧩 先决条件 – AWS 账户
📢 反馈 任何反馈、问题,或者只是一个 👍 / 👎 ?
⏰ 最后更新 2023-10-02

先决条件

在开始本教程之前,您需要:
  • 安装最新版本的 kubectl。若要检查版本,请运行: 。kubectl version --short
  • 安装最新版本的 eksctl。若要检查版本,请运行: 。eksctl info

步骤 1:在 Amazon EKS 上设置 Container Insights

要使 CloudWatch Container Insights 从 Amazon Elastic Kubernetes Service (Amazon EKS) 上的容器化应用程序和微服务中收集、聚合和汇总指标和日志,需要执行一些设置步骤。Container Insights 支持 Amazon EKS EC2 和 Fargate。您可以通过多种方式在 Amazon EKS 集群上设置 Container Insights:使用 CloudWatch 代理、“快速入门”设置或通过手动设置方法。下面,您将找到“快速入门”方法所需的步骤。

快速入门设置

首先,设置和配置以下环境变量,确保 和 的一致性。在以下示例中,是 Amazon EKS 集群的名称,并且是发布日志的区域。应将这些值替换为您自己的值。建议指定集群所在的同一区域,以最大程度地降低 AWS 出站数据传输成本。此外,该端口的值为“2020”,因为此端口通常用于监视目的,并允许与现有工具集成,并且为“Off”提供值,以确保从末尾而不是开头读取日志,这对于管理大型日志文件和优化性能至关重要。ClusterNameRegionNamemy-clusterus-east-2FluentBitHttpPortFluentBitReadFromHead

1
2
3
4
export ClusterName=managednodes-quickstart
export LogRegion=us-east-2
export FluentBitHttpPort=‘2020’
export FluentBitReadFromHead=‘Off’
设置以下环境变量以确保从头部或尾部读取日志,但不能同时读取两者。

1
[[ ${FluentBitReadFromHead} = ‘On’ ]] && FluentBitReadFromTail=‘Off’|| FluentBitReadFromTail=‘On’
接下来,设置以下环境变量来控制是启用还是禁用 Fluent Bit 的 HTTP 服务器。在此命令中,默认情况下,for monitoring plugin 指标处于打开状态。FluentBitHttpServer

1
[[ -z ${FluentBitHttpPort} ]] && FluentBitHttpServer=‘Off’ || FluentBitHttpServer=‘On’
通过运行以下命令下载并查看 Fluent Bit 守护程序集的内容:

1
curl https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/quickstart/cwagent-fluent-bit-quickstart.yaml | sed ‘s/{{cluster_name}}/’${ClusterName}‘/;s/{{region_name}}/’${LogRegion}‘/;s/{{http_server_toggle}}/”‘${FluentBitHttpServer}‘”/;s/{{http_server_port}}/”‘${FluentBitHttpPort}‘”/;s/{{read_from_head}}/”‘${FluentBitReadFromHead}‘”/;s/{{read_from_tail}}/”‘${FluentBitReadFromTail}‘”/’ > cwagent-fluent-bit-quickstart.yaml
将 IAM 角色用于集群的服务账户,并将策略附加到此角色。以下命令为 fluent-bit 创建 IAM 角色和服务账户对:

1
2
3
4
5
6
eksctl create iamserviceaccount –name fluent-bit
–namespace amazon-cloudwatch
–cluster ${ClusterName} –role-name fluent-bit
–attach-policy-arn arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy
–approve –region ${LogRegion}
–override-existing-serviceaccounts
通过运行以下命令将 Fluent Bit Daemonset 部署到群集:

1
kubectl apply -f cwagent-fluent-bit-quickstart.yaml
通过运行以下命令验证代理是否已部署:

1
kubectl get pods -n amazon-cloudwatch

步骤 2:在集群中部署容器应用程序

在此步骤中,您将使用名为 的清单文件在 Kubernetes 集群中部署一个全面的容器化应用程序环境。workload.yaml
  1. 创建一个名为 workload.yaml 的 Kubernetes 清单,并将以下内容粘贴到其中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
apiVersion: v1
kind: Namespace
metadata:
labels:
kubernetes.io/metadata.name: quickstart
name: quickstart


apiVersion: apps/v1
kind: Deployment
metadata:
name: “quickstart-nginx-deployment”
namespace: “quickstart”
spec:
selector:
matchLabels:
app: “quickstart-nginx”
replicas: 3
template:
metadata:
labels:
app: “quickstart-nginx”
role: “backend”
spec:
dnsPolicy: Default
enableServiceLinks: false
automountServiceAccountToken: false
securityContext:
seccompProfile:
type: RuntimeDefault
containers:
image: public.ecr.aws/nginx/nginx:latest
imagePullPolicy: Always
name: “quickstart-nginx”
resources:
requests:
memory: “64Mi”
cpu: “250m”
limits:
memory: “128Mi”
cpu: “500m”
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
ports:
containerPort: 80
command: [“/bin/sh”]
args: [“-c”, “echo PodName: $MY_POD_NAME NodeName: $MY_NODE_NAME podIP: $MY_POD_IP> /usr/share/nginx/html/index.html && exec nginx -g ‘daemon off;'”]
env:
name: MY_NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
name: MY_POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
name: MY_POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
volumeMounts:
name: cache
mountPath: /var/cache/nginx
name: usr
mountPath: /var/run
name: tmp
mountPath: /usr/share/nginx/html
volumes:
name: cache
emptyDir: {}
name: tmp
emptyDir: {}
name: usr
emptyDir: {}


apiVersion: v1
kind: Service
metadata:
name: quickstart-nginx-service
namespace: quickstart
spec:
type: NodePort
selector:
app: “quickstart-nginx”
role: “backend”
ports:
port: 80
targetPort: 80


apiVersion: v1
kind: Pod
metadata:
name: load
namespace: quickstart
spec:
securityContext:
seccompProfile:
type: RuntimeDefault
runAsNonRoot: true
runAsUser: 1000
runAsGroup: 1000
automountServiceAccountToken: false
containers:
name: load
image: public.ecr.aws/docker/library/busybox:1.36.1
imagePullPolicy: Always
command: [“/bin/sh”]
args: [“-c”, “while sleep 0.5; do wget -q -O- http://quickstart-nginx-service; done”]
resources:
requests:
memory: “64Mi”
cpu: “250m”
limits:
memory: “128Mi”
cpu: “500m”
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true

  1. 在 中部署 Kubernetes 资源。workload.yaml

1
kubectl apply -f workload.yaml
预期输出应如下所示:

1
2
3
4
namespace/quickstart created
deployment.apps/quickstart-nginx-deployment created
service/quickstart-nginx-service created
pod/load created
  1. 使用以下命令检查已部署的 Nginx 容器的状态,并确保它们正在运行:

1
kubectl get all -n quickstart
预期输出应如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
NAME READY STATUS RESTARTS AGE
pod/load 1/1 Running 0 15s
pod/quickstart-nginx-deployment-7cd757dc7b-9fss6 1/1 Running 0 16s
pod/quickstart-nginx-deployment-7cd757dc7b-fv592 1/1 Running 0 16s
pod/quickstart-nginx-deployment-7cd757dc7b-wpw4x 1/1 Running 0 16s

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/quickstart-nginx-service NodePort 10.100.233.21 <none> 80:31243/TCP 16s

NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/quickstart-nginx-deployment 3/3 3 3 17s

NAME DESIRED CURRENT READY AGE
replicaset.apps/quickstart-nginx-deployment-7cd757dc7b 3 3 3 17s

  1. 使用以下命令查看 “load” Pod 的实时日志,该 Pod 正在不断向 Nginx 服务发出请求。使用 Ctrl+C 停止。

1
kubectl logs -f load -n quickstart
预期输出应如下所示:

1
2
3
4
PodName: quickstart-nginx-deployment-7cd757dc7b-wpw4x NodeName: ip-192-168-141-57.us-east-2.compute.internal podIP: 192.168.136.230
PodName: quickstart-nginx-deployment-7cd757dc7b-fv592 NodeName: ip-192-168-177-109.us-east-2.compute.internal podIP: 192.168.164.31
PodName: quickstart-nginx-deployment-7cd757dc7b-fv592 NodeName: ip-192-168-177-109.us-east-2.compute.internal podIP: 192.168.164.31
PodName: quickstart-nginx-deployment-7cd757dc7b-9fss6 NodeName: ip-192-168-119-7.us-east-2.compute.internal podIP: 192.168.112.25

步骤 3:使用 CloudWatch Logs Insights 查询搜索和分析容器日志

您可以使用 CloudWatch Logs Insights 查询以交互方式搜索和分析 Amazon CloudWatch Logs 中应用程序的容器日志。Fluent Bit 将日志从集群中的容器发送到 CloudWatch Logs。在上面的步骤 1 中,我们已将 Fluent Bit 设置为 DaemonSet,以将日志发送到 CloudWatch Logs。Fluent Bit 创建下面的日志组(如果该日志组尚不存在):
/aws/containerinsights/Cluster_Name/application它包含集群中每个工作节点上的所有日志文件。/var/log/containers

要运行 CloudWatch Logs Insights 示例查询,请执行以下操作:

  • 打开 CloudWatch 控制台。
  • 在导航窗格中,选择 Logs,然后选择 Log groups
  • 单击日志组 。其中 CLUSTER_NAME 是 EKS 集群的实际名称。/aws/containerinsights/CLUSTER_NAME/application
  • 在日志详细信息(右上角)下,单击“在日志见解中查看”。
  • 在 CloudWatch Log Insight 查询编辑器中删除默认查询。然后,输入以下命令并选择“运行查询”:

1
2
3
4
fields @timestamp, kubernetes.pod_name as PodName, kubernetes.host as WorkerNode, kubernetes.namespace_name as Namespace, log
| filter PodName like ‘quickstart-nginx-deployment’
| sort @timestamp desc
| limit 200
  • 使用时间间隔选择器选择要查询的时间段。例如:
Logs Insights 查询

步骤 4:使用 Container Insights 监视应用程序的性能

监视容器化应用程序的性能对于保持最佳功能、识别潜在问题和了解系统行为至关重要。在此步骤中,您将利用 AWS CloudWatch 的容器见解来详细了解容器的性能。

查看 Container Insights 仪表板指标

在本节中,您将了解如何在 AWS CloudWatch 中访问 Container Insights 控制面板指标。此控制面板提供 Amazon EKS 和 Kubernetes 集群性能的集中视图,提供对各种指标(如 CPU 利用率、内存使用率和网络活动)的实时洞察。通过执行这些步骤,您可以快速导航到要监视的特定集群和资源,从而密切关注容器化应用程序的运行状况和性能。
  1. 在 https://console.aws.amazon.com/cloudwatch/ 打开 CloudWatch 控制台。
  2. 在左侧导航窗格中,打开 Insights 下拉菜单,然后选择 Container Insights
  3. 在“Container Insights”(顶部)下,从下拉菜单中选择“性能监控”
  4. 在“EKS 集群”下拉字段中,选择集群的名称。
  5. 使用其他下拉菜单筛选资源,例如“EKS 集群”和“EKS Pod”。例如:
Container Insights 仪表板指标
在本节中,您将探讨如何在 AWS CloudWatch 中访问特定于 Amazon EKS 和 Kubernetes 的更广泛的指标集。这些附加指标(如pod_cpu_utilization_over_pod_limit)提供了对容器化应用程序和底层基础架构的性能和行为的更深入的见解。无论您是要分析 CPU 利用率、内存使用率还是网络指标,此过程都允许您自定义视图并专注于与您的需求最相关的方面。

让我们探索一个超出其资源限制的应用程序

  1. 使用以下命令创建一个名为 geo-api 的 Kubernetes 清单,以部署名为 geo-api 的简单后端应用程序:geo-api.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
apiVersion: apps/v1
kind: Deployment
metadata:
name: geo-api
spec:
selector:
matchLabels:
run: geo-api
replicas: 1
template:
metadata:
labels:
run: geo-api
spec:
containers:
name: geo-api
image: registry.k8s.io/hpa-example
ports:
containerPort: 80
resources:
limits:
cpu: 250m
memory: “12Mi”
requests:
cpu: 125m
memory: “10Mi”

apiVersion: v1
kind: Service
metadata:
name: geo-api
labels:
run: geo-api
spec:
ports:
port: 80
selector:
run: geo-api
部署将创建 1 个具有 1 个容器的 Pod。容器的定义是请求 0.125 CPU 和 10MiB 内存。容器的限制为 0.25 个 CPU 和 12MiB 的内存。
  1. 使用以下命令部署应用程序:

1
kubectl apply -f geo-api.yaml
  1. 通过运行容器为 Web 服务器创建负载。

1
2
3
kubectl create deployment geo-api-load
–image=busybox
–replicas=2 — /bin/sh -c “while sleep 0.01; do wget -q -O- http://geo-api; done”
  1. 验证 Pod 状态:

1
kubectl get pods
预期输出应如下所示:

1
2
3
4
5
6
7
NAME READY STATUS RESTARTS AGE
geo-api-load-c9c7bf98c-4rrn8 0/1 ContainerCreating 0 0s
geo-api-load-c9c7bf98c-kzsjs 0/1 ContainerCreating 0 0s
geo-api-load-c9c7bf98c-4rrn8 1/1 Running 0 1s
geo-api-load-c9c7bf98c-kzsjs 1/1 Running 0 2s
geo-api-76f6dcf999-ptpz5 1/1 Running 20 (5m8s ago) 118m
geo-api-76f6dcf999-ptpz5 0/1 OOMKilled 20 (5m13s ago) 118m
输出显示 geo-api Pod 状态为 Running,有时会显示 OOMKilled。
获取容器状态的更详细视图:

1
kubectl get pod geo-api-76f6dcf999-ptpz5 –output=yaml | grep -i lastState -A7
输出显示容器已终止,因为它内存不足 (OOM):

1
2
3
4
5
6
7
8
lastState:
terminated:
containerID: containerd://4bbdfee06a3d3daca0e74f14f18f8a66ac0a415c79720eae44ea9ad4c46bcb37
exitCode: 137
finishedAt: “2023-08-26T12:48:37Z”
reason: OOMKilled
startedAt: “2023-08-26T12:47:27Z”
name: geo-api
  1. 让我们查看此 Pod 的容器见解指标:
    1. 在 https://console.aws.amazon.com/cloudwatch/ 打开 CloudWatch 控制台。
    2. 在导航窗格中,选择 Metrics (指标),然后选择 All metrics (所有指标)。
    3. 选择 ContainerInsights 指标命名空间。选择“ClusterName”、“Namespace”和“PodName”,在搜索栏中复制并粘贴 PodName=“geo-api”
    4. 通过选择以下指标,您可以查看 Pod 使用的 CPU 单位相对于 Pod 限制的百分比,以及 Pod 使用的内存相对于 Pod 限制的百分比:
      • pod_cpu_utilization_over_pod_limit
      • pod_memory_utilization_over_pod_limit
容器洞察指标
该图显示 Pod 中的容器已完全利用其 CPU 和内存限制,您需要指定足够的资源来防止 Pod 中的容器被终止。

收拾

为避免将来产生费用,应删除在本教程中创建的资源。您可以使用以下命令删除容器应用程序,也可以删除 Container Insights 的 CloudWatch 代理和 Fluent 位:

1
2
3
4
5
6
7
# Delete workloads
kubectl delete -f workload.yaml -n quickstart

kubectl delete -f geo-api.yaml

# Delete the the CloudWatch agent and Fluentbit for Container Insights
kubectl delete -f cwagent-fluent-bit-quickstart.yaml

结论

通过阅读本教程,您已成功设置 CloudWatch 代理和 Fluent Bit for Container Insights,以监控 Amazon EKS 集群中的示例容器化工作负载。通过这些说明,你将获得一个可靠的监视和日志记录解决方案,以帮助你监视群集中应用程序部署的性能。如果您想探索更多教程,请查看导航 Amazon EKS

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/312921.html

(0)
上一篇 2024年4月18日 10:44
下一篇 2024年4月22日 09:50

相关推荐

发表回复

登录后才能评论