Amazon EKS 클러스터에서 애플리케이션 활성화
CloudWatch Application Signals는 Java, Python, Node.js, .NET 애플리케이션을 지원합니다. 기존 Amazon EKS 클러스터의 애플리케이션에 대해 Application Signals를 활성화하려면 AWS Management Console, AWS CDK 또는 CloudWatch Observability 추가 기능 자동 모니터 고급 구성을 사용할 수 있습니다.
주제
콘솔을 사용하여 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 추가 기능은 Amazon EKS에 대한 향상된 관찰성을 통해 Application Signals와 CloudWatch Container Insights를 모두 활성화합니다. Container Insights에 대한 자세한 정보는 Container Insights 섹션을 참조하세요.
설치할 최신 버전의 추가 기능을 선택합니다.
추가 기능에 사용할 IAM 역할을 선택합니다. 노드에서 상속을 선택하는 경우 워커 노드에서 사용하는 IAM 역할에 올바른 권한을 추가합니다.
my-worker-node-role
을 Kubernetes 워커 노드에서 사용하는 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 추가 기능 또는 헬름 차트를 사용하여 CloudWatch 에이전트 설치 섹션을 참조하세요.
다음을 선택하고 화면의 정보를 확인한 다음, 생성을 선택합니다.
다음 화면에서 CloudWatch Application Signals 활성화를 선택하여 CloudWatch 콘솔로 돌아가 프로세스를 완료합니다.
-
Application Signals에서 애플리케이션을 활성화하는 두 가지 옵션이 있습니다. 일관성을 위해 클러스터당 하나의 옵션을 선택하는 것이 좋습니다.
콘솔 옵션이 더 간단합니다. 이 방법을 사용하면 포드가 즉시 재시작됩니다.
매니페스트 파일에 주석 추가 방법을 사용하면 포드를 언제 재시작할지 더 효과적으로 제어할 수 있고, 모니터링을 중앙에 집중시키고 싶지 않은 경우 보다 분산된 방식으로 모니터링을 관리할 수 있습니다.
참고
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 Observability 추가 기능 고급 구성을 사용하여 Amazon EKS 클러스터에서 Application Signals 활성화
CloudWatch Observability Amazon EKS 추가 기능의 버전 v4.0.0-eksbuild.1부터 추가 기능의 고급 구성에서 새로운 중앙 집중식 자동 모니터 구성 플래그를 사용하여 EKS 클러스터의 모든 서비스 워크로드에 대해 Application Signals를 자동으로 활성화할 수 있습니다.
자동 모니터 기능을 선택하려면 추가 기능 또는 헬름 차트를 생성하거나 업데이트할 때 고급 구성을 수정해야 합니다. monitorAllServices
를 true로 설정하면 CloudWatch Observability 추가 기능에서 모든 Kubernetes 서비스 워크로드를 감지하고 배포 중 AWS Distro for OpenTelemetry(ADOT) SDK 주입을 시도합니다. 추가로 restartPods
를 활성화하면 모든 서비스 워크로드 포드가 다시 시작되어 자동 재배포 프로세스의 일부분으로 ADOT SDK를 즉시 주입합니다.
--configuration-values '{ "manager":{ "applicationSignals":{ "autoMonitor":{ "monitorAllServices":true, "restartPods":true } } } }'
또한 CloudWatch Observability 추가 기능은 새로운 고급 구성에서 필요에 따라 특정 서비스를 포함 또는 제외할 수 있도록 세분화된 추가 제어 기능을 제공합니다. 자세한 정보는 Amazon EKS 클러스터에 대한 Application Signals 구성 을 참조하세요.
AWS 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
섹션에 다음 중 하나를 추가합니다.Language 파일 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)