Amazon EKS가 아닌 Kubernetes 시스템에서 실행되는 애플리케이션을 활성화하려면 이 섹션의 지침을 따르세요. Application Signals는 Java, Python 및 .NET 애플리케이션을 지원합니다.
요구 사항
Application Signals를 활성화하는 Kubernetes 클러스터에 대한 관리자 권한이 있어야 합니다.
Kubernetes 클러스터가 실행 중인 환경에 AWS CLI가 설치되어 있어야 합니다. AWS CLI 설치에 대한 자세한 내용은 최신 버전의 AWS CLI 설치 또는 업데이트를 참조하세요.
로컬 터미널에 kubectl과 helm이 설치되어 있어야 합니다. 자세한 내용은 kubectl
및 Helm 설명서를 참조하세요.
1단계: 계정에서 Application Signals 활성화
이 계정에서 아직 Application Signals를 활성화하지 않은 경우 서비스를 검색하는 데 필요한 권한을 Application Signals에 부여해야 합니다. 그렇게 하려면 다음을 수행합니다. 계정에 대해 한 번만 수행하면 됩니다.
애플리케이션에 대해 Application Signals 활성화
https://console.aws.amazon.com/cloudwatch/
에서 CloudWatch 콘솔을 엽니다. 탐색 창에서 서비스를 선택합니다.
서비스 검색 시작을 선택합니다.
확인란을 선택하고 서비스 검색 시작을 선택합니다.
계정에서 처음으로 이 단계를 완료하면 Application Signals가 AWSServiceRoleForCloudWatchApplicationSignals 서비스 연결 역할을 생성합니다. 이 역할은 Application Signals에 다음 권한을 부여합니다.
-
xray:GetServiceGraph
-
logs:StartQuery
-
logs:GetQueryResults
-
cloudwatch:GetMetricData
-
cloudwatch:ListMetrics
-
tag:GetResources
이에 대한 자세한 내용은 CloudWatch Application Signals에 대한 서비스 연결 역할 권한 섹션을 참조하세요.
-
2단계: 클러스터에 CloudWatch 에이전트 운영자 설치
CloudWatch 에이전트 운영자를 설치하면 운영자, CloudWatch 에이전트 및 기타 자동 계측기가 클러스터에 설치됩니다. 이를 위해 다음 명령을 입력합니다. $REGION
을 AWS 리전으로 바꿉니다. $YOUR_CLUSTER_NAME
을 Application Signals 대시보드에서 클러스터에 대해 표시할 이름으로 바꿉니다.
helm repo add aws-observability https://aws-observability.github.io/helm-charts helm install amazon-cloudwatch-operator aws-observability/amazon-cloudwatch-observability \ --namespace amazon-cloudwatch --create-namespace \ --set region=
$REGION
\ --set clusterName=$YOUR_CLUSTER_NAME
자세한 내용은 GitHub의 amazon-cloudwatch-observability
3단계: Kubernetes 클러스터에 대한 AWS 자격 증명 설정
중요
Kubernetes 클러스터가 Amazon EC2에서 호스팅되는 경우 이 섹션을 건너뛰고 4단계: 주석 추가로 진행할 수 있습니다.
Kubernetes 클러스터가 온프레미스로 호스팅되는 경우 이 섹션의 지침을 사용하여 Kubernetes 환경에 AWS 자격 증명을 추가해야 합니다.
온프레미스 Kubernetes 클러스터에 대한 권한을 설정하려면 다음을 수행하세요.
온프레미스 호스트에 권한을 제공하는 데 사용할 IAM 사용자를 생성합니다.
https://console.aws.amazon.com/iam/
에서 IAM 콘솔을 엽니다. 사용자, 사용자 생성을 선택합니다.
사용자 세부 정보의 사용자 이름에 새 IAM 사용자의 이름을 입력합니다. 이는 호스트를 인증하는 데 사용되는 AWS의 로그인 이름입니다. 그런 다음 [Next]를 선택합니다
권한 설정 페이지의 권한 옵션 아래에서 정책 직접 연결을 선택합니다.
권한 정책 목록에서 사용자에게 추가할 CloudWatchAgentServerPolicy 정책을 선택합니다. 그런 다음 다음을 선택합니다.
검토 및 생성 페이지에서 사용자 이름이 만족스러운지, CloudWatchAgentServerPolicy 정책이 권한 요약에 있는지 확인합니다.
사용자 생성을 선택합니다.
AWS 액세스 키와 비밀 키를 생성하고 검색합니다.
IAM 콘솔의 탐색 창에서 사용자를 선택한 다음 이전 단계에서 생성한 사용자의 이름을 선택합니다.
사용자의 페이지에서 보안 자격 증명 탭을 선택합니다. 액세스 키 섹션에서 액세스 키 생성을 선택합니다.
액세스 키 생성 1단계에서 명령줄 인터페이스(CLI)를 선택합니다.
액세스 키 만들기 2단계에서 필요에 따라 태그를 입력하고 다음을 선택합니다.
액세스 키 생성 3단계에서 .csv 파일 다운로드를 선택하여 IAM 사용자의 액세스 키 및 비밀 액세스 키와 함께 .csv 파일을 저장합니다. 다음 단계에 이 정보가 필요합니다.
완료를 선택합니다.
다음 명령을 입력하여 온프레미스 호스트에서 AWS 자격 증명을 구성합니다.
ACCESS_KEY_ID
와SECRET_ACCESS_ID
를 이전 단계에서 다운로드한 .csv 파일에서 새로 생성된 액세스 키와 비밀 액세스 키로 바꿉니다. 기본적으로 자격 증명 파일은/home/
에 저장됩니다.user
/.aws/credentials.$ aws configure --profile AmazonCloudWatchAgent AWS Access Key ID [None]:
ACCESS_KEY_ID
AWS Secret Access Key [None]:SECRET_ACCESS_ID
Default region name [None]:MY_REGION
Default output format [None]: json차트 Helm을 사용하여 CloudWatch 에이전트가 설치한 사용자 지정 리소스를 편집하여 새로 생성된 AWS 자격 증명 비밀을 추가합니다.
kubectl edit amazoncloudwatchagent cloudwatch-agent -n amazon-cloudwatch
파일 편집기가 열려 있는 동안 배포 상단에 다음 구성을 추가하여 AWS 자격 증명을 CloudWatch 에이전트 컨테이너에 탑재합니다. 경로
/home/
를 로컬 AWS 자격 증명 파일의 위치로 바꿉니다.user
/.aws/credentialsapiVersion: cloudwatch.aws.amazon.com/v1alpha1 kind: AmazonCloudWatchAgent metadata: name: cloudwatch-agent namespace: amazon-cloudwatch spec: volumeMounts: - mountPath: /rootfs volumeMounts: - name: aws-credentials mountPath: /root/.aws readOnly: true volumes: - hostPath: path: /home/
user
/.aws/credentials name: aws-credentials ---
4단계: 주석 추가
참고
ESM을 사용하는 Node.js 애플리케이션용 Application Signals를 활성화하는 경우 이 섹션의 단계들을 건너뛰고 ESM 모듈 형식으로 Node.js 애플리케이션 설정을(를) 대신 참조합니다.
다음 단계는 Kubernetes 워크로드
Application Signals에 대한 주석을 추가하려면 다음을 수행하세요.
-
주석에는 다음 2가지 옵션이 있습니다.
워크로드에 주석 추가는 클러스터의 단일 워크로드를 자동으로 계측합니다.
네임스페이스에 주석 추가는 선택한 네임스페이스에 배포된 모든 워크로드를 자동으로 계측합니다.
이러한 옵션 중 하나를 선택하고 적절한 단계를 따릅니다.
단일 워크로드에 주석을 추가하려면 다음 명령 중 하나를 입력합니다.
$WORKLOAD_TYPE
과$WORKLOAD_NAME
을 워크로드 값으로 바꿉니다.Java 워크로드:
kubectl patch
$WORKLOAD_TYPE
$WORKLOAD_NAME
-p '{"spec": {"template": {"metadata": {"annotations": {"instrumentation.opentelemetry.io/inject-java": "true"}}}}}'Python 워크로드:
kubectl patch
$WORKLOAD_TYPE
$WORKLOAD_NAME
-p '{"spec": {"template": {"metadata": {"annotations": {"instrumentation.opentelemetry.io/inject-python": "true"}}}}}'Python 애플리케이션의 경우 추가 필수 구성이 있습니다. 자세한 내용은 Application Signals가 활성화된 후 Python 애플리케이션이 시작되지 않음 단원을 참조하십시오.
.NET 워크로드의 경우:
kubectl patch
$WORKLOAD_TYPE
$WORKLOAD_NAME
-p '{"spec": {"template": {"metadata": {"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 워크로드:
kubectl patch
$WORKLOAD_TYPE
$WORKLOAD_NAME
-p '{"spec": {"template": {"metadata": {"annotations": {"instrumentation.opentelemetry.io/inject-nodejs": "true"}}}}}'
-
네임스페이스의 모든 워크로드에 주석을 추가하려면 다음 명령 중 하나를 입력합니다.
$NAMESPACE
를 네임스페이스의 이름으로 바꿉니다.네임스페이스에 Java, Python 및 .NET 워크로드가 모두 포함된 경우 두 주석을 모두 네임스페이스에 추가합니다.
네임스페이스의 Java 워크로드의 경우
kubectl annotate ns
$NAMESPACE
instrumentation.opentelemetry.io/inject-java=true네임스페이스의 Python 워크로드의 경우
kubectl annotate ns
$NAMESPACE
instrumentation.opentelemetry.io/inject-python=truePython 애플리케이션의 경우 추가 필수 구성이 있습니다. 자세한 내용은 Application Signals가 활성화된 후 Python 애플리케이션이 시작되지 않음 단원을 참조하십시오.
-
네임스페이스의 .NET 워크로드의 경우:
kubectl annotate ns
$NAMESPACE
instrumentation.opentelemetry.io/inject-dotnet=true -
네임스페이스의 Node.js 워크로드:
kubectl annotate ns
$NAMESPACE
instrumentation.opentelemetry.io/inject-nodejs=true
주석을 추가한 후 다음 명령을 입력하여 네임스페이스의 모든 모드를 다시 시작합니다.
kubectl rollout restart
이전 단계를 완료하면 CloudWatch 콘솔에서 애플리케이션 신호, 서비스를 선택합니다. 그러면 Application Signals에서 수집하는 데이터를 확인할 수 있는 대시보드가 열립니다. 데이터가 표시되는 데 몇 분 정도 걸릴 수 있습니다.
서비스 뷰에 대한 자세한 내용은 Application Signals를 사용하여 애플리케이션의 운영 상태 모니터링 섹션을 참조하세요.
ESM 모듈 형식으로 Node.js 애플리케이션 설정
ESM 모듈 형식의 Node.js 애플리케이션을 제한적으로 지원합니다. 세부 정보는 ESM 사용 Node.js에 대해 알려진 제한 사항을 참조하세요.
ESM 모듈 형식에서는 매니페스트 파일 주석을 통한 Application Signals 활성화가 작동하지 않습니다. 이전 절차를 건너뛰고 다음을 대신 수행합니다.
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 it 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 애플리케이션을 Kubernetes 클러스터에 배포합니다.