Definición de estrategias de actualización reutilizables mediante Fleet Manager de Azure Kubernetes

Se aplica a: ✔️ Administrador de flota ✔️ Administrador de flota con clúster de concentrador

Los administradores pueden controlar la secuencia de actualizaciones de los clústeres administrados por Flota mediante la definición de una serie de fases y grupos. Pueden configurar cuándo deben producirse aprobaciones y pausas dentro de esas fases y grupos. Toda la configuración se puede guardar como una estrategia de actualización que se puede administrar independientemente de las ejecuciones de actualizaciones o las actualizaciones automáticas, lo que permite reutilizar las estrategias según sea necesario.

En este artículo se explica cómo definir estrategias de actualización mediante grupos y fases.

Diagrama que muestra una estrategia de actualización de ejemplo que contiene dos fases de actualización. Cada fase de actualización contiene dos grupos de actualizaciones. Cada grupo de actualizaciones contiene dos clústeres de miembros.

Requisitos previos

  • Lea la Introducción conceptual de las actualizaciones de Flota, que proporciona una explicación de las ejecuciones de actualizaciones, las fases, los grupos y las estrategias a las que se hace referencia en esta guía.

  • Debe tener un recurso Fleet con uno o varios clústeres miembro. Si no es así, siga el inicio rápido para crear un recurso Fleet y combinar clústeres de Azure Kubernetes Service (AKS) como miembros.

  • Establezca estas variables de entorno:

    export GROUP=<resource-group>
    export FLEET=<fleet-name>
    export CLUSTERID=<aks-cluster-resource-id>
    export STRATEGY=<strategy-name>
    
  • Si sigue las instrucciones de CLI de Azure de este artículo, instale la versión más reciente del CLI de Azure. Para la instalación o la actualización, consulte Instalación de la CLI de Azure.

  • También necesitas la fleet extensión de CLI de Azure. Para instalarlo, ejecute el siguiente comando:

    az extension add --name fleet
    

    Ejecute el comando az extension update para actualizar a la versión más reciente de la extensión publicada:

    az extension update --name fleet
    
  • Instale y configure Terraform.

  • Instale la versión más reciente de la CLI de Azure. Para la instalación o la actualización, consulte Instalación de la CLI de Azure. Use el CLI de Azure para comprobar la estrategia de actualización que crea Terraform.

  • También necesitas la fleet extensión de CLI de Azure. Para instalarlo, ejecute el siguiente comando:

    az extension add --name fleet
    

    Ejecute el az extension update comando para actualizar a la versión más reciente de la extensión.

    az extension update --name fleet
    
  • El ejemplo de Terraform usado en este artículo crea su propio grupo de recursos y un Azure Kubernetes Fleet Manager sin un clúster de concentrador. No se une a ningún clúster de AKS como miembros de Fleet. La estrategia de actualización del ejemplo hace referencia a los nombres de grupo de actualización group-1, group-2 y group-3. Para que la estrategia se aplique a las ejecuciones reales de actualización, asigne los clústeres miembros existentes de Fleet a esos nombres de grupos de actualización, o edite los groupbloques del ejemplo para que coincidan con sus propios nombres de grupos de actualización.

Selección de clústeres para la estrategia

Hay dos maneras de seleccionar qué clústeres se incluyen en cada fase y grupo de la estrategia de actualización para controlar la secuencia de actualizaciones:

  • Etiquetas de miembro (recomendadas): asigne etiquetas a cada miembro de flota y úselas memberSelector para seleccionar miembros por esas etiquetas. Cada miembro puede tener varias etiquetas.
  • Grupos de actualización: asigne un grupo de actualizaciones a cada miembro de flota y, a continuación, defina grupos en la estrategia que coincidan con esos nombres de grupo. Cada miembro solo puede pertenecer a un grupo.

Creación de una estrategia de actualización mediante selectores de miembros (versión preliminar)

Use etiquetas de miembro para seleccionar clústeres en las estrategias de actualización. Proporcionan más flexibilidad. Para obtener detalles conceptuales, consulte Agrupación de clústeres mediante etiquetas de miembro.

Importante

Las características en vista previa de Azure Kubernetes Fleet Manager están disponibles en autoservicio y de manera opcional. Las versiones preliminares se proporcionan "tal cual" y "como están disponibles", y están excluidas de los Acuerdos de nivel de servicio y la garantía limitada. Las versiones preliminares de Azure Kubernetes Fleet Manager reciben cobertura parcial del soporte al cliente en la medida de lo posible. Por lo tanto, estas características no están diseñadas para su uso en producción.

Aplicación de etiquetas en clústeres de miembros

Aplicar etiquetas al agregar un clúster miembro a la flota

Use el az fleet member create comando para aplicar etiquetas a los miembros de la flota. En el ejemplo siguiente se aplican dos etiquetas al clúster miembro: env=staging y tier=frontend:

az fleet member create \
    --resource-group $GROUP \
    --fleet-name $FLEET \
    --name member1 \
    --member-cluster-id $CLUSTERID \
    --labels "env=staging tier=frontend"

Aplicar etiquetas a un miembro de flota existente

Use el az fleet member update comando para aplicar etiquetas a los miembros de la flota.

az fleet member update \
 --resource-group $GROUP \
 --fleet-name $FLEET \
 --name member1 \
 --labels "env=staging tier=frontend"

Creación de una estrategia de actualización

Una estrategia de actualización consta de una o varias fases, donde una fase puede contener uno o varios grupos de actualizaciones.

Nota:

Una experiencia de Azure portal estará disponible antes de la disponibilidad general de esta funcionalidad.

  1. Cree un archivo JSON para definir las fases y grupos de la ejecución de la actualización. Las fases se ejecutan secuencialmente en el orden en que aparecen en el archivo JSON. Los grupos se ejecutan en paralelo dentro de cada fase. El siguiente archivo de ejemplo (example-labels-strategy.json) define una estrategia con dos fases mediante memberSelector para seleccionar clústeres por sus etiquetas e incluye la configuración opcional maxConcurrency :

    • La staging etapa utiliza un memberSelector a nivel de etapa para seleccionar todos los clústeres con la etiqueta env=staging y crear un grupo implícito.
    • La production fase utiliza un memberSelector a nivel de fase para filtrar previamente todos los clústeres con la etiqueta env=production y, a continuación, define dos grupos, cada uno con su propio memberSelector para seleccionar clústeres por la etiqueta tier.

    Cuando se define memberSelector en un grupo, el campo name del grupo solo sirve como identificador visual para los informes de estado y el registro de eventos y ya no se usa para la selección de miembros de la flota según los cambios en el grupo.

    {
        "stages": [
            {
                "name": "staging",
                "memberSelector": { "byLabel": "env=staging" },
                "maxConcurrency": "1",
                "afterStageWaitInSeconds": 600
            },
            {
                "name": "production",
                "memberSelector": { "byLabel": "env=production" },
                "maxConcurrency": "4",
                "groups": [
                    {
                        "name": "frontend",
                        "memberSelector": { "byLabel": "tier=frontend" },
                        "maxConcurrency": "3"
                    },
                    {
                        "name": "backend",
                        "memberSelector": { "byLabel": "tier=backend" },
                        "maxConcurrency": "3"
                    }
                ]
            }
        ]
    }
    

Nota:

El maxConcurrency campo es opcional y controla el número de clústeres que se pueden actualizar simultáneamente en el nivel de fase o grupo. Use un valor mayor para actualizar clústeres más rápido a través de la flota o un valor menor para un lanzamiento más controlado que limite el radio de explosión si surgen problemas.

Cuando una fase aplica un memberSelector sin grupos (como staging), todos los miembros correspondientes forman un único grupo implícito y la simultaneidad se controla directamente a través del parámetro maxConcurrency de la fase. Cuando se definen grupos (como production), el nivel maxConcurrency de fase actúa como un límite máximo general en todos los grupos.

En este ejemplo, la fase staging define el parámetro maxConcurrency como "1", para que los clústeres de preproducción se actualizan uno a uno. La fase production permite hasta "4" clústeres a la vez, con los grupos de frontend y de backend, cada uno con un límite de "3".

Los valores pueden ser un entero fijo (por ejemplo, "3") o un porcentaje (por ejemplo, "50%"). Si se omite, el sistema aplica valores predeterminados. Para más información sobre cómo se resuelven estos valores y sus límites superiores, consulte Simultaneidad máxima (versión preliminar).

  1. Cree una nueva estrategia de actualización con el comando az fleet updatestrategy create con la marca --stages establecida en el nombre del archivo JSON.

    az fleet updatestrategy create \
     --resource-group $GROUP \
     --fleet-name $FLEET \
     --name $STRATEGY \
     --stages example-labels-strategy.json
    

Creación de una estrategia de actualización mediante grupos de actualizaciones

Puede seleccionar clústeres en estrategias de actualización asignandolos a un único grupo de actualizaciones. Defina una estrategia de actualización que asigne estos grupos de actualizaciones a fases. Dentro de una fase de actualización, las actualizaciones se aplican a cada grupo de actualizaciones en paralelo. Dentro de un grupo de actualizaciones, los clústeres miembro se actualizan secuencialmente.

Nota:

Un miembro de flota solo puede formar parte de un grupo de actualizaciones, pero un grupo de actualizaciones puede tener varios miembros de la flota asignados. Un grupo de actualizaciones no es un tipo de recurso independiente. Los grupos de actualización son solo cadenas que representan referencias de los miembros de la flota. Por lo tanto, si todos los miembros de la flota con referencias a un grupo de actualizaciones común se eliminan, ese grupo de actualizaciones específico deja de existir también.

Asignación de clústeres para actualizar grupos

Asigne al grupo al agregar un clúster miembro a la flota

  1. En Azure Portal, vaya al recurso de Azure Kubernetes Fleet Manager.

  2. En el menú del servicio, en Configuración, seleccione Clústeres de miembros>Agregar.

    Recorte de pantalla de la página de Azure Portal para Azure Kubernetes Fleet Manager para agregar clústeres miembros.

  3. Seleccione el clúster que desea agregar y, a continuación, seleccione Siguiente: revisar y agregar.

  4. Escriba el nombre del grupo de actualizaciones al que desea asignar el clúster y, a continuación, seleccione Agregar.

    Recorte de pantalla de la página de Azure Portal para revisión de Azure Kubernetes Fleet Manager y adición de pasos para los clústeres miembros.

Asigne un clúster miembro a un grupo de actualización al agregar el clúster miembro a la flota mediante el comando az fleet member create con el parámetro --update-group establecido en el nombre del grupo de actualización.

az fleet member create \
    --resource-group $GROUP \
    --fleet-name $FLEET \
    --name member1 \
    --member-cluster-id $CLUSTERID \
    --update-group group-1a

Asignar un miembro de flota existente a un grupo de actualizaciones

  1. En Azure Portal, vaya al recurso de Azure Kubernetes Fleet Manager.

  2. En el menú del servicio, en Configuración, seleccione Clústeres de miembros.

  3. Seleccione los clústeres que desea asignar a un grupo de actualización y luego seleccione Asignar grupo de actualización

    Captura de pantalla de la página de Azure Portal para asignar clústeres de miembros existentes a un grupo.

  4. Escriba el nombre del grupo de actualizaciones al que desea asignar el clúster y, a continuación, seleccione Asignar.

    Captura de pantalla de la página de Azure Portal para los clústeres de miembros que muestra el formulario para actualizar el grupo de un clúster miembro.

Asigne un miembro de flota existente a un grupo de actualizaciones mediante el comando az fleet member update con la marca --update-group establecida en el nombre del grupo de actualizaciones.

az fleet member update \
 --resource-group $GROUP \
 --fleet-name $FLEET \
 --name member1 \
 --update-group group-1

Creación de una estrategia de actualización

Una estrategia de actualización consta de una o varias fases, donde una fase puede contener uno o varios grupos de actualizaciones.

  1. En Azure Portal, vaya al recurso de Azure Kubernetes Fleet Manager.

  2. En el menú de servicios, en Configuración, seleccione Actualización de varios clústeres>Estrategias, y a continuación, Crear.

  3. Escriba un nombre para la estrategia.

  4. La primera vez que vea la página, se muestra un diagrama de explicación de la estrategia de actualización que puede ayudar a visualizar cómo funcionan las estrategias.

    Captura de pantalla de Azure Portal en la que se muestra la creación de una estrategia de actualización.

  5. Seleccione Crear fase y escriba:

    • Nombre de la fase: asigne un nombre a la fase; debe ser único en todos los nombres de fase de la estrategia.
    • (Opcional) Aprobaciones de fase: seleccione esta opción si desea esperar una aprobación antes de que se inicie esta fase o después de que se complete. Para obtener más información, consulte Agregar aprobaciones para actualizar grupos y fases.
    • (Opcional) Pausar después de la fase: seleccione esta opción si desea definir una pausa antes de pasar a la siguiente fase.
    • (Opcional) Pausar duración: seleccione una duración predefinida o escriba un valor personalizado en segundos.

    Recorte de pantalla de Azure Portal en la que se muestra la creación de la fase de estrategia de actualización de Azure Kubernetes Fleet Manager.

  6. Asigne uno o varios grupos de actualización a la fase y, a continuación, seleccione Crear.

    Nota:

    El número máximo de grupos de actualizaciones en cada fase de actualización es 50.

    Recorte de pantalla de Azure Portal en la que se muestra la creación de la fase de estrategia de actualización de Azure Kubernetes Fleet Manager, seleccionando grupos de actualizaciones que se van a incluir.

En este escenario, creamos fases y grupos para que coincidan con los detalles usados para el proceso de Azure Portal.

  1. Cree un archivo JSON para definir las fases y grupos de la ejecución de la actualización. Las fases se ejecutan secuencialmente en el orden en que aparecen en el archivo JSON. Los grupos se ejecutan en paralelo dentro de cada fase, por lo que la ordenación no es importante. El siguiente archivo de ejemplo (example-stages.json) define una estrategia con dos fases e incluye maxConcurrency opciones y maxAllowedFailures opciones:

    {
        "stages": [
            {
                "name": "stage-1",
                "maxConcurrency": "7",
                "maxAllowedFailures": "2",
                "groups": [
                    {
                        "name": "group-1",
                        "maxConcurrency": "3",
                        "maxAllowedFailures": "1"
                    },
                    {
                        "name": "group-2",
                        "maxConcurrency": "50%",
                        "maxAllowedFailures": "25%"
                    }
                ],
                "afterStageWaitInSeconds": 300
            },
            {
                "name": "stage-2",
                "maxConcurrency": "100%",
                "maxAllowedFailures": "0",
                "groups": [
                    {
                        "name": "group-3",
                        "maxConcurrency": "2",
                        "maxAllowedFailures": "0"
                    }
                ]
            }
        ]
    }
    

    maxConcurrency

    El maxConcurrency campo es opcional y controla el número de clústeres que se pueden actualizar simultáneamente en el nivel de fase o grupo. Use un valor mayor para actualizar clústeres más rápido a través de la flota o un valor menor para un lanzamiento más controlado que limite el radio de explosión si surgen problemas.

    En este ejemplo, stage-1 asigna maxConcurrency a "7", lo que permite que hasta "7" clústeres en esta etapa se actualicen simultáneamente. Dentro de stage-1, group-1 limita la simultaneidad a los clústeres "3", lo que significa que hasta "3" en este grupo se pueden actualizar simultáneamente. group-2 permite que los "50%" clústeres se actualicen simultáneamente (por ejemplo, si el grupo contiene 4 clústeres, hasta 2 pueden actualizarse al mismo tiempo).

    Los valores pueden ser un entero fijo (por ejemplo, "3") o un porcentaje (por ejemplo, "100%"). Si se omite, el sistema aplica valores predeterminados. Para más información sobre cómo se resuelven estos valores y sus límites superiores, consulte Simultaneidad máxima (versión preliminar).

    maxAllowedFailures

    El campo maxAllowedFailures es opcional y controla cuántos errores en la actualización de clústeres miembros se toleran antes de que el grupo o la fase se marque como fallido. De forma predeterminada (cuando no se establece o "0"), un único error detiene toda la ejecución de la actualización.

    Esta configuración solo evalúa el recuento de errores. No aplica una tasa de éxito mínima. Por lo tanto, un grupo o una fase pueden, por tanto, finalizar en Completed incluso si algunos o todos sus miembros hayan fallado, siempre que no se hubiera superado el umbral de fallos cuando Fleet tomó sus decisiones de planificación.

    En este ejemplo, stage-1 configura maxAllowedFailures en "2", tolerando hasta dos fallos de miembros en toda la fase. Dentro de stage-1, group-1 tolera el fallo de "1" y group-2 tolera el fallo de "25%" de sus miembros (por ejemplo, si el grupo contiene 4 clústeres, se tolera hasta 1 fallo). stage-2 establece maxAllowedFailures a "0", lo que significa que cualquier fallo detiene inmediatamente la ejecución y suele ser útil en fases de producción.

    Para la mayoría de los despliegues, es preferible usar valores porcentuales porque se adaptan mejor a distintos tamaños de grupo. Evite establecer el valor igual al recuento total de miembros, a menos que desee de forma intencionada un comportamiento de "nunca falla" para ese segmento.

    Los valores pueden ser un entero fijo (por ejemplo, "3") o un porcentaje (por ejemplo, "25%"). Para más información sobre cómo se resuelven estos valores, consulte Errores máximos permitidos (versión preliminar).

  2. Cree una nueva estrategia de actualización con el comando az fleet updatestrategy create con la marca --stages establecida en el nombre del archivo JSON.

    az fleet updatestrategy create \
     --resource-group $GROUP \
     --fleet-name $FLEET \
     --name $STRATEGY \
     --stages example-stages.json
    

En el ejemplo de Terraform de esta sección se crea la misma forma de estrategia de dos fases que se muestra en el ejemplo anterior de CLI de Azure: stage-1 contiene group-1 y group-2, que se actualiza en paralelo y van seguidas de una espera de 300 segundos y, a continuaciónstage-2, actualiza group-3. A diferencia del ejemplo JSON de la CLI, el ejemplo no establece maxConcurrency ni maxAllowedFailures en ninguna fase ni grupo, por lo que Fleet aplica sus valores predeterminados. Para añadir estos ajustes, amplíe los bloques stage y main.tf en group con los argumentos azurerm_kubernetes_fleet_update_strategy correspondientes.

Revisión del código de Terraform

Nota:

El código de ejemplo de este artículo se encuentra en el repositorio Azure Terraform GitHub. Vea el archivo de registro que contiene los resultados de las pruebas de las versiones actuales y anteriores de Terraform.

Consulte más artículos y código de ejemplo en el que se muestra cómo usar Terraform para administrar recursos de Azure.

  1. Cree un directorio para probar el código de Terraform de ejemplo y convertirlo en el directorio actual.

  2. Cree un archivo llamado providers.tf e inserte el siguiente código:

    terraform {
      required_version = ">= 1.9.0"
    
      required_providers {
        azurerm = {
          source  = "hashicorp/azurerm"
          version = "~> 4.77"
        }
        random = {
          source  = "hashicorp/random"
          version = "~> 3.0"
        }
      }
    }
    
    provider "azurerm" {
      features {}
    }
    
  3. Cree un archivo llamado variables.tf e inserte el siguiente código:

    variable "location" {
      type        = string
      description = "Azure region where the resource group and Fleet Manager are created."
      default     = "eastus"
    }
    
    variable "resource_group_name" {
      type        = string
      description = "Name of the resource group. If null, a unique name is generated."
      default     = null
    }
    
    variable "fleet_name" {
      type        = string
      description = "Name of the Azure Kubernetes Fleet Manager. If null, a unique name is generated."
      default     = null
    }
    
    variable "update_strategy_name" {
      type        = string
      description = "Name of the Fleet update strategy."
      default     = "example-update-strategy"
    }
    
    variable "tags" {
      type        = map(string)
      description = "Tags to apply to created resources."
      default = {
        environment = "demo"
        managed_by  = "terraform"
      }
    }
    
  4. Cree un archivo llamado main.tf e inserte el siguiente código:

    resource "random_string" "suffix" {
      length  = 6
      lower   = true
      numeric = true
      special = false
      upper   = false
    }
    
    locals {
      resource_group_name = coalesce(var.resource_group_name, "rg-fleet-update-strategy-${random_string.suffix.result}")
      fleet_name          = coalesce(var.fleet_name, "fleet-update-strategy-${random_string.suffix.result}")
    }
    
    resource "azurerm_resource_group" "example" {
      name     = local.resource_group_name
      location = var.location
      tags     = var.tags
    }
    
    resource "azurerm_kubernetes_fleet_manager" "example" {
      name                = local.fleet_name
      location            = azurerm_resource_group.example.location
      resource_group_name = azurerm_resource_group.example.name
      tags                = var.tags
    }
    
    resource "azurerm_kubernetes_fleet_update_strategy" "example" {
      name                        = var.update_strategy_name
      kubernetes_fleet_manager_id = azurerm_kubernetes_fleet_manager.example.id
    
      stage {
        name = "stage-1"
    
        group {
          name = "group-1"
        }
    
        group {
          name = "group-2"
        }
    
        after_stage_wait_in_seconds = 300
      }
    
      stage {
        name = "stage-2"
    
        group {
          name = "group-3"
        }
      }
    }
    
  5. Cree un archivo llamado outputs.tf e inserte el siguiente código:

    output "resource_group_name" {
      description = "Name of the created resource group."
      value       = azurerm_resource_group.example.name
    }
    
    output "fleet_manager_id" {
      description = "Resource ID of the Azure Kubernetes Fleet Manager."
      value       = azurerm_kubernetes_fleet_manager.example.id
    }
    
    output "fleet_manager_name" {
      description = "Name of the Azure Kubernetes Fleet Manager."
      value       = azurerm_kubernetes_fleet_manager.example.name
    }
    
    output "update_strategy_id" {
      description = "Resource ID of the Fleet update strategy."
      value       = azurerm_kubernetes_fleet_update_strategy.example.id
    }
    
  6. Copie el archivo del ejemplo en terraform.tfvars en el mismo directorio y, a continuación, edite los valores de la región de Azure, el nombre del terraform.tfvars.example grupo de recursos, el nombre de flota, el nombre de la estrategia de actualización y las etiquetas que desea usar.

    cp terraform.tfvars.example terraform.tfvars
    

Inicializar, validar y aplicar la configuración

Ejecute terraform init para inicializar la implementación de Terraform. Este comando descarga los proveedores de Azure necesarios para administrar los recursos de Azure.

terraform init

Ejecute terraform fmt para dar formato a los archivos de configuración de forma coherente.

terraform fmt

Ejecute terraform validate para confirmar que los archivos de configuración son sintácticamente válidos.

terraform validate

Ejecute terraform plan para crear un plan de ejecución.

terraform plan -out main.tfplan

Ejecute terraform apply para aplicar el plan de ejecución a su infraestructura en la nube.

terraform apply main.tfplan

Comprobación de la estrategia de actualización

Obtenga el nombre del grupo de recursos y el de Fleet Manager de las salidas de Terraform, y extraiga el nombre de la estrategia de la salida update_strategy_id.

resource_group_name=$(terraform output -raw resource_group_name)
fleet_manager_name=$(terraform output -raw fleet_manager_name)
update_strategy_name=$(terraform output -raw update_strategy_id | awk -F'/' '{print $NF}')

Muestre las fases y grupos de la estrategia mediante el az fleet updatestrategy show comando .

az fleet updatestrategy show \
  --resource-group $resource_group_name \
  --fleet-name $fleet_manager_name \
  --name $update_strategy_name

La matriz mostrada en la salida del comando stages muestra stage-1 con group-1 y group-2 y un valor de afterStageWaitInSeconds de 300, seguido de stage-2 con group-3, en consonancia con la estrategia definida en main.tf.

Limpieza de recursos

Ejecute terraform plan con el indicador -destroy para crear un plan de ejecución de destrucción.

terraform plan -destroy -out main.destroy.tfplan

Ejecute terraform apply para aplicar el plan de destrucción.

terraform apply main.destroy.tfplan

Warning

Este comando elimina la estrategia de actualización, el Azure Kubernetes Fleet Manager y el grupo de recursos creado por este ejemplo, no solo la estrategia. Confirme que el grupo de recursos no contiene otros recursos que desea conservar antes de ejecutar este comando.

Pasos siguientes

Puede usar una estrategia de actualización como parte de una ejecución de actualización manual o un perfil de actualización automática. Vea: