Ao ativar o TLS mútuo (mTLS) no Service Mesh (ASM), o proxy sidecar intercepta todo o tráfego de entrada das suas aplicações. Consequentemente, o acesso à porta que expõe as métricas da aplicação também deve ocorrer via mTLS. Para serviços críticos, proteger a coleta de métricas é tão importante quanto criptografar a comunicação entre serviços. Este tópico utiliza uma instância do Service Mesh (ASM) implantada com o Prometheus Operator para demonstrar como coletar métricas de aplicações em uma malha de serviços via mTLS.
Se você utilizar o Application Real-Time Monitoring Service (ARMS) da Alibaba Cloud para coletar métricas, a versão do agente deve ser 1.1.20 ou posterior. Faça login no console do ARMS. No painel de navegação à esquerda, clique em Integration Management. Localize seu cluster na lista e, na coluna Actions, clique em Configure Agent para visualizar a versão do agente Prometheus e atualizá-la, se necessário.
Pré-requisitos
A aplicação de exemplo Bookinfo está implantada. Para mais informações, consulte Implantar uma aplicação no cluster associado à sua instância do ASM.
Configurar o Prometheus para coletar métricas via TLS
Para superar a autenticação TLS imposta pelo proxy sidecar, o Prometheus precisa usar um certificado emitido pelo certificado raiz da instância do ASM. Utilize a capacidade de montagem de certificados do proxy sidecar para isso. Ao definir anotações específicas para o pod do Prometheus, configure o proxy sidecar para montar o certificado emitido pelo plano de controle do ASM em um volume compartilhado. Em seguida, o contêiner do Prometheus acessa o certificado e a chave ao montar esse volume compartilhado. As etapas a seguir descrevem esse processo:
-
Adicione o volume
istio-certsao pod do Prometheus.volumes: - emptyDir: medium: Memory name: istio-certs -
Adicione as duas
annotations a seguir ao pod do Prometheus.annotations: proxy.istio.io/config: | proxyMetadata: OUTPUT_CERTS: /etc/istio-output-certs sidecar.istio.io/userVolumeMount: '[{"name": "istio-certs", "mountPath": "/etc/istio-output-certs"}]'proxy.istio.io/config: Especifica a configuração do proxy, ondeproxyMetadata.OUTPUT_CERTSarmazena os certificados e chaves no caminho/etc/istio-output-certs.sidecar.istio.io/userVolumeMount: Monta um volume no caminho/etc/istio-output-certsdentro do contêiner do proxy sidecar.
-
Monte o volume
istio-certsno caminho/etc/prom-certs/do contêiner do Prometheus para permitir que ele obtenha os certificados e chaves gravados pelo proxy sidecar nesse local.volumeMounts: - mountPath: /etc/prom-certs/ name: istio-certs -
Na configuração de coleta, especifique quais workloads usam TLS para iniciar solicitações de coleta de métricas e forneça o caminho do certificado. Apenas workloads com proxy sidecar injetado exigem essa configuração.
Este tópico usa um ambiente com Prometheus Operator como exemplo.
apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: productpage labels: app: productpage team: bookinfo spec: selector: matchLabels: app: productpage endpoints: - port: http-9080 interval: 30s path: /metrics scheme: https tlsConfig: caFile: /etc/prom-certs/root-cert.pem certFile: /etc/prom-certs/cert-chain.pem keyFile: /etc/prom-certs/key.pem insecureSkipVerify: trueNo yaml anterior, o campo
labelsdefine a coleta de métricas para a aplicação productpage e especifica seu endpoint de coleta. Na definição do endpoint, as configurações relacionadas ao TLS são:scheme: https: Indica que a requisição é enviada via HTTPS.tlsConfig: Define os caminhos dos arquivos para o certificado, certificado da CA e chave.insecureSkipVerify: true: Permite acesso com autenticação insegura, pois o Prometheus não suporta o esquema de nomenclatura de identidade do Istio.
Essa configuração permite que o Prometheus monte o certificado e a chave fornecidos pelo proxy sidecar e os utilize para iniciar requisições TLS.
Procedimento
Etapa 1: Instalar o Prometheus Operator
-
Clone o repositório de código-fonte do Prometheus Operator do GitHub para sua máquina local executando o comando abaixo.
git clone https://github.com/prometheus-operator/prometheus-operator.git -
Instale o Prometheus Operator executando o seguinte comando.
cd prometheus-operator/ kubectl create -f bundle.yaml -
Verifique o status dos pods executando este comando.
kubectl get podsSaída esperada:
NAME READY STATUS RESTARTS prometheus-operator-58dd988c9c-qhrrp 2/2 Running 0Essa saída indica que o Prometheus Operator foi instalado com sucesso.
Etapa 2: Implantar o Prometheus usando um CR
-
Salve o yaml a seguir em um arquivo local chamado prometheus.yaml.
O yaml inclui a declaração da instância do Prometheus, além do ServiceAccount, ClusterRole e ClusterRoleBinding necessários. A configuração do Deployment contém as definições de montagem de volume de certificado descritas em Configurar o Prometheus para coletar métricas via TLS.
NotaOs recursos personalizados (CRs) relacionados ao Prometheus fornecidos neste tópico servem apenas para fins de demonstração. Ajuste-os conforme seu ambiente de produção.
-
Aplique o arquivo prometheus.yaml no cluster executando o comando abaixo.
kubectl apply -f prometheus.yaml -
Verifique se a instância do Prometheus iniciou corretamente executando o seguinte comando.
kubectl get podsSaída esperada:
NAME READY STATUS RESTARTS prometheus-default-0 3/3 Running 0 prometheus-default-1 3/3 Running 0 prometheus-operator-58dd988c9c-qhrrp 2/2 Running 0A saída mostra que os pods prometheus-default-0 e prometheus-default-1 estão em execução.
Etapa 3: Definir regras de coleta usando ServiceMonitor
-
Salve o yaml a seguir em um arquivo local chamado service-monitor.yaml.
Esse arquivo yaml contém a declaração da API ServiceMonitor, que descreve como coletar métricas do workload. O arquivo exibe o caminho do certificado e a configuração de
schememencionados em Configurar uma instância do Prometheus para coletar métricas TLS.NotaOs CRs relacionados ao Prometheus fornecidos neste tópico servem apenas para fins de demonstração. Ajuste-os conforme seu ambiente de produção.
iVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: productpage labels: app: productpage team: bookinfo spec: selector: matchLabels: app: productpage endpoints: - port: http-9080 interval: 30s path: /metrics scheme: https tlsConfig: caFile: /etc/prom-certs/root-cert.pem certFile: /etc/prom-certs/cert-chain.pem keyFile: /etc/prom-certs/key.pem insecureSkipVerify: true -
Aplique o arquivo service-monitor.yaml no cluster executando o comando a seguir.
kubectl apply -f service-monitor.yaml
Etapa 4: Acessar a UI do Prometheus e verificar métricas
-
Configure o encaminhamento de porta da sua porta local 9090 para a porta 9090 do serviço
prometheus-operatedexecutando o comando abaixo.kubectl port-forward svc/prometheus-operated 9090 -
Insira
localhost:9090no navegador para abrir a interface web do Prometheus.A interface de consulta do Prometheus será aberta. Insira uma expressão de consulta na caixa de entrada Expression, clique em Execute para executar a consulta e visualize os resultados na aba Table ou Graph.
-
Na barra de menu superior, selecione para visualizar o status do alvo de monitoramento.
NotaSe um alvo for coletado via TLS, ele pode inicialmente apresentar o status "Unavailable". Isso ocorre caso o TLS esteja configurado, mas as definições de autenticação estejam incorretas.
Confirme se o State do alvo está como Up, o que indica que as métricas estão sendo coletadas com sucesso.
-
Na barra de menu superior, clique em Graph, insira
python_gc_objects_collected_totalna caixa de texto de consulta e clique em Execute à direita.Após a conclusão da consulta, os dados da métrica reportada serão exibidos.
Os resultados aparecem na visualização Table, agrupados pela tag
generationem três registros (gerações 0, 1 e 2). Esses registros correspondem ao número total de objetos coletados por cada uma das três gerações de coleta de lixo (GC) do Python.