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:
- Aplica las actualizaciones más recientes a todos los nodos del clúster.
- 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.
- Reinicia los nodos.
- 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.
Vaya al repositorio en GitHub.
Seleccione Acciones.
Seleccione Nuevo flujo de trabajo>Configurar un flujo de trabajo personalmente.
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 * *'
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
En la barra Buscar Acciones en Marketplace, busque Inicio de sesión de Azure.
Seleccione Inicio de sesión de Azure.
En Instalación, seleccione una versión, como v1.4.6 y copie el fragmento de código de instalación.
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
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" }
Copie la salida y vaya al repositorio de GitHub.
Seleccione Configuración>Secretos y variables>Acciones>Nuevo secreto del repositorio.
En Nombre, escriba
AZURE_CREDENTIALS
.Para Secreto, copie el contenido de la salida que ha recibido al crear la entidad de servicio.
Seleccione Agregar secreto.
Creación de los pasos para ejecutar los comandos de la CLI de Azure
Vaya a la ventana con el flujo de trabajo YAML.
En la barra Buscar acciones en Marketplace, busque Acción de la CLI de Azure.
Seleccione Acción de la CLI de Azure.
En Instalación, seleccione una versión, como v1.0.8 y copie el fragmento de código de instalación.
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 paraAZURE_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}}
Cambie el nombre del código de YAML a
upgrade-node-images.yml
.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 claveon
: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.
Azure Kubernetes Service