在 Amazon EKS 集群上启用应用程序
CloudWatch Application Signals 支持 Java、Python、Node.js 和 .NET 应用程序。您可以使用 Amazon Web Services Management Console、Amazon CDK 或 CloudWatch 可观测性附加组件的“自动监控”高级配置,为现有 Amazon EKS 集群上的应用程序启用 Application Signals。
主题
使用控制台在 Amazon EKS 集群上启用 Application Signals
要在现有 Amazon EKS 集群的应用程序上启用 CloudWatch Application Signals,请按照本节中的说明进行操作。
重要
如果您已经在打算为 Application Signals 启用的应用程序中使用 OpenTelemetry,请在启用 Application Signals 之前参阅 OpenTelemetry 兼容性。
为现有 Amazon EKS 集群上的应用程序启用 Application Signals
注意
如果还没有启用 Application Signals,请按照在账户中启用 Application Signals中的说明操作,然后完成以下程序。
通过 https://console.aws.amazon.com/cloudwatch/
打开 CloudWatch 控制台。 选择 Application Signals。
在指定平台中,选择 EKS。
在选择 EKS 集群中,选择要在其中启用 Application Signals 的集群。
如果此集群尚未启用 Amazon CloudWatch Observability EKS 附加组件,则系统会提示您将其启用。在这种情况下,请执行以下操作:
选择添加 CloudWatch Observability EKS 附加组件。Amazon EKS 控制台出现。
选中 Amazon CloudWatch Observability 对应的复选框,然后选择下一步。
CloudWatch Observability EKS 附加组件启用 Application Signals 和 CloudWatch Container Insights,从而增强 Amazon EKS 的可观测性。有关安装 Container Insights 的更多信息,请参阅 Container Insights。
选择要安装的最新版本的附加组件。
选择要用于附加组件的 IAM 角色。如果您选择从节点继承,请将正确的权限附加到您的 Worker 节点使用的 IAM 角色。将
my-worker-node-role
替换为您的 Kubernetes Worker 节点使用的 IAM 角色。aws iam attach-role-policy \ --role-name
my-worker-node-role
\ --policy-arn arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy \ --policy-arn arn:aws:iam::aws:policy/AWSXRayWriteOnlyAccess如果您想要创建服务角色以使用附加组件,请参阅 使用 Amazon CloudWatch Observability EKS 附加组件或 Helm 图表安装 CloudWatch 代理。
选择下一步,确认屏幕上的信息,然后选择创建。
在下一个屏幕中,选择启用 CloudWatch Application Signals 以返回 CloudWatch 控制台并完成该过程。
-
有两个选项可以为您的应用程序启用 Application Signals。为保持一致性,建议您为每个集群选择一个选项。
控制台选项更简单。使用此方法会导致您的容器组(pod)立即重启。
注释清单文件方法可以让您更好地控制容器组(pod)何时重启;如果您不想集中监控,还可以帮助您以更分散的方式管理监控。
注意
要为使用 ESM 的 Node.js 应用程序启用 Application Signals,改为跳转到设置采用 ESM 模块格式的 Node.js 应用程序。
选择完成后查看服务。这将带您进入 Application Signals 服务视图,您可以在其中查看 Application Signals 正在收集的数据。可能需要几分钟才会显示数据。
要在另一个 Amazon EKS 集群中启用 Application Signals,请从服务屏幕中选择启用 Application Signals。
有关服务视图的更多信息,请参阅 使用 Application Signals 监控应用程序的运行状况。
注意
如果您在 Python 应用程序中使用 WSGI 服务器,请参阅使用 WSGI 服务器的 Python 应用程序没有 Application Signals 数据以获取有关使 Application Signals 起作用的信息。
我们也已经明确在为 Application Signals 启用 Python 应用程序时应注意的其他注意事项。有关更多信息,请参阅 启用 Application Signals 后,Python 应用程序无法启动。
设置采用 ESM 模块格式的 Node.js 应用程序
我们对采用 ESM 模块格式的 Node.js 应用程序提供有限的支持。有关更多信息,请参阅 使用 ESM 的 Node.js 的已知限制。
对于 ESM 模块格式,通过控制台或通过注释清单文件来启用 Application Signals 不起作用。跳过之前程序的步骤 8,改为执行以下操作。
为使用 ESM 的 Node.js 应用程序启用 Application Signals
将相关依赖项安装到您的 Node.js 应用程序中以进行自动检测:
npm install @aws/aws-distro-opentelemetry-node-autoinstrumentation npm install @opentelemetry/instrumentation@0.54.0
将以下环境变量添加到应用程序的 Dockerfile 中并构建映像。
... ENV OTEL_AWS_APPLICATION_SIGNALS_ENABLED=true ENV OTEL_TRACES_SAMPLER_ARG='endpoint=http://cloudwatch-agent.amazon-cloudwatch:2000' ENV OTEL_TRACES_SAMPLER='xray' ENV OTEL_EXPORTER_OTLP_PROTOCOL='http/protobuf' ENV OTEL_EXPORTER_OTLP_TRACES_ENDPOINT='http://cloudwatch-agent.amazon-cloudwatch:4316/v1/traces' ENV OTEL_AWS_APPLICATION_SIGNALS_EXPORTER_ENDPOINT='http://cloudwatch-agent.amazon-cloudwatch:4316/v1/metrics' ENV OTEL_METRICS_EXPORTER='none' ENV OTEL_LOGS_EXPORTER='none' ENV NODE_OPTIONS='--import @aws/aws-distro-opentelemetry-node-autoinstrumentation/register --experimental-loader=@opentelemetry/instrumentation/hook.mjs' ENV OTEL_SERVICE_NAME='
YOUR_SERVICE_NAME
' #replace with a proper service name ENV OTEL_PROPAGATORS='tracecontext,baggage,b3,xray' ... # command to start the application # for example # CMD ["node", "index.mjs"]将环境变量
OTEL_RESOURCE_ATTRIBUTES_POD_NAME
、OTEL_RESOURCE_ATTRIBUTES_NODE_NAME
、OTEL_RESOURCE_ATTRIBUTES_DEPLOYMENT_NAME
、POD_NAMESPACE
和OTEL_RESOURCE_ATTRIBUTES
添加到应用程序的部署 yaml 文件中。例如:apiVersion: apps/v1 kind: Deployment metadata: name: nodejs-app labels: app: nodejs-app spec: replicas: 2 selector: matchLabels: app: nodejs-app template: metadata: labels: app: nodejs-app # annotations: # make sure this annotation doesn't exit # instrumentation.opentelemetry.io/inject-nodejs: 'true' spec: containers: - name: nodejs-app image:
your-nodejs-application-image
#replace with a proper image uri imagePullPolicy: Always ports: - containerPort: 8000 env: - name: OTEL_RESOURCE_ATTRIBUTES_POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: OTEL_RESOURCE_ATTRIBUTES_NODE_NAME valueFrom: fieldRef: fieldPath: spec.nodeName - name: OTEL_RESOURCE_ATTRIBUTES_DEPLOYMENT_NAME valueFrom: fieldRef: fieldPath: metadata.labels['app'] # Assuming 'app' label is set to the deployment name - name: POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace - name: OTEL_RESOURCE_ATTRIBUTES value: "k8s.deployment.name=$(OTEL_RESOURCE_ATTRIBUTES_DEPLOYMENT_NAME),k8s.namespace.name=$(POD_NAMESPACE),k8s.node.name=$(OTEL_RESOURCE_ATTRIBUTES_NODE_NAME),k8s.pod.name=$(OTEL_RESOURCE_ATTRIBUTES_POD_NAME)"将 Node.js 应用程序部署到集群。
在 Amazon EKS 集群上启用应用程序后,就可以监控应用程序的运行状况。有关更多信息,请参阅 使用 Application Signals 监控应用程序的运行状况。
使用 CloudWatch 可观测性附加组件的高级配置在 Amazon EKS 集群上启用 Application Signals
从 CloudWatch 可观测性 Amazon EKS 附加组件的 v4.0.0-eksbuild.1 版开始,您可以使用附加组件高级配置中新的集中式“自动监控”配置标志,自动为 EKS 集群中的所有服务工作负载启用 Application Signals。
要选择“自动监控”功能,必须在创建或更新附加组件或 Helm 图表时修改高级配置。将 monitorAllServices
设置为 true 后,CloudWatch 可观测性附加组件会检测所有 Kubernetes 服务工作负载,也会尝试在部署期间自动注入 Amazon Distro for OpenTelemetry(ADOT)SDK。此外,启用 restartPods
后,所有服务工作负载容器组(pod)都将重新启动,以便在自动重新部署过程中立即注入 ADOT SDK。
--configuration-values '{ "manager":{ "applicationSignals":{ "autoMonitor":{ "monitorAllServices":true, "restartPods":true } } } }'
CloudWatch 可观测性附加组件还提供了额外的精细控制功能,可根据需要在新的高级配置中包含或排除特定服务。有关更多信息,请参阅 为 Amazon EKS 集群配置 Application Signals 。
使用 Amazon CDK 在 Amazon EKS 上启用 Application Signals
如果您尚未在此账户中启用 Application Signals,则必须向 Application Signals 授予发现您的服务所需的权限。请参阅在账户中启用 Application Signals。
为您的应用程序启用 Application Signals。
import { aws_applicationsignals as applicationsignals } from 'aws-cdk-lib'; const cfnDiscovery = new applicationsignals.CfnDiscovery(this, 'ApplicationSignalsServiceRole', { } );
Discovery CloudFormation 资源授予 Application Signals 下列权限:
-
xray:GetServiceGraph
-
logs:StartQuery
-
logs:GetQueryResults
-
cloudwatch:GetMetricData
-
cloudwatch:ListMetrics
-
tag:GetResources
有关该角色的更多信息,请参阅CloudWatch Application Signals 的服务相关角色权限。
-
安装
amazon-cloudwatch-observability
插件。使用
CloudWatchAgentServerPolicy
以及与集群关联的 OIDC 创建 IAM 角色。const cloudwatchRole = new Role(this, 'CloudWatchAgentAddOnRole', { assumedBy: new OpenIdConnectPrincipal(cluster.openIdConnectProvider), managedPolicies: [ManagedPolicy.fromAwsManagedPolicyName('CloudWatchAgentServerPolicy')], });
使用上面创建的 IAM 角色安装附加组件。
new CfnAddon(this, 'CloudWatchAddon', { addonName: 'amazon-cloudwatch-observability', clusterName: cluster.clusterName, serviceAccountRoleArn: cloudwatchRole.roleArn });
将其中一行添加到工作负载清单文件的
PodTemplate
部分。语言 文件 Java
instrumentation.opentelemetry.io/inject-java: "true"
Python
instrumentation.opentelemetry.io/inject-python: "true"
.Net
instrumentation.opentelemetry.io/inject-dotnet: "true"
Node.js
instrumentation.opentelemetry.io/inject-nodejs: "true"
const deployment = { apiVersion: "apps/v1", kind: "Deployment", metadata: { name: "
sample-app
" }, spec: { replicas: 3, selector: { matchLabels: { "app": "sample-app
" } }, template: { metadata: { labels: { "app": "sample-app
" }, annotations: { "instrumentation.opentelemetry.io/inject-$LANG
": "true" } }, spec: {...}, }, }, }; cluster.addManifest('sample-app
', deployment)