Amazon EKS 클러스터에서 애플리케이션 활성화 - Amazon CloudWatch

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 활성화의 지침을 따른 다음에 아래 절차를 따릅니다.

  1. https://console.aws.amazon.com/cloudwatch/에서 CloudWatch 콘솔을 엽니다.

  2. Application Signals를 선택합니다.

  3. 플랫폼 지정에서 EKS를 선택합니다.

  4. EKS 클러스터 선택에서 Application Signals를 활성화하려는 클러스터를 선택합니다.

  5. 이 클러스터에서 Amazon CloudWatch Observability EKS 추가 기능을 아직 활성화하지 않은 경우 활성화하라는 메시지가 나타납니다. 이런 경우 다음을 수행합니다.

    1. CloudWatch Observability EKS 추가 기능 추가를 선택합니다. Amazon EKS 콘솔이 표시됩니다.

    2. Amazon CloudWatch Observability 확인란을 선택하고 다음을 선택합니다.

      CloudWatch Observability EKS 추가 기능은 Amazon EKS에 대한 향상된 관찰성을 통해 Application Signals와 CloudWatch Container Insights를 모두 활성화합니다. Container Insights에 대한 자세한 정보는 Container Insights 섹션을 참조하세요.

    3. 설치할 최신 버전의 추가 기능을 선택합니다.

    4. 추가 기능에 사용할 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
    5. 추가 기능을 사용할 서비스 역할을 생성하려면 Amazon CloudWatch Observability EKS 추가 기능 또는 헬름 차트를 사용하여 CloudWatch 에이전트 설치 섹션을 참조하세요.

    6. 다음을 선택하고 화면의 정보를 확인한 다음, 생성을 선택합니다.

    7. 다음 화면에서 CloudWatch Application Signals 활성화를 선택하여 CloudWatch 콘솔로 돌아가 프로세스를 완료합니다.

  6. Application Signals에서 애플리케이션을 활성화하는 두 가지 옵션이 있습니다. 일관성을 위해 클러스터당 하나의 옵션을 선택하는 것이 좋습니다.

    • 콘솔 옵션이 더 간단합니다. 이 방법을 사용하면 포드가 즉시 재시작됩니다.

    • 매니페스트 파일에 주석 추가 방법을 사용하면 포드를 언제 재시작할지 더 효과적으로 제어할 수 있고, 모니터링을 중앙에 집중시키고 싶지 않은 경우 보다 분산된 방식으로 모니터링을 관리할 수 있습니다.

    참고

    ESM을 사용하는 Node.js 애플리케이션용 Application Signals를 활성화하는 경우 대신 ESM 모듈 형식으로 Node.js 애플리케이션 설정 섹션으로 건너뜁니다.

    Console

    콘솔 옵션은 Amazon CloudWatch Observability EKS 추가 기능의 고급 구성을 사용하여 서비스에 대해 Application Signals를 설정합니다. 추가 기능에 대한 자세한 내용은 (선택 사항) 추가 구성 섹션을 참조하세요.

    워크로드 및 네임스페이스 목록이 표시되지 않는 경우 이 클러스터에서 이를 볼 수 있는 적절한 권한이 있는지 확인하세요. 자세한 내용은 필수 권한 섹션을 참조하세요.

    자동 모니터 확인란을 선택하여 모든 서비스 워크로드를 모니터링하거나 특정 워크로드 및 네임스페이스를 선택하고 모니터링할 수 있습니다.

    자동 모니터를 사용하여 모든 서비스 워크로드 모니터링:

    1. 자동 모니터 확인란을 선택하여 클러스터의 모든 서비스 워크로드를 자동으로 선택합니다.

    2. 자동 재시작을 선택하여 모든 워크로드 포드를 다시 시작하여 포드에 주입된 AWS Distro for OpenTelemetry 자동 계측(ADOT) SDK를 사용하여 Application Signals를 즉시 활성화합니다.

    3. 완료를 선택합니다. 자동 재시작을 선택하면 CloudWatch Observability EKS 추가 기능으로 Application Signals가 즉시 활성화됩니다. 그렇지 않으면 각 워크로드의 다음 배포 도중 Application Signals가 활성화됩니다.

    단일 워크로드 또는 전체 네임스페이스를 모니터링할 수 있습니다.

    단일 워크로드 모니터링:

    1. 모니터링할 워크로드 옆의 확인란을 선택합니다.

    2. 언어 선택 드롭다운 목록을 사용하여 워크로드의 언어를 선택합니다. Application Signals를 활성화할 언어를 선택한 다음 체크 표시 아이콘(✓)을 선택하여 이 선택 내용을 저장합니다.

      Python 애플리케이션의 경우 계속하기 전에 애플리케이션이 필수 사전 조건을 준수하는지 확인하세요. 자세한 내용은 Application Signals가 활성화된 후 Python 애플리케이션이 시작되지 않음 섹션을 참조하세요.

    3. 완료를 선택합니다. Amazon CloudWatch Observability EKS 추가 기능은 ADOT(AWS Distro for OpenTelemetry) 자동 계측 SDK를 포드에 즉시 삽입하고 포드 재시작을 트리거하여 애플리케이션 지표 및 추적 수집을 활성화합니다.

    전체 네임스페이스 모니터링:

    1. 모니터링할 네임스페이스 옆의 확인란을 선택합니다.

    2. 언어 선택 드롭다운 목록을 사용하여 네임스페이스의 언어를 선택합니다. Application Signals를 활성화할 언어를 선택한 다음 체크 표시 아이콘(✓)을 선택하여 이 선택 내용을 저장합니다. 이는 현재 배포되어 있거나 향후 배포될 예정인지 여부와 무관하게 이 네임스페이스의 모든 워크로드에 적용됩니다.

      Python 애플리케이션의 경우 계속하기 전에 애플리케이션이 필수 사전 조건을 준수하는지 확인하세요. 자세한 내용은 Application Signals가 활성화된 후 Python 애플리케이션이 시작되지 않음 섹션을 참조하세요.

    3. 완료를 선택합니다. Amazon CloudWatch Observability EKS 추가 기능은 ADOT(AWS Distro for OpenTelemetry) 자동 계측 SDK를 포드에 즉시 삽입하고 포드 재시작을 트리거하여 애플리케이션 지표 및 추적 수집을 활성화합니다.

    다른 Amazon EKS 클러스터에서 Application Signals를 활성화하려면 서비스 화면에서 Application Signals 활성화를 선택합니다.

    Annotate manifest file

    CloudWatch 콘솔에서 서비스 모니터링 섹션은 클러스터의 매니페스트 YAML에 주석을 추가해야 한다고 설명합니다. 이 주석을 추가하면 Application Signals에 지표, 트레이스 및 로그를 전송하도록 애플리케이션이 자동 계측됩니다.

    주석에는 다음 2가지 옵션이 있습니다.

    • 워크로드에 주석 추가는 클러스터의 단일 워크로드를 자동으로 계측합니다.

    • 네임스페이스에 주석 추가는 선택한 네임스페이스에 배포된 모든 워크로드를 자동으로 계측합니다.

    이러한 옵션 중 하나를 선택하고 적절한 단계를 따릅니다.

    • 단일 워크로드에 주석 추가:

      1. 워크로드에 주석 추가를 선택합니다.

      2. 워크로드 매니페스트 파일의 PodTemplate 섹션에 다음 줄 중 하나를 붙여넣습니다.

        • Java 워크로드: annotations: instrumentation.opentelemetry.io/inject-java: "true"

        • Python 워크로드: annotations: instrumentation.opentelemetry.io/inject-python: "true"

          Python 애플리케이션의 경우 추가 필수 구성이 있습니다. 자세한 내용은 Application Signals가 활성화된 후 Python 애플리케이션이 시작되지 않음 섹션을 참조하세요.

        • .NET 워크로드의 경우 annotations: instrumentation.opentelemetry.io/inject-dotnet: "true"

          참고

          Alpine Linux(linux-musl-x64) 기반 이미지에서 .NET 워크로드에 대해 Application Signals를 활성화하려면 다음 주석을 추가하세요.

          instrumentation.opentelemetry.io/otel-dotnet-auto-runtime: "linux-musl-x64"
        • Node.js 워크로드: annotations: instrumentation.opentelemetry.io/inject-nodejs: "true"

      3. 터미널에서 kubectl apply -f your_deployment_yaml을 입력하여 변경 사항을 적용합니다.

    • 네임스페이스의 모든 워크로드에 주석 추가:

      1. 네임스페이스에 주석 추가를 선택합니다.

      2. 네임스페이스 매니페스트 파일의 메타데이터 섹션에 다음 줄 중 하나를 붙여넣습니다. 네임스페이스에 Java, Python 및 .NET 워크로드가 포함된 경우 다음 줄을 모두 네임스페이스 매니페스트 파일에 붙여넣습니다.

        • 네임스페이스에 Java 워크로드가 있는 경우: annotations: instrumentation.opentelemetry.io/inject-java: "true"

        • 네임스페이스에 Python 워크로드가 있는 경우: annotations: instrumentation.opentelemetry.io/inject-python: "true"

          Python 애플리케이션의 경우 추가 필수 구성이 있습니다. 자세한 내용은 Application Signals가 활성화된 후 Python 애플리케이션이 시작되지 않음 섹션을 참조하세요.

        • 네임스페이스에 .NET 워크로드가 있는 경우: annotations: instrumentation.opentelemetry.io/inject-dotnet: "true"

        • 네임스페이스에 Node.JS 워크로드가 있는 경우: annotations: instrumentation.opentelemetry.io/inject-nodejs: "true"

      3. 터미널에서 kubectl apply -f your_namespace_yaml을 입력하여 변경 사항을 적용합니다.

      4. 터미널에서 네임스페이스의 모든 포드를 다시 시작하는 명령을 입력합니다. 배포 워크로드를 다시 시작하는 명령의 예는 kubectl rollout restart deployment -n namespace_name입니다.

  7. 완료 시 서비스 보기를 선택합니다. 그러면 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를 활성화하려면
  1. 관련 종속성을 자동 계측용 Node.js 애플리케이션에 설치합니다.

    npm install @aws/aws-distro-opentelemetry-node-autoinstrumentation npm install @opentelemetry/instrumentation@0.54.0
  2. 애플리케이션의 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"]
  3. ㅇ환경 변수인 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)"
  4. 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 활성화을(를) 참조하세요.

  1. 애플리케이션에 대해 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에 대한 서비스 연결 역할 권한 섹션을 참조하세요.

  2. amazon-cloudwatch-observability 추가 기능을 설치합니다.

    1. CloudWatchAgentServerPolicy 및 클러스터와 연결된 OIDC를 사용하여 IAM 역할을 생성합니다.

      const cloudwatchRole = new Role(this, 'CloudWatchAgentAddOnRole', { assumedBy: new OpenIdConnectPrincipal(cluster.openIdConnectProvider), managedPolicies: [ManagedPolicy.fromAwsManagedPolicyName('CloudWatchAgentServerPolicy')], });
  3. 위에서 생성한 IAM 역할을 사용하여 추가 기능을 설치합니다.

    new CfnAddon(this, 'CloudWatchAddon', { addonName: 'amazon-cloudwatch-observability', clusterName: cluster.clusterName, serviceAccountRoleArn: cloudwatchRole.roleArn });
  4. 워크로드 매니페스트 파일의 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)