Compartir a través de


Aplicación de actualizaciones automáticas de seguridad a nodos de Azure Kubernetes Service (AKS) mediante Acciones de GitHub

Las actualizaciones de seguridad son una parte clave del mantenimiento de la seguridad y el cumplimiento del clúster de AKS con las correcciones más recientes para el sistema operativo subyacente. Estas actualizaciones incluyen las revisiones de seguridad del sistema operativo o las actualizaciones del kernel. Algunas actualizaciones requieren un reinicio del nodo para completar el proceso.

En este artículo se muestra cómo puede automatizar el proceso de actualización de los nodos de AKS mediante Acciones de GitHub y la CLI de Azure para crear una tarea de actualización basada en cron que se ejecute automáticamente.

Nota:

También puede realizar actualizaciones de imágenes de nodo automáticamente y programar estas actualizaciones mediante el mantenimiento planeado. Para más información, vea Actualización automática de imágenes de nodo.

Antes de empezar

  • Este artículo supone que ya tiene un clúster de AKS. Si necesita un clúster de AKS, cree uno mediante la CLI de Azure, Azure PowerShell o Azure Portal.
  • En este artículo también se da por hecho que tiene una cuenta de GitHub y un repositorio de perfiles para hospedar las acciones. Si no tiene un repositorio, cree uno con el mismo nombre que el nombre de usuario de GitHub.
  • Es preciso que esté instalada y configurada la versión 2.0.59 o posterior de la CLI de Azure, o cualquier otra posterior. Ejecute az --version para encontrar la versión. Si necesita instalarla o actualizarla, vea Instalación de la CLI de Azure.

Actualizar nodos con az aks upgrade

El az aks upgrade comando proporciona una forma de tiempo de inactividad cero para aplicar actualizaciones. El comando realiza las siguientes acciones:

  1. Aplica las actualizaciones más recientes a todos los nodos del clúster.
  2. Acordona (hace que el nodo no esté disponible para la programación de nuevas cargas de trabajo) y purga (mueve las cargas de trabajo existentes a otro nodo) el tráfico a los nodos.
  3. Reinicia los nodos.
  4. Permite que los nodos actualizados reciban tráfico de nuevo.

AKS no reinicia automáticamente los nodos si los actualiza mediante un método diferente.

Nota:

Ejecutar az aks upgrade con la bandera --node-image-only solo actualiza las imágenes de nodo. Al ejecutar el comando sin la marca se actualizan las imágenes de nodo y la versión del plano de control de Kubernetes. Para obtener más información, consulte la documentación sobre las actualizaciones administradas en los nodos y los documentos para las actualizaciones del clúster.

Todos los nodos de Kubernetes se ejecutan en una máquina virtual de Azure (VM) estándar basada en Windows o Linux. Las máquinas virtuales basadas en Linux usan una imagen de Ubuntu con el sistema operativo configurado para comprobar automáticamente las actualizaciones cada noche.

Cuando se usa el comando az aks upgrade de Azure CLI, se crea un aumento de nuevos nodos con las últimas actualizaciones de seguridad y de kernel. Estos nuevos nodos se acordonan inicialmente para evitar que las aplicaciones se programen en ellos hasta que se complete la actualización. Una vez completada la actualización, Azure aísla y vacía los nodos antiguos y desacordona los nuevos, transfiriendo todas las aplicaciones programadas a los nuevos nodos.

Este proceso es mejor que actualizar los kernels basados en Linux manualmente porque Linux requiere un reinicio cuando se instala una nueva actualización del kernel. Si actualiza el sistema operativo manualmente, también debe reiniciar la máquina virtual, acordonar y purgar manualmente todas las aplicaciones.

Crea una acción de GitHub programada

cron es una utilidad que permite ejecutar un conjunto de comandos o trabajos en una programación automatizada. Para crear un trabajo para actualizar los nodos de AKS en un cronograma automatizado, necesita un repositorio para alojar sus acciones. Las acciones de GitHub normalmente se configuran en el mismo repositorio que la aplicación, pero puede usar cualquier repositorio.

  1. Vaya al repositorio en GitHub.

  2. Seleccione Acciones.

  3. Seleccione Nuevo flujo de trabajo>Configurar un flujo de trabajo usted mismo.

  4. Cree una acción de GitHub denominada Actualizar imágenes de nodo de clúster con un desencadenador programado para ejecutarse cada 15 días a las 3:00 de la mañana. Copie el código siguiente en YAML:

    name: Upgrade cluster node images
    on:
      schedule:
        - cron: '0 3 */15 * *'
    
  5. Cree un trabajo denominado upgrade-node que se ejecute en un agente de Ubuntu y se conecte a la cuenta de la CLI de Azure para ejecutar el comando de actualización del nodo. Copie el código siguiente en el YAML bajo la clave on:

    jobs:
      upgrade-node:
        runs-on: ubuntu-latest
    

Configuración de la CLI de Azure en el flujo de trabajo

  1. En la barra Buscar Acciones en Marketplace, busque Inicio de sesión de Azure.

  2. Seleccione Inicio de sesión de Azure.

    Resultados de la búsqueda que muestran dos líneas, la primera acción se denomina

  3. En Instalación, seleccione una versión, como v1.4.6, y copie el fragmento de código de instalación.

  4. Agregue la steps clave y la siguiente información del fragmento de código de instalación al código YAML:

    name: Upgrade cluster node images
    on:
      schedule:
        - cron: '0 3 */15 * *'
    jobs:
      upgrade-node:
        runs-on: ubuntu-latest
        steps:
          - name: Azure Login
            uses: Azure/login@v1.4.6
            with:
              creds: ${{ secrets.AZURE_CREDENTIALS }}
    

Creación de credenciales para la CLI de Azure

  1. En una nueva ventana del navegador, cree un nuevo principal de servicio usando el comando az ad sp create-for-rbac. Asegúrese de reemplazar *{subscriptionID}* por su propio identificador de suscripción.

    Nota:

    En este ejemplo se crea el rol Contributor en el ámbito de la suscripción. Puede proporcionar el rol y el ámbito que satisfaga sus necesidades. Para más información, consulte Roles integrados de Azure y niveles de ámbito de RBAC de Azure.

    az ad sp create-for-rbac --role Contributor --scopes /subscriptions/{subscriptionID} -o json
    

    La salida debe ser similar a la siguiente salida de ejemplo:

    {
      "appId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
      "displayName": "xxxxx-xxx-xxxx-xx-xx-xx-xx-xx",
      "password": "xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
      "tenant": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
    }
    
  2. Copie la salida y vaya al repositorio de GitHub.

  3. Seleccione Configuración>Secretos y variables>Acciones>Nuevo secreto de repositorio.

  4. En Nombre, escriba AZURE_CREDENTIALS.

  5. Para Secreto, copie el contenido de la salida que ha recibido al crear la entidad de servicio.

  6. Seleccione Agregar secreto.

Creación de los pasos para ejecutar los comandos de la CLI de Azure

  1. Navegue a su ventana con el flujo de trabajo YAML.

  2. En la barra Buscar acciones en Marketplace, busque Acción de la CLI de Azure.

  3. Seleccione Acción de la CLI de Azure.

    Resultado de la búsqueda de

  4. En Instalación, seleccione una versión, como v1.0.8, y copie el fragmento de código de instalación.

  5. Pegue el contenido de la acción en yaML debajo del *Azure Login* paso, similar al ejemplo siguiente:

    name: Upgrade cluster node images
    on:
      schedule:
        - cron: '0 3 */15 * *'
    jobs:
      upgrade-node:
        runs-on: ubuntu-latest
        steps:
          - name: Azure Login
            uses: Azure/login@v1.4.6
            with:
              creds: ${{ secrets.AZURE_CREDENTIALS }}
          - name: Upgrade node images
            uses: Azure/cli@v1.0.8
            with:
              inlineScript: az aks upgrade --resource-group <resourceGroupName> --name <aksClusterName> --node-image-only --yes
    

    Sugerencia

    Puede desacoplar los --resource-group parámetros y --name del comando mediante la creación de nuevos secretos de repositorio como lo hizo para AZURE_CREDENTIALS.

    Si crea secretos para estos parámetros, debe reemplazar los marcadores de posición <resourceGroupName> y <aksClusterName> por sus homólogos secretos. Por ejemplo, ${{secrets.RESOURCE_GROUP_NAME}} y ${{secrets.AKS_CLUSTER_NAME}}

  6. Cambie el nombre de YAML a upgrade-node-images.yml.

  7. Seleccione Confirmar cambios..., agregue un mensaje de confirmación y, a continuación, seleccione Confirmar cambios.

Ejecución manual de la acción de GitHub

Puede ejecutar el flujo de trabajo manualmente además de la ejecución programada agregando un nuevo on desencadenador denominado workflow_dispatch.

Nota:

Si desea actualizar un grupo de nodos único en lugar de todos los grupos de nodos del clúster, agregue el --name parámetro al az aks nodepool upgrade comando para especificar el nombre del grupo de nodos. Por ejemplo:

az aks nodepool upgrade --resource-group <resourceGroupName> --cluster-name <aksClusterName> --name <nodePoolName> --node-image-only
  • Agregue el workflow_dispatch desencadenador bajo la on clave:

    name: Upgrade cluster node images
    on:
      schedule:
        - cron: '0 3 */15 * *'
      workflow_dispatch:
    

    El código YAML debe tener un aspecto similar al del ejemplo siguiente:

        name: Upgrade cluster node images
        on:
          schedule:
            - cron: '0 3 */15 * *'
          workflow_dispatch:
        jobs:
          upgrade-node:
            runs-on: ubuntu-latest
            steps:
              - name: Azure Login
                uses: Azure/login@v1.4.6
                with:
                  creds: ${{ secrets.AZURE_CREDENTIALS }}
              - name: Upgrade node images
                uses: Azure/cli@v1.0.8
                with:
                  inlineScript: az aks upgrade -g {resourceGroupName} -n {aksClusterName} --node-image-only --yes
              # Code for upgrading one or more node pools
    

Pasos siguientes

Para obtener más información sobre las actualizaciones de AKS, consulte los siguientes artículos y recursos:

Para obtener una explicación detallada de los procedimientos recomendados de actualización y otras consideraciones, consulte Guía de actualización y revisión de AKS.