

# Configuración del agente de CloudWatch para recopilar las métricas del clúster
<a name="Container-Insights-setup-metrics"></a>

**importante**  
Si instala Información de contenedores en un clúster de Amazon EKS, recomendamos que utilice el complemento observabilidad de EKS de Amazon CloudWatch, en lugar de seguir las instrucciones de esta sección. Para obtener más información e instrucciones, consulte [Inicio rápido con el complemento de observabilidad de EKS de Amazon CloudWatch](Container-Insights-setup-EKS-addon.md).

Para configurar Información de contenedores para recopilar métricas de, puede seguir los pasos de [Configuración de inicio rápido para Información de contenedores en Amazon EKS y Kubernetes](Container-Insights-setup-EKS-quickstart.md) o los de esta sección. En los pasos que se describen a continuación, configure el agente de CloudWatch para que pueda recopilar las métricas de los clústeres.

Si instala Información de contenedores en un clúster de Amazon EKS y sigue las instrucciones de esta sección a partir del 6 de noviembre de 2023, se instalará con observabilidad mejorada para Amazon EKS en el clúster.

## Paso 1: Cree un espacio de nombres para CloudWatch
<a name="create-namespace-metrics"></a>

Siga el paso que se describe a continuación para crear un espacio de nombres denominado `amazon-cloudwatch` para CloudWatch. Puede omitir este paso si ya ha creado este espacio de nombres.

**Para crear un espacio de nombres para CloudWatch**
+ Escriba el siguiente comando.

  ```
  kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cloudwatch-namespace.yaml
  ```

## Paso 2: Cree una cuenta de servicio en el clúster
<a name="create-service-account"></a>

Utilice uno de los siguientes métodos para crear una cuenta de servicio para el agente de CloudWatch, si todavía no dispone de una.
+ Uso de `kubectl`
+ Utilizar un archivo `kubeconfig`

### Uso de `kubectl` para la autenticación
<a name="use-kubectl"></a>

**Para utilizar `kubectl` con el fin de crear una cuenta de servicio para el agente de CloudWatch**
+ Escriba el siguiente comando.

  ```
  kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cwagent/cwagent-serviceaccount.yaml
  ```

Si no ha seguido los pasos anteriores, pero ya tiene una cuenta de servicio que desea utilizar para el agente de CloudWatch, debe asegurarse de que sigue las siguientes reglas. Además, en el resto de los pasos de la instalación de Información de contenedores debe utilizar el nombre de esa cuenta de servicio en lugar de `cloudwatch-agent`.

```
rules:
  - apiGroups: [""]
    resources: ["pods", "nodes", "endpoints"]
    verbs: ["list", "watch"]
  - apiGroups: [ "" ]
    resources: [ "services" ]
    verbs: [ "list", "watch" ]
  - apiGroups: ["apps"]
    resources: ["replicasets", "daemonsets", "deployments", "statefulsets"]
    verbs: ["list", "watch"]
  - apiGroups: ["batch"]
    resources: ["jobs"]
    verbs: ["list", "watch"]
  - apiGroups: [""]
    resources: ["nodes/proxy"]
    verbs: ["get"]
  - apiGroups: [""]
    resources: ["nodes/stats", "configmaps", "events"]
    verbs: ["create", "get"]
  - apiGroups: [""]
    resources: ["configmaps"]
    resourceNames: ["cwagent-clusterleader"]
    verbs: ["get","update"]
  - nonResourceURLs: ["/metrics"]
    verbs: ["get", "list", "watch"]
  - apiGroups: [ "discovery.k8s.io" ]
    resources: [ "endpointslices" ]
    verbs: [ "list", "watch", "get" ]
```

### Uso de `kubeconfig` para la autenticación
<a name="use-kubeconfig"></a>

También puede utilizar un archivo `kubeconfig` para la autenticación. Este método evita la necesidad de una cuenta de servicio al especificar directamente la ruta de `kubeconfig` en la configuración del agente de CloudWatch. Además, permite dejar de depender de la API del plano de control de Kubernetes para la autenticación, lo que agiliza la configuración y puede aumentar la seguridad, ya que la autenticación se administra a través del archivo kubeconfig. 

Para usar este método, actualice el archivo de configuración de su agente de CloudWatch para especificar la ruta del archivo `kubeconfig`, como en el siguiente ejemplo.

```
{
  "logs": {
    "metrics_collected": {
      "kubernetes": {
        "cluster_name": "YOUR_CLUSTER_NAME",
        "enhanced_container_insights": false,
        "accelerated_compute_metrics": false,
        "tag_service": false,
        "kube_config_path": "/path/to/your/kubeconfig" 
        "host_ip": "HOSTIP"
      }
    }
  }
}
```

Para crear un archivo `kubeconfig`, cree una solicitud de firma de certificado (CSR) para el usuario `admin/{create_your_own_user}` con el rol `system:masters` de Kubernetes. Luego, firme con la autoridad de certificación (CA) del clúster de Kubernetes y cree el archivo `kubeconfig`.

## Paso 3: Cree un ConfigMap para el agente de CloudWatch
<a name="create-configmap"></a>

Siga los pasos que se describen a continuación para crear un ConfigMap para el agente de CloudWatch.

**Para crear un ConfigMap para el agente de CloudWatch**

1. Descargue el archivo YAML de ConfigMap en el host de cliente de `kubectl` ejecutando el siguiente comando:

   ```
   curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cwagent/cwagent-configmap-enhanced.yaml
   ```

1. Edite el archivo YAML que ha descargado, tal y como se indica a continuación:
   + **cluster\$1name**: en la sección `kubernetes`, reemplace `{{cluster_name}}` con el nombre del clúster. Elimine los caracteres `{{}}`. De forma alternativa, si utiliza un clúster de Amazon EKS, puede eliminar el campo `"cluster_name"` y el valor. Si lo hace, el agente de CloudWatch detecta el nombre del clúster a partir de las etiquetas de Amazon EC2.

1. (Opcional) Realice más cambios en ConfigMap en función de sus requisitos de supervisión, tal y como se indica a continuación:
   + **metrics\$1collection\$1interval**: en la sección `kubernetes`, puede especificar la frecuencia con la que el agente recopila las métricas. El valor predeterminado es de 60 segundos. El valor predeterminado del intervalo de recopilación de cadvisor en kubelet es de 15 segundos, por lo que no debe establecer este valor en menos de 15 segundos.
   + **endpoint\$1override**: en la sección `logs`, puede especificar el punto de enlace de CloudWatch Logs si desea anular el punto de enlace predeterminado. Es posible que desee hacerlo si realiza la publicación desde un clúster de una VPC y desea que los datos vayan a un punto de enlace de la VPC.
   + **force\$1flush\$1interval**: en la sección `logs`, puede especificar el intervalo para los eventos de registro por lotes antes de que se publiquen en CloudWatch Logs. El valor predeterminado es de 5 segundos.
   + **Región**: de forma predeterminada, el agente publica las métricas en la Región donde se encuentra el nodo de trabajo. Para cambiar este comportamiento, puede agregar un campo `region` en la sección `agent`: por ejemplo `"region":"us-west-2"`
   + Sección **statsd**: si desea que el agente CloudWatch Logs se ejecute también como agente de escucha StatsD en cada nodo de trabajo de su clúster, puede agregar una la sección`statsd` a las `metrics`, como en el ejemplo siguiente. Para obtener información sobre otras opciones de StatsD para esta sección, consulte [Recuperación de las métricas personalizadas con StatsD](CloudWatch-Agent-custom-metrics-statsd.md).

     ```
     "metrics": {
       "metrics_collected": {
         "statsd": {
           "service_address":":8125"
         }
       }
     }
     ```

     A continuación, se muestra un ejemplo completo de la sección JSON. Si utiliza un archivo `kubeconfig` para la autenticación, agregue el parámetro `kube_config_path` para especificar la ruta del archivo kubeconfig.

     ```
     {
         "agent": {
             "region": "us-east-1"
         },
         "logs": {
             "metrics_collected": {
                 "kubernetes": {
                     "cluster_name": "MyCluster",
                     "metrics_collection_interval": 60,
                     "kube_config_path": "/path/to/your/kubeconfig" //if using kubeconfig for authentication
                 }
             },
             "force_flush_interval": 5,
             "endpoint_override": "logs.us-east-1.amazonaws.com"
         },
         "metrics": {
             "metrics_collected": {
                 "statsd": {
                     "service_address": ":8125"
                 }
             }
         }
     }
     ```

1. Cree el ConfigMap en el clúster ejecutando el siguiente comando.

   ```
   kubectl apply -f cwagent-configmap-enhanced.yaml
   ```

## Paso 4: Implemente el agente de CloudWatch como un DaemonSet
<a name="deploy-agent-yaml"></a>

Para terminar la instalación del agente de CloudWatch y comenzar a recopilar las métricas de contenedor, siga los pasos que se describen a continuación.

**Para implementar el agente de CloudWatch como un DaemonSet**

1. 
   + Si no desea utilizar StatsD en el clúster, escriba el siguiente comando.

     ```
     kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cwagent/cwagent-daemonset.yaml
     ```
   + Si desea utilizar StatsD, siga estos pasos:

     1. Descargue el archivo YAML del DaemonSet en el host de cliente de `kubectl` ejecutando el siguiente comando.

        ```
        curl -O  https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cwagent/cwagent-daemonset.yaml
        ```

     1. Borre el comentario de la sección `port` en el archivo `cwagent-daemonset.yaml` como se indica a continuación: 

        ```
        ports:
          - containerPort: 8125
            hostPort: 8125
            protocol: UDP
        ```

     1. Implemente el agente de CloudWatch en el clúster con el siguiente comando.

        ```
        kubectl apply -f cwagent-daemonset.yaml
        ```

     1. Implemente el agente de CloudWatch en los nodos de Windows de su clúster ejecutando el siguiente comando. El oyente StatsD no es compatible con el agente de CloudWatch en Windows.

        ```
        kubectl apply -f cwagent-daemonset-windows.yaml
        ```

1. Compruebe que el agente está implementado ejecutando el siguiente comando.

   ```
   kubectl get pods -n amazon-cloudwatch
   ```

Cuando finaliza, el agente de CloudWatch crea un grupo de registros denominado `/aws/containerinsights/Cluster_Name/performance` y envía los eventos de registro de rendimiento a este grupo de registros. Si también configura el agente como un agente de escucha de StatsD, el agente también escucha las métricas de StatsD en el puerto 8125 con la dirección IP del nodo en el que está programado el pod de la aplicación.

### Solución de problemas
<a name="ContainerInsights-deploy-troubleshooting"></a>

Si el agente no se implementa correctamente, pruebe lo siguiente:
+ Ejecute el siguiente comando para obtener la lista de pods.

  ```
  kubectl get pods -n amazon-cloudwatch
  ```
+ Ejecute el siguiente comando y compruebe los eventos de la parte inferior de la salida.

  ```
  kubectl describe pod pod-name -n amazon-cloudwatch
  ```
+ Ejecute el siguiente comando para comprobar los registros.

  ```
  kubectl logs pod-name  -n amazon-cloudwatch
  ```