Compartir vía


Configuración de métricas personalizadas para actualizaciones graduales en virtual Machine Scale Sets (versión preliminar)

Nota:

Las métricas personalizadas para las actualizaciones graduales en Virtual Machine Scale Sets se encuentran actualmente en versión preliminar. Las versiones preliminares están a su disposición con la condición de que acepte los términos de uso adicionales. Es posible que algunos de los aspectos de estas características cambien antes que se ofrezca la disponibilidad general.

Las métricas personalizadas para las actualizaciones graduales le permiten usar la extensión de estado de la aplicación para emitir métricas personalizadas al conjunto de escalado de máquinas virtuales. Estas métricas personalizadas se pueden usar para indicar al conjunto de escalado el orden en el que se deben actualizar las máquinas virtuales cuando se desencadena una actualización gradual. Las métricas personalizadas también pueden informar al conjunto de escalado cuando se debe omitir una actualización en una instancia específica. Esto le permite tener más control sobre el orden y el propio proceso de actualización.

Las métricas personalizadas se pueden usar en combinación con otras funcionalidades de actualización gradual, como actualizaciones automáticas del sistema operativo, actualizaciones automáticas de extensiones y actualizaciones graduales de MaxSurge.

Requisitos

  • Al usar métricas personalizadas para realizar actualizaciones graduales en conjuntos de escalado de máquinas virtuales, el conjunto de escalado también debe usar la extensión de mantenimiento de la aplicación con estados de mantenimiento enriquecidos para notificar la ordenación de fases o omitir la información de actualización. Las actualizaciones de métricas personalizadas no se admiten al usar la extensión de estado de la aplicación con estados binarios.
  • La extensión de estado de la aplicación debe configurarse para usar HTTP o HTTPS para recibir la información de métricas personalizadas. TCP no se admite para la integración con métricas personalizadas para actualizaciones graduales.

Conceptos

Ordenación de fases

Una fase es una construcción de agrupación para máquinas virtuales. Cada fase se determina estableciendo metadatos emitidos desde la extensión de mantenimiento de la aplicación a través de la propiedad customMetrics. El conjunto de escalado de máquinas virtuales toma la información recuperada de las métricas personalizadas y la usa para colocar máquinas virtuales en sus fases asignadas. Dentro de cada fase, el conjunto de escalado de máquinas virtuales también asignará lotes de actualización. Cada lote se configura mediante la directiva de actualización gradual que tiene en cuenta los dominios de actualización (UD), los dominios de error (FD) y la información de zona de cada máquina virtual.

Cuando se inicia una actualización gradual, las máquinas virtuales se colocan en sus fases designadas. Las actualizaciones por fases se realizan en orden numérico de secuencia. Las máquinas virtuales de todos los lotes de una fase se completarán antes de pasar a la siguiente fase. Si no se recibe ningún orden de fase para una máquina virtual, el conjunto de escalado lo colocará en la última fase

Conjunto de escalado regionalDiagrama que muestra un diagrama de alto nivel de lo que sucede al usar actualizaciones de n fases en un conjunto de escalado regional.

Conjunto de escalado zonalDiagrama que muestra un diagrama de alto nivel de lo que sucede cuando se usan actualizaciones en n fases en un conjunto de escalado zonal.

Para especificar el número de fase con el que debe asociarse la máquina virtual, use el parámetro phaseOrderingNumber.

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

Omitir actualización

Omitir la funcionalidad de actualización permite omitir una instancia individual de una actualización durante la actualización gradual. Esto es similar al uso de la protección de instancias, pero puede integrarse sin problemas en el flujo de trabajo de actualización gradual y en las aplicaciones de nivel de instancia. De forma similar a la ordenación por fases, la información de omisión de la actualización se pasa al conjunto de escalado de máquinas virtuales a través de la extensión de mantenimiento de la aplicación y la configuración de métricas personalizadas. Cuando se desencadena la actualización gradual, el conjunto de escalado de máquinas virtuales comprueba la respuesta de las métricas personalizadas de extensiones de mantenimiento de la aplicación y, si se establece la actualización omitida en true, la instancia no se incluye en la actualización gradual.

Diagrama que muestra un diagrama de alto nivel de lo que sucede al usar omitir la actualización en un conjunto de escalado zonal.

Para omitir una actualización en una máquina virtual, use el parámetro SkipUpgrade. Esto indica a la actualización gradual que omita esta máquina virtual al realizar las actualizaciones.

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

Omitir el orden de actualización y fase también se puede usar conjuntamente:

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

Configuración de la extensión de estado de la aplicación

La extensión de estado de la aplicación requiere una solicitud HTTP o HTTPS con una ruta de acceso de solicitud o puerto asociada. Los sondeos TCP se admiten al usar la extensión de estado de la aplicación, pero no se puede establecer el ApplicationHealthState a través del cuerpo de la respuesta del sondeo y no se pueden usar con actualizaciones graduales con 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
          }
        }
      }
    ]
  }
}
Nombre Valor / ejemplo Tipo de datos
protocol http o https string
port Opcional cuando el protocolo es http o https int
requestPath Obligatorio al usar http o https string
intervalInSeconds Opcional, el valor predeterminado es 5 segundos. Este valor es el intervalo entre cada sondeo de estado. Por ejemplo, si intervalInSeconds == 5, se enviará un sondeo al punto de conexión de la aplicación local una vez cada 5 segundos. int
numberOfProbes Opcional, el valor predeterminado es 1. Este valor es el número de sondeos consecutivos necesarios para que cambie el estado de mantenimiento. Por ejemplo, si numberOfProbles == 3, necesitará 3 señales "Healthy" consecutivas para cambiar el estado de mantenimiento de "Unhealthy"/"Unknown" a "Healthy". Se aplica el mismo requisito para cambiar el estado de mantenimiento al estado "Unhealthy" o "Unknown". int
gracePeriod Opcional, el valor predeterminado = intervalInSeconds * numberOfProbes; el período de gracia máximo es de 7200 segundos int

Instalación de la extensión de estado de la aplicación

Use el conjunto de extensiones az vmss para agregar la extensión Estado de la aplicación a la definición del modelo del conjunto de escalado.

Cree un archivo JSON llamado extensions.json con la configuración deseada.

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

Aplique la extensión de estado de la aplicación.

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

Actualice las máquinas virtuales del conjunto de escalado. Este paso solo es necesario si el conjunto de escalado usa una directiva de actualización manual. Para obtener más información sobre las directivas de actualización, consulte Directivas de actualización de Virtual Machine Scale Sets

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

Configuración de la respuesta de la extensión de mantenimiento de la aplicación

La configuración de la respuesta de métricas personalizadas se puede lograr de muchas maneras diferentes. Se puede integrar en las aplicaciones existentes, actualizarse dinámicamente y usarse junto con varias funciones para proporcionar una salida basada en una situación específica.

Ejemplo 1: Orden de fase

Esta aplicación de ejemplo se puede instalar en una máquina virtual de un conjunto de escalado al que se va a emitir la fase.

#!/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

Ejemplo 2: Omitir actualización

Esta aplicación de ejemplo se puede instalar en una máquina virtual de un conjunto de escalado para emitir que se debe omitir la instancia de la próxima actualización gradual.

#!/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

Ejemplo 3: Orden de fase combinado y omisión de la actualización

Esta aplicación de ejemplo incluye el orden de fase y omitir los parámetros de actualización en la respuesta 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 obtener más ejemplos de configuración de respuesta, consulte ejemplos de estado de la aplicación

Pasos siguientes

Aprenda a realizar actualizaciones manuales en Virtual Machine Scale Sets.