Configurar métricas personalizadas para atualizações sem interrupção em Conjuntos de Dimensionamento de Máquinas Virtuais (versão prévia)
Observação
As métricas personalizadas para atualizações sem interrupção em Conjuntos de Dimensionamento de Máquinas Virtuais estão atualmente em versão prévia. As versões prévias são disponibilizadas com a condição de que você concorde com os termos de uso complementares. Alguns aspectos desses recursos podem ser alterados antes da disponibilidade geral (GA).
As métricas personalizadas para atualizações sem interrupção permitem que você utilize a oextensão de integridade do aplicativo para emitir métricas personalizadas para o Conjunto de Dimensionamento de Máquinas Virtuais. Essas métricas personalizadas podem ser usadas para informar ao conjunto de dimensionamento a ordem na qual as máquinas virtuais devem ser atualizadas quando uma atualização sem interrupção é disparada. As métricas personalizadas também podem informar seu conjunto de dimensionamento quando uma atualização deve ser ignorada em uma instância específica. Isso permite que você tenha mais controle sobre a ordenação e o processo de atualização em si.
As métricas personalizadas podem ser usadas em combinação com outras funcionalidades de atualização sem interrupção, como atualizações automáticasdo sistema operacional, atualizações automáticas de extensão e atualizações sem interrupçãodo MaxSurge.
Requisitos
- Ao usar métricas personalizadas para atualizações sem interrupção em Conjuntos de Dimensionamento de Máquinas Virtuais, o conjunto de dimensionamento também deve usar a extensão de integridade do aplicativo com estados avançados de integridade para relatar a ordenação 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. Não há suporte para TCP para integração com métricas personalizadas para atualizações sem interrupção.
Conceitos
Ordenação de fases
Uma fase é um constructo de agrupamento para máquinas virtuais. Cada fase é determinada definindo metadados emitidos da extensão de integridade do aplicativo por meio da customMetrics
propriedade. O Conjunto de Dimensionamento de Máquinas Virtuais usa as informações recuperadas das métricas personalizadas e as usa para colocar máquinas virtuais em suas fases atribuídas. Em cada fase, o conjunto de Dimensionamento de Máquinas Virtuais também atribuirá lotes de atualização. Cada lote é configurado usando a política de atualização sem interrupção que leva em consideração os domínios de atualização (UD), FD (domínios de falha) 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 em fases são executadas na ordem de sequência numérica. As Máquinas Virtuais em todos os lotes em uma fase serão concluídas antes de passar para a próxima fase. Se nenhuma ordenação de fase for recebida para uma máquina virtual, o conjunto de dimensionamento a colocará na última fase
Conjunto de dimensionamento regional
Conjunto de dimensionamento zonal
Para especificar o número de fase ao qual a máquina virtual deve ser associada, useo parâmetro. phaseOrderingNumber
{
“applicationHealthState”: “Healthy”,
“customMetrics”: "{ \"rollingUpgrade\": { \"PhaseOrderingNumber\": 0 } }"
}
Ignorar atualização
Ignorar a funcionalidade de atualização permite que uma instância individual seja omitida de uma atualização durante a atualização sem interrupção. Isso é semelhante à utilização da proteção de instância, mas pode se integrar mais diretamente ao fluxo de trabalho de atualização sem interrupção e aos aplicativos no nível da instância. Semelhante à ordenação de fases, as informações de atualização de ignorar são passadas para o Conjunto de Dimensionamento de Máquinas Virtuais por meio da extensão de integridade do aplicativo e das configurações de métricas personalizadas. Quando a atualização sem interrupção é disparada, o Conjunto de Dimensionamento de Máquinas Virtuais verifica a resposta das métricas personalizadas de extensões de integridade do aplicativo e, se a atualização de ignorar for definida como true, a instância não será incluída na atualização sem interrupção.
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} }"
}
Ignorar a atualização e a ordem de fase também podem ser usadas em conjunto:
{
“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. As investigações TCP têm suporte ao usar a extensão de integridade do aplicativo, mas não podem definir o ApplicationHealthState
corpo da resposta da investigação e não podem ser usadas com atualizações sem interrupção 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 |
int |
requestPath | Obrigatório ao usar http ou https |
string |
intervalInSeconds | Opcional, o padrão é 5 segundos. Essa configuração é o intervalo entre cada investigação de integridade. Por exemplo, se intervalInSeconds == 5, uma investigação será enviada para o ponto de extremidade do aplicativo local uma vez a cada 5 segundos. | int |
numberOfProbes | Opcional, o padrão é 1. Essa configuração é o número de investigações consecutivas necessárias para que o status de integridade seja alterado. Por exemplo, se numberOfProbles == 3, você precisará de três sinais "Íntegros" consecutivos para alterar o status de integridade de "Não Íntegro"/"Desconhecido" para o estado "Íntegro". O mesmo requisito se aplica à alteração do status de integridade no estado "Não Íntegro" ou "Desconhecido". | INT |
gracePeriod | Opcional, padrão = intervalInSeconds * numberOfProbes ; o período máximo de carência é de 7.200 segundos |
int |
Implantar a Extensão de Integridade do Aplicativo
Use az vmss extension set para adicionar a extensão do Application Health a definição do modelo de conjunto de dimensionamento.
Crie um arquivo json chamado extensions.json
com as configurações desejadas.
{
"protocol": "<protocol>",
"port": <port>,
"requestPath": "</requestPath>",
"gracePeriod": <healthExtensionGracePeriod>
}
Implantar 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 dimensionamento. Essa etapa só será necessária se o conjunto de dimensionamento estiver usando uma política de atualização manual. Para obter mais informações sobre as políticas de atualização, consulte Políticas de atualização para Conjuntos de Dimensionamento de Máquinas Virtuais.
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 várias maneiras diferentes. Ele pode ser integrado a aplicativos existentes, atualizado dinamicamente e ser usado junto com 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 um conjunto de dimensionamento ao qual a fase 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 um conjunto de dimensionamento para emitir que a instância deve ser omitida da atualização em andamento futura.
#!/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 para a 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óximas etapas
Saiba como realizar atualizações manuais em Conjuntos de Dimensionamento de Máquinas Virtuais.