

# Habilitar aplicações no Kubernetes
<a name="CloudWatch-Application-Signals-Enable-KubernetesMain"></a>

Habilite o CloudWatch Application Signals no Kubernetes usando as etapas de configuração personalizadas descritas nesta seção.

Para aplicações em execução no Kubernetes, instale e configure por sua conta o agente do CloudWatch e o AWS Distro para OpenTelemetry. Nessas arquiteturas habilitadas com uma configuração personalizada do Application Signals, o Application Signals não descobre automaticamente os nomes dos seus serviços ou dos hosts ou clusters em que eles são executados. Você deve especificar esses nomes durante a configuração personalizada, e os nomes especificados serão exibidos nos painéis do Application Signals.

**Requisitos**
+ Você tem permissões de administrador no cluster do Kubernetes em que está realizando a habilitação do Application Signals.
+ Você deve ter a AWS CLI instalada no ambiente em que seu cluster do Kubernetes está sendo executado. Para obter mais informações sobre como instalar a AWS CLI, consulte [Instalar ou atualizar para a versão mais recente da AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html).
+ Você tem o kubectl e o helm instalados em seu terminal local. Para obter mais informações, consulte a documentação do [kubectl](https://kubernetes.io/docs/tasks/tools/#kubectl) e do [Helm](https://helm.sh/).

## Etapa 1: habilitar o Application Signals em sua conta
<a name="CloudWatch-Application-Signals-Kubernetes"></a>

Você deve primeiro habilitar o Application Signals na conta. Se você não tiver feito isso, consulte [Habilitar o Application Signals na conta](CloudWatch-Application-Signals-Enable.md).

## Etapa 2: instalar o operador do agente do CloudWatch no seu cluster
<a name="Application-Signals-Enable-Kubernetes-agent"></a>

A instalação do operador do agente do CloudWatch instala o operador, o agente do CloudWatch e outras instrumentações automáticas no cluster. Para fazer isso, insira o comando a seguir. Substitua *\$1REGION* pela sua região da AWS. Substitua *\$1YOUR\$1CLUSTER\$1NAME* pelo nome que você deseja que apareça para seu cluster nos painéis do 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 obter mais informações, consulte [amazon-cloudwatch-observability](https://github.com/aws-observability/helm-charts/tree/main/charts/amazon-cloudwatch-observability) no GitHub.

## Etapa 3: configurar as credenciais da AWS para seus clusters do Kubernetes
<a name="Application-Signals-Enable-Kubernetes-credentials"></a>

**Importante**  
Se o cluster do Kubernetes estiver hospedado no Amazon EC2, ignore esta seção e vá para [Etapa 4: adicionar anotações](#Application-Signals-Enable-Kubernetes-annotations).

Se o cluster do Kubernetes estiver hospedado on-premises, você deverá usar as instruções nesta seção para adicionar as credenciais da AWS ao seu ambiente do Kubernetes.

**Para configurar permissões para um cluster do Kubernetes on-premises**

1. Crie o usuário do IAM a ser usado para fornecer permissões ao seu host on-premises:

   1. Abra o console do IAM em [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/).

   1. Escolha **Usuários**, **Criar usuário**.

   1. Em **Detalhes do usuário**, em **Nome do usuário**, insira um nome para o novo usuário do IAM. Esse é o nome de login para a AWS que será usado para autenticar seu host. Em seguida, escolha **Próximo**

   1. Na página **Definir permissões**, em **Opções de permissões**, escolha **Anexar políticas diretamente**.

   1. Na lista de **Políticas de permissões**, selecione a política **CloudWatchAgentServerPolicy** para adicionar ao seu usuário. Em seguida, escolha **Next (Próximo)**.

   1. Na página **Revisar e criar**, verifique se você está satisfeito com o nome de usuário e se a política **CloudWatchAgentServerPolicy** está no **Resumo de permissões**.

   1. Escolha **Criar usuário**

1. Crie e recupere sua chave de acesso da AWS e uma chave secreta:

   1. No painel de navegação do console do IAM, escolha **Usuários** e depois selecione o nome do usuário do usuário que você criou na etapa anterior.

   1.  Na página do usuário, escolha a guia **Credenciais de segurança**. Depois, na seção **Chaves de acesso**, escolha **Criar chave de acesso**.

   1. Em **Criar chave de acesso: etapa 1**, escolha **Command Line Interface (CLI)**.

   1. Em **Criar chave de acesso: etapa 2**, insira uma tag opcional e escolha **Próximo**.

   1. Em **Criar chave de acesso: etapa 3**, selecione **Baixar arquivo .csv** para salvar um arquivo .csv com a chave de acesso e a chave de acesso secreta do usuário do IAM. Você precisará dessas informações para as próximas etapas.

   1. Selecione **Concluído**.

1. Configure suas credenciais da AWS no host on-premises ao inserir o comando a seguir. Substitua *ACCESS\$1KEY\$1ID* e *SECRET\$1ACCESS\$1ID* pela chave de acesso recém-gerada e pela chave de acesso secreta do arquivo.csv que você baixou na etapa anterior. Por padrão, o arquivo de credencial é salvo em `/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 o recurso personalizado que o agente do CloudWatch instalou usando o chart do Helm para adicionar o segredo de credenciais AWS recém-criado.

   ```
   kubectl edit amazoncloudwatchagent cloudwatch-agent -n amazon-cloudwatch
   ```

1. Enquanto seu editor de arquivos estiver aberto, monte as credenciais da AWS no contêiner do agente do CloudWatch adicionando a configuração a seguir na parte superior da implantação. Substitua o caminho `/home/user/.aws/credentials` pelo local do seu arquivo de credenciais da 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
   ---
   ```

## Etapa 4: adicionar anotações
<a name="Application-Signals-Enable-Kubernetes-annotations"></a>

**nota**  
Se você estiver habilitando o Application Signals para uma aplicação do Node.js com ESM, ignore as etapas apresentadas nesta seção e, em vez disso, consulte [Configuração de uma aplicação do Node.js usando o formato de módulo ESM](#Kubernetes-NodeJs-ESM).

A próxima etapa é instrumentar sua aplicação para o CloudWatch Application Signals adicionando uma [anotação](https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/) específica da linguagem à [workload](https://kubernetes.io/docs/concepts/workloads/) ou ao [namespace](https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/) do Kubernetes. Essa anotação instrumenta automaticamente a aplicação para enviar métricas, rastreamentos e logs para o Application Signals.

**Para adicionar as anotações para o Application Signals**

1. Você tem duas opções para a anotação:
   + **Anotar a workload** instrumenta automaticamente uma única workload em um cluster.
   + **Anotar o namespace** instrumenta automaticamente todas as workloads implantadas no namespace selecionado.

   Escolha uma das opções e siga as etapas apropriadas.

1. Para anotar uma única workload, insira um dos comandos apresentados a seguir. Substitua *\$1WORKLOAD\$1TYPE* e *\$1WORKLOAD\$1NAME* com os valores para a sua workload.
   + Para workloads em Java:

     ```
     kubectl patch $WORKLOAD_TYPE $WORKLOAD_NAME -p '{"spec": {"template": {"metadata": {"annotations": {"instrumentation.opentelemetry.io/inject-java": "true"}}}}}'
     ```
   + Para workloads em Python:

     ```
     kubectl patch $WORKLOAD_TYPE $WORKLOAD_NAME -p '{"spec": {"template": {"metadata": {"annotations": {"instrumentation.opentelemetry.io/inject-python": "true"}}}}}'
     ```

     Para aplicações em Python, existem configurações adicionais necessárias. Para obter mais informações, consulte [A aplicação em Python não é iniciada após a habilitação do Application Signals](CloudWatch-Application-Signals-Enable-Troubleshoot.md#Application-Signals-troubleshoot-starting-Python).
   + Para workloads .NET:

     ```
     kubectl patch $WORKLOAD_TYPE $WORKLOAD_NAME -p '{"spec": {"template": {"metadata": {"annotations": {"instrumentation.opentelemetry.io/inject-dotnet": "true"}}}}}'
     ```
**nota**  
Para habilitar o Application Signals para uma workload em .NET em imagens baseadas no Alpine Linux (`linux-musl-x64`), adicione a anotação adicional apresentada a seguir.  

     ```
     instrumentation.opentelemetry.io/otel-dotnet-auto-runtime: "linux-musl-x64"
     ```
   + Para workloads em Node.js:

     ```
     kubectl patch $WORKLOAD_TYPE $WORKLOAD_NAME -p '{"spec": {"template": {"metadata": {"annotations": {"instrumentation.opentelemetry.io/inject-nodejs": "true"}}}}}'
     ```

1. Para anotar todas as workloads em um namespace, insira um dos comandos a seguir. Substitua *\$1NAMESPACE* pelo nome do seu namespace.

   Se o namespace incluir workloads em Java, Python e .NET, adicione todas as anotações ao namespace.
   + Para workloads em Java no namespace:

     ```
     kubectl annotate ns $NAMESPACE instrumentation.opentelemetry.io/inject-java=true
     ```
   + Para workloads em Python no namespace:

     ```
     kubectl annotate ns $NAMESPACE instrumentation.opentelemetry.io/inject-python=true
     ```

     Para aplicações em Python, existem configurações adicionais necessárias. Para obter mais informações, consulte [A aplicação em Python não é iniciada após a habilitação do Application Signals](CloudWatch-Application-Signals-Enable-Troubleshoot.md#Application-Signals-troubleshoot-starting-Python).
   + Para workloads do .NET no namespace:

     ```
     kubectl annotate ns $NAMESPACE instrumentation.opentelemetry.io/inject-dotnet=true
     ```
   + Para workloads em Node.js no namespace:

     ```
     kubectl annotate ns $NAMESPACE instrumentation.opentelemetry.io/inject-nodejs=true
     ```

   Depois de adicionar as anotações, reinicie todos os pods no namespace inserindo o seguinte comando:

   ```
   kubectl rollout restart
   ```

1. Quando as etapas anteriores forem concluídas, no console do CloudWatch, escolha **Application Signals**, **Serviços**. Essa ação abre os painéis nos quais você pode consultar os dados que o Application Signals coleta. Pode demorar alguns minutos para que os dados sejam exibidos.

   Para obter mais informações sobre a visualização dos **Serviços**, consulte [Monitorar a integridade operacional das suas aplicações com o Application Signals](Services.md).

### Configuração de uma aplicação do Node.js usando o formato de módulo ESM
<a name="Kubernetes-NodeJs-ESM"></a>

Fornecemos suporte limitado para aplicações do Node.js com o formato de módulo ESM. Para obter detalhes, consulte [Limitações conhecidas sobre o uso de ESM com o Node.js](CloudWatch-Application-Signals-supportmatrix.md#ESM-limitations).

No formato de módulo ESM, a habilitação do Application Signals ao usar a anotação do arquivo manifesto não funciona corretamente. Ignore o procedimento anterior e, em vez disso, execute as seguintes ações:

**Para habilitar o Application Signals em uma aplicação do Node.js com o ESM**

1. Instale as dependências relevantes para a instrumentação automática na aplicação do Node.js:

   ```
   npm install @aws/aws-distro-opentelemetry-node-autoinstrumentation
   npm install @opentelemetry/instrumentation@0.54.0
   ```

1. Adicione as variáveis de ambiente, apresentadas a seguir, ao Dockerfile da aplicação e crie a imagem.

   ```
   ...
   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. Adicione as variáveis de ambiente `OTEL_RESOURCE_ATTRIBUTES_POD_NAME`, `OTEL_RESOURCE_ATTRIBUTES_NODE_NAME`, `OTEL_RESOURCE_ATTRIBUTES_DEPLOYMENT_NAME`, `POD_NAMESPACE` e `OTEL_RESOURCE_ATTRIBUTES` ao arquivo de implantação no formato YAML da aplicação. Por exemplo:

   ```
   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. Realize a implantação da aplicação do Node.js no cluster do Kubernetes.

## (Opcional) Etapa 5: monitorar a integridade da aplicação
<a name="CloudWatch-Application-Signals-Monitor-Kubernetes"></a>

Depois de habilitar as aplicações no Kubernetes, você pode monitorar a integridade da aplicação. Para obter mais informações, consulte [Monitorar a integridade operacional das suas aplicações com o Application Signals](Services.md).