Configurar métricas personalizadas para atualizações contínuas em conjuntos de dimensionamento de máquina virtual

As métricas personalizadas para atualizações faseadas permitem-lhe utilizar a extensão de estado de funcionamento da aplicação para emitir métricas personalizadas para o seu Conjunto de Dimensionamento de Máquinas Virtuais. Essas métricas personalizadas podem ser usadas para informar ao conjunto de escalas a ordem na qual as máquinas virtuais devem ser atualizadas quando uma atualização contínua é acionada. As métricas personalizadas também podem indicar ao conjunto de dimensionamento que uma atualização deve ser ignorada numa instância específica. Isso permite que você tenha mais controle sobre o pedido e o processo de atualização em si.

As métricas personalizadas podem ser usadas em combinação com outras funcionalidades de atualização contínua, como atualizações automáticas do sistema operacional, atualizações automáticas de extensão e atualizações contínuas do MaxSurge.

Requisitos

  • Ao usar métricas personalizadas para atualizações contínuas em Conjuntos de Escala de Máquina Virtual, o conjunto de dimensionamento também deve usar a extensão de integridade do aplicativo com estados de integridade avançados para relatar a ordem de fases ou ignorar informações de atualização. Não há suporte para atualizações de métricas personalizadas ao usar a extensão de integridade do aplicativo com estados binários.
  • A extensão de saúde da aplicação deve ser configurada para usar HTTP ou HTTPS para receber a informação personalizada das métricas. O TCP não é suportado para integração com métricas personalizadas para atualizações contínuas.

Conceitos

Ordenação de fases

Uma fase é uma estrutura de agrupamento para máquinas virtuais. Cada fase é determinada ao definir os metadados emitidos pela extensão de estado de funcionamento da aplicação através da propriedade customMetrics. O Conjunto de Dimensionamento de Máquinas Virtuais obtém as informações recolhidas das métricas personalizadas e utiliza-as para colocar as máquinas virtuais nas fases que lhes foram atribuídas. Dentro de cada fase, o conjunto de dimensionamento de máquinas virtuais também atribui lotes de atualização. Cada lote é configurado usando a política de atualização contínua, que leva em consideração os domínios de atualização (UD), domínios de falha (FD) e informações de zona de cada máquina virtual.

Quando uma atualização sem interrupção é iniciada, as máquinas virtuais são colocadas em suas fases designadas. As atualizações faseadas são realizadas em ordem de sequência numérica. As máquinas virtuais de todos os lotes de uma fase terão de estar concluídas antes de avançar para a fase seguinte. Se nenhuma ordem de fase for recebida para uma máquina virtual, o conjunto de escala a colocará na última fase

Conjunto de escalas regional (não zonal)Diagrama que ilustra de forma abrangente o que acontece ao utilizar atualizações por fases n num conjunto de escalas regional (não zonal).

Conjunto de escalas que abrange zonasDiagrama que apresenta uma visão de alto nível do que ocorre ao usar atualizações de n fases num conjunto de escalas que abrange zonas.

Para especificar o número de fase ao qual a máquina virtual deve ser associada, use phaseOrderingNumber o parâmetro.

{
     “applicationHealthState”: “Healthy”,
      “customMetrics”: "{ \"rollingUpgrade\": { \"PhaseOrderingNumber\": 0 } }"
}

Ignorar atualização

A funcionalidade de ignorar a atualização permite que uma instância individual seja omitida durante uma atualização faseada. Isso é semelhante à utilização da proteção de instância, mas pode se integrar mais facilmente ao fluxo de trabalho de atualização contínua e aos aplicativos no nível da instância. À semelhança da ordenação de fases, as informações sobre ignorar a atualização são transmitidas ao Conjunto de Dimensionamento de Máquinas Virtuais através da extensão de estado de funcionamento da aplicação e das definições de métricas personalizadas. Quando a atualização faseada é desencadeada, o Conjunto de Dimensionamento de Máquinas Virtuais verifica a resposta das métricas personalizadas das extensões de estado de funcionamento da aplicação e, se a opção para ignorar a atualização estiver definida como true, a instância não é incluída na atualização faseada.

Diagrama de alto nível que ilustra o que acontece ao utilizar o skip upgrade num conjunto de escalas que abrange zonas.

Para ignorar uma atualização numa máquina virtual, use o parâmetro SkipUpgrade. Isto indica à atualização contínua para ignorar esta máquina virtual durante as atualizações.

{
     “applicationHealthState”: “Healthy”,
      “customMetrics”: "{ \"rollingUpgrade\": { \"SkipUpgrade\": true} }"
}

Ignorar atualização e ordem das fases podem também ser usados em conjunto:

{
     “applicationHealthState”: “Healthy”,
      “customMetrics”: "{ \"rollingUpgrade\": { \"SkipUpgrade\": false, \"PhaseOrderingNumber\": 0 } }"
}

Configurar a extensão de integridade do aplicativo

A extensão de estado de funcionamento da aplicação requer um pedido HTTP ou HTTPS com uma porta ou um caminho de pedido associado. As sondas TCP são suportadas ao utilizar a extensão de estado de funcionamento da aplicação, mas não é possível definir o ApplicationHealthState através do corpo da resposta da sonda e não podem ser utilizadas com atualizações faseadas com métricas personalizadas.

{
  "extensionProfile" : {
     "extensions" : [
      {
        "name": "HealthExtension",
        "properties": {
          "publisher": "Microsoft.ManagedServices",
          "type": "<ApplicationHealthLinux or ApplicationHealthWindows>",
          "autoUpgradeMinorVersion": true,
          "typeHandlerVersion": "2.0",
          "settings": {
            "protocol": "<protocol>",
            "port": <port>,
            "requestPath": "</requestPath>",
            "intervalInSeconds": 5,
            "numberOfProbes": 1
          }
        }
      }
    ]
  }
}
Nome Valor / Exemplo Tipo de Dados
protocolo http ou https cadeia (de caracteres)
porta Opcional quando o protocolo é http ou https int
caminho de solicitação Obrigatório durante a utilização http ou https cadeia (de caracteres)
intervaloEmSegundos Opcional, o padrão é 5 segundos. Esta configuração corresponde ao intervalo entre cada sondagem de estado de funcionamento. Por exemplo, se intervalInSeconds == 5, uma sonda é enviada para o ponto de extremidade do aplicativo local uma vez a cada 5 segundos. int
numeroDeSondas Opcional, o padrão é 1. Esta definição corresponde ao número de sondagens consecutivas necessárias para que o estado de saúde mude. Por exemplo, se numberOfProbles == 3, são necessários 3 sinais consecutivos de "Em bom estado" para alterar o estado de funcionamento de "Não saudável"/"Desconhecido" para "Em bom estado". O mesmo requisito também se aplica à alteração do estado de saúde para o estado "Não saudável" ou "Desconhecido". int
período de graça Opcional, padrão = intervalInSeconds * numberOfProbes; período de carência máximo é de 7200 segundos int

Instalar a extensão de integridade do aplicativo

Use az vmss extension set para adicionar a extensão de integridade do aplicativo à definição do modelo do conjunto de escala.

Crie um arquivo json chamado extensions.json com as configurações desejadas.

{
  "protocol": "<protocol>",
  "port": <port>,
  "requestPath": "</requestPath>",
  "gracePeriod": <healthExtensionGracePeriod>
}

Aplique a extensão de saúde da aplicação.

az vmss extension set \
  --name ApplicationHealthLinux \
  --publisher Microsoft.ManagedServices \
  --version 2.0 \
  --resource-group myResourceGroup \
  --vmss-name myScaleSet \
  --settings ./extension.json

Atualize as máquinas virtuais no conjunto de escala. Esta etapa só é necessária se o conjunto de dimensionamento estiver usando uma política de atualização manual. Para obter mais informações sobre políticas de atualização, consulte Políticas de atualização para conjuntos de dimensionamento de máquina virtual

az vmss update-instances \
  --resource-group myResourceGroup \
  --name myScaleSet \
  --instance-ids "*"

Configurar a resposta da extensão de integridade do aplicativo

A configuração da resposta de métricas personalizadas pode ser realizada de muitas maneiras diferentes. Ele pode ser integrado em aplicações existentes, atualizado dinamicamente e ser usado ao lado de várias funções para fornecer uma saída com base em uma situação específica.

Esses aplicativos de exemplo incluem ordem de fase e ignoram parâmetros de atualização na resposta de métricas personalizadas.

#!/bin/bash

# Open firewall port (replace with your firewall rules as needed)
sudo iptables -A INPUT -p tcp --dport 8000 -j ACCEPT

# Create Python HTTP server for responding with JSON
cat <<EOF > server.py
import json
from http.server import BaseHTTPRequestHandler, HTTPServer

# Function to generate the JSON response
def generate_response_json():
    return json.dumps({
        "ApplicationHealthState": "Healthy",
        "CustomMetrics": json.dumps({
            "RollingUpgrade": {
                "PhaseOrderingNumber": 1,
                "SkipUpgrade": "false"
            }
        })
    })

class RequestHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        # Respond with HTTP 200 and JSON content
        self.send_response(200)
        self.send_header('Content-type', 'application/json')
        self.end_headers()
        response = generate_response_json()
        self.wfile.write(response.encode('utf-8'))

# Set up the HTTP server
def run(server_class=HTTPServer, handler_class=RequestHandler):
    server_address = ('localhost', 8000)
    httpd = server_class(server_address, handler_class)
    print('Starting server on port 8000...')
    httpd.serve_forever()

if __name__ == "__main__":
    run()
EOF

# Run the server in the background
python3 server.py &

# Store the process ID of the server
SERVER_PID=$!

# Wait a few seconds to ensure the server starts
sleep 2

# Confirm execution
echo "Server has been started on port 8000 with PID $SERVER_PID"

Para obter mais exemplos de configuração de resposta, consulte Exemplos de integridade do aplicativo

Verificar e consultar dados de métricas personalizadas

Depois de configurar a extensão de saúde da aplicação para devolver métricas personalizadas, pode verificar se as métricas personalizadas estão a ser reportadas corretamente e consultar os dados das suas instâncias do Conjunto de Escala da Máquina Virtual.

Observação

O método para consultar métricas personalizadas difere entre os modos de orquestração Uniforme e Flexível. O modo uniforme usa az vmss get-instance-view, enquanto o modo flexível requer consultar VMs individuais usando az vm get-instance-view.

Para Modo de Orquestração Uniforme

az vmss get-instance-view \
  --resource-group <resource-group-name> \
  --name <vmss-name> \
  --instance-id <instance-id>

Exemplo de saída (excerto):

{
  "extensions": [
    {
      "name": "ApplicationHealthExtension",
      "substatuses": [
        {
          "code": "ComponentStatus/CustomMetrics/succeeded",
          "message": "{\"rollingUpgrade\": {\"PhaseOrderingNumber\": 2, \"SkipUpgrade\": false}}"
        }
      ]
    }
  ]
}

As métricas personalizadas estão no campo message do subestado ComponentStatus/CustomMetrics/succeeded.

Para Modo de Orquestração Flexível

No modo de orquestração flexível, as instâncias são VMs individuais. Use o az vm get-instance-view comando e especifique o nome da VM.

Obtenha métricas personalizadas para uma VM específica:

az vm get-instance-view \
  --resource-group <resource-group-name> \
  --name <vm-name>

Exemplo de saída (excerto):

{
  "extensions": [
    {
      "name": "ApplicationHealthExtension",
      "substatuses": [
        {
          "code": "ComponentStatus/CustomMetrics/succeeded",
          "message": "{\"rollingUpgrade\": {\"PhaseOrderingNumber\": 1, \"SkipUpgrade\": false}}"
        }
      ]
    }
  ]
}

As métricas personalizadas estão no campo message do subestado ComponentStatus/CustomMetrics/succeeded.

Resolução de problemas de métricas personalizadas

Se as métricas personalizadas não estiverem a ser reportadas corretamente, verifique o seguinte:

  1. Verifique o estado da Extensão de Saúde da Aplicação:
az vmss get-instance-view \
  --resource-group <resource-group-name> \
  --name <vmss-name> \
  --instance-id <instance-id> \
  --query "extensions[?name=='ApplicationHealthExtension'].statuses"
  1. Verifique se o endpoint de verificação de estado está a responder:
# Get the public IP of an instance
PUBLIC_IP=$(az vmss list-instance-public-ips \
  --resource-group <resource-group-name> \
  --name <vmss-name> \
  --query "[0].ipAddress" \
  --output tsv)

# Test the health endpoint
curl -v http://$PUBLIC_IP:<port>/<request-path>
  1. Verifique se o formato da resposta está correto:

O endpoint de saúde da aplicação deve devolver uma resposta JSON neste formato exato:

{
  "ApplicationHealthState": "Healthy",
  "customMetrics": "{\"rollingUpgrade\": {\"PhaseOrderingNumber\": 0, \"SkipUpgrade\": false}}"
}

Importante

  • O customMetrics valor deve ser uma string JSON (duplamente serializada), não um objeto JSON
  • A ApplicationHealthState instância deve estar definida como "Saudável" para que a instância seja incluída na atualização contínua
  • As métricas personalizadas só são lidas no início de uma atualização contínua; As alterações durante uma atualização não afetam a atualização atual

Próximos passos

Saiba como efetuar atualizações manuais em Conjuntos de Dimensionamento de Máquinas Virtuais.