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

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

En este artículo se muestra cómo 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 ejecuta automáticamente.

Nota:

También puede realizar actualizaciones de imágenes de nodo automáticamente y programarlas 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.

Actualización de nodos con az aks upgrade

El comando az aks upgrade le proporciona una manera de aplicar actualizaciones sin tiempo de inactividad. 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 con otro método.

Nota:

La ejecución de az aks upgrade con la marca --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 más información, vea la documentación sobre actualizaciones administradas en los nodos y la documentación para las actualizaciones de clúster.

Todos los nodos de Kubernetes se ejecutan en una máquina virtual (VM) de Azure 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 buscar actualizaciones automáticamente cada noche.

Al usar el comando az aks upgrade, la CLI de Azure crea un aumento de los nuevos nodos con las actualizaciones de kernel y seguridad más recientes. Estos nuevos nodos se acordonan inicialmente para evitar que se programen aplicaciones en ellos hasta que se complete la actualización. Una vez que se completa la actualización, Azure acordona y purga los nodos anteriores y anula la el acordonamiento de los nuevos, y transfiere todas las aplicaciones programadas a los nodos nuevos.

Este proceso es mejor que la actualización manual de kernels basados en Linux, ya que 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, acordonando y drenando manualmente todas las aplicaciones.

Creación de una acción de GitHub con hora

cron es una utilidad que permite ejecutar un conjunto de comandos, o trabajos, según una programación automatizada. A fin de crear un trabajo para actualizar los nodos de AKS según una programación automatizada, necesita un repositorio para hospedar las acciones. Normalmente, Acciones de GitHub se configuran en el mismo repositorio que la aplicación, pero puede utilizar cualquier repositorio.

  1. Vaya al repositorio en GitHub.

  2. Seleccione Acciones.

  3. Seleccione Nuevo flujo de trabajo>Configurar un flujo de trabajo personalmente.

  4. Cree una acción de GitHub con el nombre Actualizar imágenes de nodo de clúster con un desencadenador de programación para que se ejecute cada 15 días a las 3:00. Copie el código siguiente en el código 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 código 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 clave steps y la siguiente información del fragmento de código de instalación al código de 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 explorador, cree una entidad de servicio mediante el comando az ad sp create-for-rbac. Asegúrese de reemplazar*{subscriptionID}* por un identificador de suscripción propio.

    Nota:

    En este ejemplo se crea el rol Contributor en el ámbito Suscripción. Puede proporcionar el rol y el ámbito que satisfaga las 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 del 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. Vaya a la 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 el código YAML debajo del paso *Azure Login*, como en el 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 parámetros --resource-group y --name del comando mediante la creación de secretos de repositorio como ha hecho 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 del código de YAML a upgrade-node-images.yml.

  7. Select Confirmar cambios..., agregue un mensaje de confirmación y 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, si agrega un nuevo desencadenador de on denominado workflow_dispatch.

Nota:

Si quiere actualizar un solo grupo de nodos en lugar de todos los grupos de nodos del clúster, agregue el parámetro --name al comando az aks nodepool upgrade 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 desencadenador workflow_dispatch en la clave on:

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

    El código de YAML debe ser 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 más información sobre las actualizaciones de AKS, vea los artículos y recursos siguientes:

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