Habilitación de Application Signals en plataformas de Kubernetes
Para habilitar las aplicaciones que se ejecutan en sistemas Kubernetes distintos de Amazon EKS, siga las instrucciones de esta sección. Application Signals admite aplicaciones Java, Python y .NET.
Requisitos
Tiene permiso de administrador en el clúster de Kubernetes en el que está habilitando Application Signals.
Debe tener la AWS CLI instalada en el entorno en el que se ejecuta el clúster de Kubernetes. Para obtener información sobre cómo instalar AWS CLI, consulte Instalar o actualizar la versión más reciente de la AWS CLI.
Debe tener kubectl y helm instalados en su terminal local. Para más información, consulte la documentación de kubectl
y Helm .
Paso 1: habilitar Application Signals en la cuenta
Si aún no ha activado Application Signals en esta cuenta, debe conceder a Application Signals los permisos que necesita para detectar los servicios. Para ello, haga lo siguiente. Solo es necesario hacerlo una vez para la cuenta.
Para habilitar Application Signals para las aplicaciones
Abra la consola de CloudWatch en https://console.aws.amazon.com/cloudwatch/
. En el panel de navegación, elija Servicios.
Elija Comenzar a detectar sus servicios.
Marque la casilla de verificación y seleccione Empiece a detectar los servicios.
Cuando completa este paso por primera vez en la cuenta, Application Signals crea el rol vinculado al servicio AWSServiceRoleForCloudWatchApplicationSignals. Este rol otorga a Application Signals los siguientes permisos:
-
xray:GetServiceGraph
-
logs:StartQuery
-
logs:GetQueryResults
-
cloudwatch:GetMetricData
-
cloudwatch:ListMetrics
-
tag:GetResources
Para obtener más información acerca de este rol, consulte Permisos de roles vinculados a un servicio para CloudWatch Application Signals.
-
Paso 2: instalar el operador del agente de CloudWatch en su clúster
Al instalar el operador del agente de CloudWatch, se instalan el operador, el agente de CloudWatch y otras instrumentaciones automáticas en el clúster. Para ello, introduzca el siguiente comando. Sustituya $REGION
por su región de AWS. Sustituya $YOUR_CLUSTER_NAME
por el nombre que desee que aparezca para su clúster en los paneles de 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
Para obtener más información, consulte amazon-cloudwatch-observability
Paso 3: configurar las credenciales de AWS para los clústeres de Kubernetes
importante
Si el clúster de Kubernetes está alojado en Amazon EC2, puede omitir esta sección y pasar a Paso 4: agregar anotaciones.
Si su clúster de Kubernetes está alojado en las instalaciones, debe seguir las instrucciones de esta sección para agregar credenciales de AWS a su entorno de Kubernetes.
Configuración de los permisos de un clúster de Kubernetes en las instalaciones
Cree el usuario de IAM que se utilizará para conceder los permisos a su host en las instalaciones:
Abra la consola de IAM en https://console.aws.amazon.com/iam/
. Seleccione Usuarios, Crear nuevos usuarios.
En Detalles del usuario, en Nombre de usuario, introduzca un nombre para el nuevo usuario de IAM. Este es su nombre de inicio de sesión de AWS y lo utilizará para autenticar su host. A continuación, elija Siguiente
En la página Establecer permisos, en Opciones de permisos, seleccione Adjuntar políticas directamente.
En la lista de Políticas de permisos, seleccione la política CloudWatchAgentServerPolicy para agregarla a su usuario. A continuación, elija Siguiente.
En la página Revisar y crear, asegúrese de que esté satisfecho con el nombre de usuario y de que la política CloudWatchAgentServerPolicy aparezca en Resumen de permisos.
Seleccione la opción Crear usuario.
Cree y recupere su clave de acceso y su clave secreta de AWS:
En el panel de navegación de la consola de IAM, seleccione Usuarios y, a continuación, seleccione el nombre de usuario que creó en el paso anterior.
En la página del usuario, seleccione la pestaña Credenciales de seguridad. A continuación, en la sección Claves de acceso, seleccione Crear clave de acceso.
En el paso 1 de Crear clave de acceso, elija Interfaz de línea de comandos (CLI).
En el Paso 2 de Crear clave de acceso, como opción, introduzca una etiqueta y seleccione Siguiente.
En el Paso 3 de Crear clave de acceso, seleccione Descargar archivo .csv para guardar un archivo .cvs con la clave de acceso y la clave de acceso secreta de su usuario de IAM. Necesita esta información para los siguientes pasos.
Seleccione Listo.
Introduzca el siguiente comando para configurar sus credenciales de AWS en su host en las instalaciones. Sustituya
ACCESS_KEY_ID
ySECRET_ACCESS_ID
por la clave de acceso y la clave de acceso secreta que generó recién y que se encuentran en archivo .csv que descargó en el paso anterior. De forma predeterminada, el archivo de credenciales se guarda en/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]: jsonEdite el recurso personalizado que el agente de CloudWatch instaló con el gráfico de Helm para agregar las credenciales secretas de AWS recién creadas.
kubectl edit amazoncloudwatchagent cloudwatch-agent -n amazon-cloudwatch
Mientras el editor de archivos esté abierto, monte las credenciales de AWS en el contenedor de agentes de CloudWatch y agregue la siguiente configuración en la parte superior de la implementación. Sustituya la ruta
/home/
por la ubicación del archivo de credenciales de AWS local.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 ---
Paso 4: agregar anotaciones
nota
Si desea habilitar Application Signals para una aplicación Node.js con ESM, omita los pasos de esta sección y consulte Configuración de una aplicación Node.js con el formato de módulo ESM en su lugar.
El siguiente paso consiste en instrumentar su aplicación para CloudWatch Application Signals al agregar una anotación
Adición de anotaciones para Application Signals
-
Dispone de dos opciones para realizar la anotación:
Annotate Workload instrumenta automáticamente una sola carga de trabajo en un clúster.
Anotar el espacio de nombres instrumenta automáticamente todas las cargas de trabajo desplegadas en el espacio de nombres seleccionado.
Seleccione una de esas opciones y siga los pasos correspondientes.
Para anotar una sola carga de trabajo, ingrese uno de los siguientes comandos. Sustituya
$WORKLOAD_TYPE
y$WORKLOAD_NAME
por los valores reales de la carga de trabajo.Para cargas de trabajo de Java:
kubectl patch
$WORKLOAD_TYPE
$WORKLOAD_NAME
-p '{"spec": {"template": {"metadata": {"annotations": {"instrumentation.opentelemetry.io/inject-java": "true"}}}}}'Para cargas de trabajo de Python:
kubectl patch
$WORKLOAD_TYPE
$WORKLOAD_NAME
-p '{"spec": {"template": {"metadata": {"annotations": {"instrumentation.opentelemetry.io/inject-python": "true"}}}}}'Para las aplicaciones Python, se requieren configuraciones adicionales. Para obtener más información, consulte La aplicación Python no se inicia después de activar Application Signals.
Para cargas de trabajo .NET:
kubectl patch
$WORKLOAD_TYPE
$WORKLOAD_NAME
-p '{"spec": {"template": {"metadata": {"annotations": {"instrumentation.opentelemetry.io/inject-dotnet": "true"}}}}}'nota
Para habilitar Application Signals para una carga de trabajo de .NET en imágenes basadas en Alpine Linux (
linux-musl-x64
), agregue la siguiente anotación adicional.instrumentation.opentelemetry.io/otel-dotnet-auto-runtime: "linux-musl-x64"
Para cargas de trabajo de Node.js:
kubectl patch
$WORKLOAD_TYPE
$WORKLOAD_NAME
-p '{"spec": {"template": {"metadata": {"annotations": {"instrumentation.opentelemetry.io/inject-nodejs": "true"}}}}}'
-
Para anotar todas las cargas de trabajo en un espacio de nombres, ingrese uno de los siguientes comandos. Reemplace
$NAMESPACE
por el nombre del espacio de nombres.Si el espacio de nombres incluye cargas de trabajo de Java, Python y .NET, agregue todas las anotaciones al espacio de nombres.
Para las cargas de trabajo de Java en el espacio de nombres:
kubectl annotate ns
$NAMESPACE
instrumentation.opentelemetry.io/inject-java=truePara las cargas de trabajo de Python en el espacio de nombres:
kubectl annotate ns
$NAMESPACE
instrumentation.opentelemetry.io/inject-python=truePara las aplicaciones Python, se requieren configuraciones adicionales. Para obtener más información, consulte La aplicación Python no se inicia después de activar Application Signals.
-
Para las cargas de trabajo de .NET en el espacio de nombres:
kubectl annotate ns
$NAMESPACE
instrumentation.opentelemetry.io/inject-dotnet=true -
Para cargas de trabajo de Node.js en el namespace:
kubectl annotate ns
$NAMESPACE
instrumentation.opentelemetry.io/inject-nodejs=true
Una vez que agregue las anotaciones, reinicie todos los pods del espacio de nombres al ingresar el siguiente comando:
kubectl rollout restart
Una vez completados los pasos anteriores, en la consola de CloudWatch, seleccione Application Signals, Servicios. Esto abre los paneles de control en los que puede ver los datos que recopila Application Signals. Es posible que se tarde unos minutos en mostrar los datos.
Para obtener más información sobre la vista de los Servicios, consulte Monitoreo del estado operativo de sus aplicaciones con Application Signals.
Configuración de una aplicación Node.js con el formato de módulo ESM
La compatibilidad ofrecida para las aplicaciones Node.js con el formato de módulo ESM es limitada. Para obtener más información, consulte Limitaciones conocidas de Node.js con ESM.
Para el formato de módulo ESM, no es posible habilitar Application Signals anotando el archivo manifiesto. Omita el procedimiento anterior y siga estos pasos:
Para habilitar Application Signals para una aplicación Node.js con ESM
Instale en su aplicación Node.js las dependencias pertinentes para la autoinstrumentación:
npm install @aws/aws-distro-opentelemetry-node-autoinstrumentation npm install @opentelemetry/instrumentation@0.54.0
Agregue las siguientes variables de entorno al archivo Dockerfile de su aplicación y cree la imagen.
... 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"]
Agregue las variables de entorno
OTEL_RESOURCE_ATTRIBUTES_POD_NAME
,OTEL_RESOURCE_ATTRIBUTES_NODE_NAME
,OTEL_RESOURCE_ATTRIBUTES_DEPLOYMENT_NAME
,POD_NAMESPACE
yOTEL_RESOURCE_ATTRIBUTES
al archivo de implementación yaml de la aplicación. Por ejemplo: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)"Implemente la aplicación Node.js en el clúster de Kubernetes.