

# Habilitación de sus aplicaciones en Kubernetes
<a name="CloudWatch-Application-Signals-Enable-KubernetesMain"></a>

Habilite CloudWatch Application Signals en Kubernetes mediante los pasos de configuración personalizados descritos en esta sección.

Para las aplicaciones que se ejecutan en Kubernetes, instale y configure el agente de CloudWatch y AWS Distro para OpenTelemetry usted mismo. En estas arquitecturas habilitadas con una configuración personalizada de Application Signals, Application Signals no detecta automáticamente los nombres de los servicios ni los hosts o clústeres en los que se ejecutan. Debe especificar estos nombres durante la configuración personalizada, y los nombres que especifique son los que aparecen en los paneles de Application Signals.

**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](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html).
+ Debe tener kubectl y helm instalados en su terminal local. Para más información, consulte la documentación de [kubectl](https://kubernetes.io/docs/tasks/tools/#kubectl) y [Helm](https://helm.sh/).

## Paso 1: habilitar Application Signals en la cuenta
<a name="CloudWatch-Application-Signals-Kubernetes"></a>

Primero debe habilitar Application Signals en su cuenta. Si no lo ha hecho, consulte [Habilitación de Application Signals en su cuenta](CloudWatch-Application-Signals-Enable.md).

## Paso 2: instalar el operador del agente de CloudWatch en su clúster
<a name="Application-Signals-Enable-Kubernetes-agent"></a>

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 *\$1REGION* por su región de AWS. Sustituya *\$1YOUR\$1CLUSTER\$1NAME* 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](https://github.com/aws-observability/helm-charts/tree/main/charts/amazon-cloudwatch-observability) en GitHub.

## Paso 3: configurar las credenciales de AWS para los clústeres de Kubernetes
<a name="Application-Signals-Enable-Kubernetes-credentials"></a>

**importante**  
Si el clúster de Kubernetes está alojado en Amazon EC2, puede omitir esta sección y pasar a [Paso 4: agregar anotaciones](#Application-Signals-Enable-Kubernetes-annotations).

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**

1. Cree el usuario de IAM que se utilizará para conceder los permisos a su host en las instalaciones:

   1. Abra la consola de IAM en [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/).

   1. Seleccione **Usuarios**, **Crear nuevos usuarios**.

   1. 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**.

   1. En la página **Establecer permisos**, en **Opciones de permisos**, seleccione **Adjuntar políticas directamente**.

   1. En la lista de **Políticas de permisos**, seleccione la política **CloudWatchAgentServerPolicy** para agregarla a su usuario. A continuación, elija **Siguiente**.

   1. 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**.

   1. Seleccione la opción **Crear usuario**.

1. Cree y recupere su clave de acceso y su clave secreta de AWS:

   1. 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.

   1.  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**.

   1. En el **paso 1 de Crear clave de acceso**, elija **Interfaz de línea de comandos (CLI)**.

   1. En el **Paso 2 de Crear clave de acceso**, como opción, introduzca una etiqueta y seleccione **Siguiente**.

   1. 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.

   1. Seleccione **Listo**.

1. Introduzca el siguiente comando para configurar sus credenciales de AWS en su host en las instalaciones. Sustituya *ACCESS\$1KEY\$1ID* y *SECRET\$1ACCESS\$1ID* 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]: json
   ```

1. Edite 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
   ```

1. 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/user/.aws/credentials` por la ubicación del archivo de credenciales de AWS local.

   ```
   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
   ---
   ```

## Paso 4: agregar anotaciones
<a name="Application-Signals-Enable-Kubernetes-annotations"></a>

**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](#Kubernetes-NodeJs-ESM) en su lugar.

El siguiente paso consiste en instrumentar su aplicación para CloudWatch Application Signals al agregar una [anotación](https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/) específica del idioma a la [carga de trabajo](https://kubernetes.io/docs/concepts/workloads/) o al [espacio de nombres](https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/) de Kubernetes. Esta anotación instrumenta automáticamente la aplicación para enviar métricas, seguimientos y registros a Application Signals.

**Adición de anotaciones para Application Signals**

1. 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.

1. Para anotar una sola carga de trabajo, ingrese uno de los siguientes comandos. Sustituya *\$1WORKLOAD\$1TYPE* y *\$1WORKLOAD\$1NAME* 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](CloudWatch-Application-Signals-Enable-Troubleshoot.md#Application-Signals-troubleshoot-starting-Python).
   + 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"}}}}}'
     ```

1. Para anotar todas las cargas de trabajo en un espacio de nombres, ingrese uno de los siguientes comandos. Reemplace *\$1NAMESPACE* 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=true
     ```
   + Para las cargas de trabajo de Python en el espacio de nombres:

     ```
     kubectl annotate ns $NAMESPACE 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](CloudWatch-Application-Signals-Enable-Troubleshoot.md#Application-Signals-troubleshoot-starting-Python).
   + 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
   ```

1. 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](Services.md).

### Configuración de una aplicación Node.js con el formato de módulo ESM
<a name="Kubernetes-NodeJs-ESM"></a>

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](CloudWatch-Application-Signals-supportmatrix.md#ESM-limitations).

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**

1. 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
   ```

1. 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"]
   ```

1. Agregue las variables de entorno `OTEL_RESOURCE_ATTRIBUTES_POD_NAME`, `OTEL_RESOURCE_ATTRIBUTES_NODE_NAME`, `OTEL_RESOURCE_ATTRIBUTES_DEPLOYMENT_NAME`, `POD_NAMESPACE` y `OTEL_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)"
   ```

1. Implemente la aplicación Node.js en el clúster de Kubernetes.

## (Opcional) Paso 5: supervisar el estado de su aplicación
<a name="CloudWatch-Application-Signals-Monitor-Kubernetes"></a>

Una vez que haya habilitado sus aplicaciones en Kubernetes, podrá supervisar el estado de las mismas. Para obtener más información, consulte [Monitoreo del estado operativo de sus aplicaciones con Application Signals](Services.md).