Partilhar via


Configurar métricas personalizadas para atualizações contínuas em Conjuntos de Dimensionamento de Máquina Virtual (Visualização)

Nota

As métricas personalizadas para atualizações contínuas em Conjuntos de Dimensionamento de Máquina Virtual estão atualmente em visualização. As pré-visualizações são disponibilizadas a si na condição de concordar com os termos suplementares de utilização. Alguns aspetos desses recursos podem mudar antes da disponibilidade geral (GA).

As métricas personalizadas para atualizações contínuas permitem que você utilize a extensão de integridade do aplicativo para emitir métricas personalizadas para seu Conjunto de Dimensionamento de Máquina Virtual. 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 informar seu conjunto de escalas quando uma atualização deve ser ignorada em uma 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 integridade do aplicativo deve ser configurada para usar HTTP ou HTTPS para receber as informações de métricas personalizadas. 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 construção de agrupamento para máquinas virtuais. Cada fase é determinada pela definição de metadados emitidos pela extensão de integridade do aplicativo por meio da customMetrics propriedade. O Conjunto de Dimensionamento de Máquina Virtual pega as informações recuperadas das métricas personalizadas e as usa para colocar máquinas virtuais em suas fases atribuídas. Dentro de cada fase, o conjunto de Escala de Máquina Virtual também atribuirá 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 em todos os lotes dentro de uma fase serão concluídas antes de passar para a próxima fase. Se nenhuma ordem de fase for recebida para uma máquina virtual, o conjunto de escala a colocará na última fase

Conjunto de escalas regionaisDiagrama que mostra um diagrama de alto nível do que acontece ao usar atualizações de n-fases em um conjunto de escala regional.

Conjunto de escalas zonaisDiagrama que mostra um diagrama de alto nível do que acontece ao usar atualizações de n-fases em um conjunto de escala zonal.

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 } }"
}

Pular atualização

A funcionalidade Ignorar atualização permite que uma instância individual seja omitida de uma atualização durante a atualização contínua. 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. Semelhante à ordem de fase, as informações de atualização de pulo são passadas para o Conjunto de Escala de Máquina Virtual por meio da extensão de integridade do aplicativo e das configurações de métricas personalizadas. Quando a atualização sem interrupção é acionada, o Conjunto de Dimensionamento de Máquina Virtual verifica a resposta das métricas personalizadas das extensões de integridade do aplicativo e, se ignorar atualização estiver definido como true, a instância não será incluída na atualização contínua.

Diagrama que mostra um diagrama de alto nível do que acontece ao usar ignorar atualização em um conjunto de escala zonal.

Para ignorar uma atualização em uma máquina virtual, use SkipUpgrade o parâmetro. Isso informa a atualização sem interrupção para ignorar essa máquina virtual ao executar as atualizações.

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

Pular atualização e ordem de fase também podem ser usados juntos:

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

Configurar a extensão de integridade do aplicativo

A extensão de integridade do aplicativo requer uma solicitação HTTP ou HTTPS com uma porta ou caminho de solicitação associado. Os testes TCP são suportados ao usar a extensão de integridade do aplicativo, mas não podem definir o ApplicationHealthState corpo da resposta do teste e não podem ser usados com atualizações contínuas com métricas personalizadas.

{
  "extensionProfile" : {
     "extensions" : [
      {
        "name": "HealthExtension",
        "properties": {
          "publisher": "Microsoft.ManagedServices",
          "type": "<ApplicationHealthLinux or ApplicationHealthWindows>",
          "autoUpgradeMinorVersion": true,
          "typeHandlerVersion": "1.0",
          "settings": {
            "protocol": "<protocol>",
            "port": <port>,
            "requestPath": "</requestPath>",
            "intervalInSeconds": 5,
            "numberOfProbes": 1
          }
        }
      }
    ]
  }
}
Nome Valor / Exemplo Tipo de Dados
protocolo http ou https string
porta Opcional quando o protocolo é http ou https número inteiro
requestPath Obrigatório durante a utilização http ou https string
intervalInSeconds Opcional, o padrão é 5 segundos. Essa configuração é o intervalo entre cada sonda de integridade. Por exemplo, se intervalInSeconds == 5, uma sonda é enviada para o ponto de extremidade do aplicativo local uma vez a cada 5 segundos. número inteiro
númerodesondas Opcional, o padrão é 1. Essa configuração é o número de testes consecutivos necessários para que o status de integridade seja alterado. Por exemplo, se numberOfProbles == 3, você precisa de 3 sinais consecutivos de "Saudável" para alterar o status de saúde de "Não íntegro"/"Desconhecido" para o estado "Saudável". O mesmo requisito se aplica para alterar o status de saúde para o estado "Não íntegro" ou "Desconhecido". número inteiro
gracePeriod Opcional, padrão = intervalInSeconds * numberOfProbes; período de carência máximo é de 7200 segundos número inteiro

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 integridade do aplicativo.

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.

Exemplo 1: Ordem de fase

Este aplicativo de exemplo pode ser instalado em uma máquina virtual em uma escala definida para emitir a fase a que pertence.

#!/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": {
            "RollingUpgrade": {
                "PhaseOrderingNumber": 0
            }
        }
    })

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
python3 server.py

Exemplo 2: Ignorar atualização

Este aplicativo de exemplo pode ser instalado em uma máquina virtual em uma escala definida para emitir que a instância deve ser omitida da próxima atualização contínua.

#!/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": {
            "RollingUpgrade": {
                "SkipUpgrade": "true"
            }
        }
    })

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
python3 server.py

Exemplo 3: Ordem de fase combinada e ignorar atualização

Este aplicativo de exemplo inclui ordem de fase e ignorar 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": {
            "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
python3 server.py

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

Próximos passos

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