在 Kubernetes 上啟用您的應用程式 - Amazon CloudWatch

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

在 Kubernetes 上啟用您的應用程式

使用本節所述的自訂設定步驟,在 Kubernetes 上啟用 CloudWatch Application Signals。

對於在 Kubernetes 上執行的應用程式,您可以自行安裝和設定 CloudWatch 代理程式和 AWS Distro for OpenTelemetry。在使用自訂 Application Signals 設定啟用的這些架構上,Application Signals 不會自動探索您的服務或其執行所在的叢集或主機的名稱。您必須在自訂設定期間指定這些名稱,而您指定的名稱是顯示在 Application Signals 儀表板中的名稱。

需求

  • 您在啟用 Application Signals 的 Kubernetes 叢集上具有管理員許可。

  • 您必須在執行 Kubernetes 叢集的環境 AWS CLI 上安裝 。如需安裝 的詳細資訊 AWS CLI,請參閱安裝或更新最新版本的 AWS CLI

  • 您已在本機終端機上安裝 kubectl 和 helm。如需詳細資訊,請參閱 kubectl Helm 文件。

步驟 1:在您的帳戶中啟用 Application Signals

您必須先在帳戶中啟用 Application Signals。如果您還沒有,請參閱 在帳戶中啟用 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 叢集是內部部署託管,您必須使用本節中的指示,將 AWS 登入資料新增至您的 Kubernetes 環境。

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

    1. 前往 https://console.aws.amazon.com/iam/ 開啟 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 登入資料。將 ACCESS_KEY_IDSECRET_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:新增註釋

注意

如果您使用 ESM 為 Node.js 應用程式啟用 Application Signals,請跳過本節中的步驟,並使用 ESM 模組格式設定 Node.js 應用程式改為參閱 。

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

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

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

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

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

  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"}}}}}'
  3. 若要註釋命名空間中的所有工作負載,請輸入下列其中一個命令。將 $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 SignalsServices。這會開啟儀表板,您可以在其中查看 Application Signals 收集的資料。可能需要幾分鐘的時間才會顯示資料。

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

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

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

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

使用 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_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 叢集。

(選用) 步驟 5:監控您的應用程式運作狀態

在 Kubernetes 上啟用應用程式後,您就可以監控應用程式的運作狀態。如需詳細資訊,請參閱使用 Application Signals 監控應用程式的運作狀態