在 Kubernetes 平台上啟用應用程式訊號 - Amazon CloudWatch

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

在 Kubernetes 平台上啟用應用程式訊號

若要啟用 Amazon 以外的 Kubernetes 系統上執行的應用程式EKS,請遵循本節中的指示。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
  1. 在 開啟 CloudWatch 主控台https://console.aws.amazon.com/cloudwatch/

  2. 在導覽窗格中,選擇服務

  3. 選擇開始探索您的服務

  4. 選取核取方塊,然後選擇開始探索您的服務。

    當您第一次在帳戶中完成此步驟時,Application Signals 會建立AWSServiceRoleForCloudWatchApplicationSignals服務連結角色。此角色會授予 Application Signals 下列許可:

    • xray:GetServiceGraph

    • logs:StartQuery

    • logs:GetQueryResults

    • cloudwatch:GetMetricData

    • cloudwatch:ListMetrics

    • tag:GetResources

    如需有關此角色的詳細資訊,請參閱 CloudWatch Application Signals 的服務連結角色許可

步驟 2:在您的叢集中安裝 CloudWatch 代理程式運算子

安裝 CloudWatch 代理程式運算子會將運算子、 CloudWatch 代理程式和其他自動儀器安裝到您的叢集。若要執行此作業,請輸入以下命令。Replace (取代) $REGION 您的 AWS 區域。Replace (取代) $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

如需詳細資訊,請參閱 amazon-cloudwatch-observability 上的 GitHub。

步驟 3:為您的 Kubernetes 叢集設定 AWS 憑證

重要

如果您的 Kubernetes 叢集託管在 Amazon 上EC2,您可以略過本節並繼續 步驟 4:新增註釋

如果您的 Kubernetes 叢集是內部部署託管,您必須使用本節中的指示,將 AWS 憑證新增至 Kubernetes 環境。

設定內部部署 Kubernetes 叢集的許可
  1. 建立要用來提供許可給內部部署主機IAM的使用者:

    1. 在 開啟IAM主控台https://console.aws.amazon.com/iam/

    2. 選擇使用者 建立使用者

    3. 使用者詳細資訊 中,針對使用者名稱 輸入新IAM使用者的名稱。這是用於驗證主機 AWS 的登入名稱。然後選擇 Next (下一步)

    4. 設定許可頁面的許可選項 下,選取直接連接政策

    5. 許可政策清單中,選取要新增至使用者CloudWatchAgentServerPolicy的政策。然後選擇下一步

    6. 檢閱和建立頁面上,請確定您對使用者名稱感到滿意,且CloudWatchAgentServerPolicy政策位於許可摘要 中。

    7. 選擇建立使用者

  2. 建立和擷取您的 AWS 存取金鑰和私密金鑰:

    1. 在IAM主控台的導覽窗格中,選擇使用者,然後選擇您在上一個步驟中建立的使用者名稱。

    2. 在使用者頁面上,選擇安全憑證索引標籤。然後,在存取金鑰區段中,選擇建立存取金鑰

    3. 針對建立存取金鑰步驟 1,選擇命令列介面 (CLI)

    4. 對於建立存取金鑰步驟 2,選擇性地輸入標籤,然後選擇下一步。

    5. 針對建立存取金鑰步驟 3,選取下載 .csv 檔案,以儲存具有IAM使用者存取金鑰和秘密存取金鑰的 .csv 檔案。您需要此資訊才能進行後續步驟。

    6. 選擇完成

  3. 輸入下列命令,在內部部署主機中設定您的 AWS 憑證。Replace (取代) 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
  4. 編輯 CloudWatch 客服人員使用 Helm Chart 安裝的自訂資源,以新增新建立的 AWS 憑證秘密。

    kubectl edit amazoncloudwatchagent cloudwatch-agent -n amazon-cloudwatch
  5. 當檔案編輯器開啟時,將下列組態新增至部署頂端,將 AWS 憑證掛載到 CloudWatch 代理程式容器中。將路徑取代/home/user/.aws/credentials為本機 AWS 憑證檔案的位置。

    apiVersion: 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:新增註釋

注意

如果您使用 為 Node.js 應用程式啟用 Application SignalsESM,請略過本節中的步驟,並改為參閱 。

下一個步驟是透過將語言特定的註釋新增至 Kubernetes 工作負載命名空間 來測試 CloudWatch 應用程式 Application Signals。此註釋會自動檢測您的應用程式,以傳送指標、追蹤和日誌至 Application Signals。

新增 Application Signals 的註釋
  1. 有兩個注釋選項:

    • 註釋工作負載會自動執行叢集中的單一工作負載。

    • 標註命名空間會自動檢測所選命名空間中部署的所有工作負載。

    選擇其中一個選項,然後遵循適當的步驟。

  2. 若要註釋單一工作負載,請輸入下列其中一個命令。Replace (取代) $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"}}}}}'
  3. 若要註釋命名空間中的所有工作負載,請輸入下列其中一個命令。Replace (取代) $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=true

      對於 Python 應用程式,還有其他必要的組態。如需詳細資訊,請參閱啟用 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

    新增註釋後,輸入下列命令,重新啟動命名空間中的所有 Pod:

    kubectl rollout restart
  4. 完成上述步驟後,在 CloudWatch 主控台中選擇 Application Signals Services 。這會開啟儀表板,您可以在其中查看 Application Signals 收集的資料。可能需要幾分鐘的時間才會顯示資料。

    如需服務檢視的詳細資訊,請參閱 使用 Application Signals 監控應用程式的運作狀態

使用ESM模組格式設定 Node.js 應用程式

我們提供ESM模組格式的 Node.js 應用程式有限支援。如需詳細資訊,請參閱 使用 的 Node.js 的已知限制 ESM

對於ESM模組格式,透過註釋資訊清單檔案來啟用 Application Signals 是無效的。略過先前的程序,改為執行下列動作:

使用 為 Node.js 應用程式啟用 Application Signals ESM
  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_NAMEOTEL_RESOURCE_ATTRIBUTES_DEPLOYMENT_NAMEOTEL_RESOURCE_ATTRIBUTES_NODE_NAMEPOD_NAMESPACEOTEL_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)"
  4. 將 Node.js 應用程式部署至 Kubernetes 叢集。