Prácticas recomendadas para aprovisionar y configurar de forma automática sistemas y servidores perimetrales y bare metal

Last reviewed 2023-02-23 UTC

En este documento, se sugieren prácticas recomendadas para diseñar e implementar procesos de aprovisionamiento y configuración confiables y automatizados para dispositivos que se ejecutan en los perímetros de tu entorno, como los siguientes:

Lee este documento si diseñas procesos de aprovisionamiento y configuración de dispositivos de IoT y perimetrales, o si quieres obtener más información sobre las prácticas recomendadas para aprovisionar estos tipos de dispositivos.

Este documento es parte de una serie de documentos que proporcionan información sobre las arquitecturas de IoT en Google Cloud y la migración desde IoT Core. Los otros documentos de esta serie incluyen lo siguiente:

El aprovisionamiento y la configuración manual de una gran flota de dispositivos son propensos a generar errores humanos y no se escalan a medida que la flota crece. Por ejemplo, podrías olvidarte de ejecutar una tarea crítica de aprovisionamiento o de configuración, o es posible que dependas de procesos parcialmente incompletos o sin documentar. Los procesos de aprovisionamiento y configuración completamente automatizados y confiables ayudan a resolver estos problemas. También te ayudan a administrar el ciclo de vida de cada dispositivo, desde la fabricación hasta el retiro y la eliminación.

Terminología

Los siguientes términos son importantes a fin de comprender cómo implementar y compilar procesos automatizados de aprovisionamiento y configuración de tus dispositivos:

  • Dispositivos perimetrales: es el dispositivo que implementas en los perímetros del entorno que se encuentra cerca de los datos que deseas procesar.
  • Proceso de aprovisionamiento: es el conjunto de tareas que debes completar a fin de preparar un dispositivo para la configuración.
  • Proceso de configuración: es el conjunto de tareas que debes completar a fin de preparar un dispositivo para operar en un entorno específico.
  • Administración de configuración: es el conjunto de tareas que realizas de forma continua para administrar la configuración de tu entorno y tus dispositivos.
  • Imagen base: es una imagen mínima de sistema operativo (SO) o firmware producido por tu empresa o producido por un dispositivo o fabricante del SO.
  • Imagen dorada: es una imagen de SO o firmware inmutable que creas para tus dispositivos o que preparas a partir de una imagen base. Las imágenes doradas incluyen todos los datos y la información de configuración que tus dispositivos necesitan para realizar las tareas asignadas. Puedes preparar varias imágenes doradas para realizar tareas diferentes. Los sinónimos para los tipos de imágenes doradas incluyen sabores, variantes y arquetipos.
  • Imagen Plata: es una imagen de SO o firmware que preparas para tus dispositivos mediante la aplicación de cambios mínimos a una imagen dorada o base. Los dispositivos que ejecutan una imagen plateada completan su aprovisionamiento y configuración en el primer inicio, según las necesidades de los casos de uso que esos dispositivos deben admitir.
  • Dispositivo inicial: es un dispositivo que inicia el entorno sin dependencias externas.
  • Inicio de la red: es el conjunto de tecnologías que permiten que un dispositivo obtenga software y cualquier información de configuración relacionada de la red, en lugar de un sistema de almacenamiento conectado al dispositivo.

Prácticas recomendadas para los procesos de aprovisionamiento y configuración

Para establecer objetivos y evitar errores comunes, aplica las siguientes prácticas recomendadas de aprovisionamiento y configuración. Cada recomendación se analiza en su propia sección.

Automatiza los procesos de aprovisionamiento y configuración

Durante su primer inicio, o cuando sea necesario, tus dispositivos deben poder aprovisionarse y configurarse solos con la imagen de software instalada en ellos.

Puedes usar herramientas que te brindan las primitivas necesarias para organizar e implementar esos procesos para evitar la implementación de la lógica que necesitas durante los procesos de aprovisionamiento y configuración. Por ejemplo, puedes usar cloud-init y su fuente de datos de NoCloud, junto con secuencias de comandos o una herramienta de administración de configuración, como Ansible, Puppet o Chef, que se ejecutan en el host local.

Para diseñar procesos confiables de aprovisionamiento y configuración, asegúrate de que todos los pasos y tareas que se realizan durante esos procesos sean válidos, posiblemente de forma automatizada. Por ejemplo, puedes usar un framework de prueba de cumplimiento automatizado, como InSpec, para verificar que tus procesos de aprovisionamiento y configuración funcionen como se espera.

Esta práctica recomendada te ayudará a evitar puntos únicos de fallo y la necesidad de intervención manual cuando necesites completar el aprovisionamiento y la configuración del dispositivo.

Evita los dispositivos de propósito especial

Cuando diseñes tus dispositivos perimetrales, minimiza su variación en términos de propósito y especialidad. Esta recomendación no significa que todos tus dispositivos perimetrales deben ser iguales entre sí o compartir el mismo propósito, pero deben ser lo más homogéneos posible. Por ejemplo, puedes definir arquetipos de dispositivo según los tipos de carga de trabajo que necesitan admitir. Luego, puedes implementar y administrar tus dispositivos según las propiedades de esos arquetipos.

Para asegurarte de seguir esta práctica recomendada, verifica que puedas elegir un dispositivo de forma aleatoria de los de un arquetipo determinado y, luego, haz lo siguiente:

  • Trata el dispositivo como lo harías con otros dispositivos del mismo arquetipo. Esto demuestra que tienes eficiencia operativa.
  • Reemplaza el dispositivo por otros del mismo arquetipo sin personalizaciones adicionales. Si lo haces, se muestra que implementaste correctamente esos arquetipos.

Esta práctica recomendada garantiza que se reduzca la variación en la flota de dispositivos, lo que genera una menor fragmentación en tu entorno y los procesos de aprovisionamiento y configuración.

Usa dispositivos iniciales para iniciar tu entorno

Cuando aprovisionas y configuras tus dispositivos, es posible que te encuentres con un problema de dependencia circular: los dispositivos deben tener una infraestructura de respaldo para aprovisionarse y configurarse, pero esa infraestructura no existe porque aún debes aprovisionarla y configurarla.

Puedes resolver este problema con los dispositivos iniciales. Los dispositivos iniciales tienen un propósito especial temporal. Después de completar las tareas para las que se diseñó el propósito especial, el dispositivo ajusta su comportamiento y su estado al arquetipo relevante.

Por ejemplo, si usas cloud-init para inicializar de manera automática los dispositivos, es posible que debas configurar una fuente de datos cloud-init NoCloud de la siguiente manera:

  1. Proporciona los datos de la fuente de datos de NoCloud al dispositivo inicial a través de un sistema de archivos.
  2. Espera a que el dispositivo inicial complete su propio aprovisionamiento y configuración con su propósito especial, que incluye la entrega de datos de fuente de datos NoCloud a otros dispositivos a través de la red.

    Los procesos de aprovisionamiento y configuración del dispositivo de origen esperan hasta que se cumplan las condiciones para descartar el propósito especial temporal del dispositivo de origen. A continuación, se muestran algunos ejemplos de estas condiciones:

    • ¿Existen otros dispositivos en el entorno que entreguen los datos de la fuente de datos de NoCloud a través de la red?
    • ¿Existen suficientes nodos en el clúster?
    • ¿Se completó la primera copia de seguridad?
    • ¿Está listo el sitio de recuperación ante desastres?
  3. Aprovisiona y configura otros dispositivos que descarguen los datos de la fuente de datos NoCloud a través de la red desde el dispositivo de origen Algunos dispositivos deben poder entregar los datos de la fuente de datos NoCloud a través de la red.

  4. Los procesos de aprovisionamiento y configuración del dispositivo de origen se reanudan porque se cumplen las condiciones para descartar el propósito especial del dispositivo de origen: existen otros dispositivos en la flota que entregan los datos de la fuente de datos de NoCloud a través de la red.

  5. Los procesos de aprovisionamiento y configuración del dispositivo de origen descartan el propósito especial, lo que hace que el dispositivo inicial no se pueda distinguir de otros dispositivos del mismo arquetipo.

Esta práctica recomendada garantiza que puedas iniciar el entorno, incluso sin admitir la infraestructura, y sin infringir la práctica recomendada Evita los dispositivos de propósito especial.

Minimiza el estado de tus dispositivos

Cuando diseñes tus dispositivos perimetrales, mantén la necesidad de almacenar información con estado al mínimo. Los dispositivos perimetrales pueden tener recursos de hardware limitados o pueden implementarse en entornos estrictos. Minimizar la información con estado que necesitan simplifica los procesos de aprovisionamiento, configuración, copia de seguridad y recuperación porque puedes tratar esos dispositivos de forma homogénea. Si un dispositivo perimetral sin estado comienza a fallar y no se puede recuperar, por ejemplo, puedes cambiarlo por otro dispositivo del mismo arquetipo con interrupciones o pérdida de datos mínimas.

Esta práctica recomendada te ayuda a evitar problemas inesperados debido a la pérdida de datos o a que tus procesos sean demasiado complejos. La mayor complejidad proviene de la necesidad de prestar servicio a una flota de dispositivos heterogéneos.

Compila imágenes de SO y firmware de forma automática.

Para evitar tareas de aprovisionamiento y configuración costosas cuando tus dispositivos se inician por primera vez y para ahorrar recursos de los dispositivos, personaliza las imágenes de SO y firmware antes de que estén disponibles. Por ejemplo, puedes instalar dependencias directamente en la imagen en lugar de instalarlas cuando se inicia cada dispositivo por primera vez.

Cuando prepares imágenes de SO y firmware para tus dispositivos, comienzas desde una imagen base. Cuando personalizas la imagen base, puedes hacer lo siguiente:

  • Producir imágenes doradas. Las imágenes doradas contienen todas las dependencias en la imagen, por lo que tus dispositivos no tienen que instalarlas en el primer inicio. Producir imágenes doradas puede ser una tarea compleja, pero permiten que los dispositivos ahorren tiempo y recursos durante el aprovisionamiento y la configuración.
  • Produce imágenes plateadas. A diferencia de las imágenes doradas, los dispositivos que ejecutan imágenes plateadas completan todos los procesos de aprovisionamiento y configuración durante su primer inicio. Producer imágenes plateadas puede ser menos complejo que producir imágenes doradas, pero los dispositivos que ejecutan una imagen plateada ocupan más tiempo y recursos durante el aprovisionamiento y la configuración.

Puedes personalizar las imágenes de SO y firmware como parte de los procesos de integración continua y de implementación continua (CI/CD) y automáticamente hacer que las imágenes personalizadas estén disponibles para tus dispositivos después de la validación. Los procesos de IC/EC que implementas con una herramienta como Cloud Build, GitHub Actions, GitLab CI/CD o Jenkins, pueden realizar la siguiente secuencia de tareas:

  1. Realiza una validación automática con las imágenes personalizadas.
  2. Publica las imágenes personalizadas en un repositorio desde el cual tus dispositivos puedan obtenerlas.

Si tu entorno de CI/CD y el SO o firmware para el que necesitas compilar imágenes usan diferentes arquitecturas de hardware, puedes usar herramientas como QEMU a fin de emular esas arquitecturas. Por ejemplo, puedes emular la arquitectura de hardware de la familia ARM en una arquitectura x86_64.

Para personalizar tus imágenes de SO o firmware, debes poder modificarlas y verificar esas modificaciones en un entorno de prueba antes de instalarlas en tus dispositivos perimetrales. Herramientas como chroot te permiten cambiar virtualmente, pero no cambian de forma física el directorio raíz antes de ejecutar un comando.

Por ejemplo, ejecutar el comando chroot /mnt/test-image apt-get install PACKAGENAME hace que el sistema se comporte como si /mnt/test-image fuera el directorio raíz del SO o la imagen de firmware en lugar de / e instala PACKAGENAME en ese directorio.

Esta práctica recomendada te ayuda a personalizar las imágenes de SO y firmware antes de que las imágenes estén disponibles en tus dispositivos.

Organiza de forma confiable las cargas de trabajo que se ejecutarán en tus dispositivos

Si tus dispositivos admiten cargas de trabajo heterogéneas, puedes usar las siguientes herramientas para organizar esas cargas de trabajo y administrar su ciclo de vida:

  • Un sistema de organización de carga de trabajo: Usar un sistema de organización de cargas de trabajo, comoKubernetes, es adecuado para cargas de trabajo que tienen requisitos de organización complejos o de administración del ciclo de vida. Estos sistemas también son adecuados para cargas de trabajo que abarcan varios componentes. En ambos casos, significa que no tienes que implementar esa lógica de organización y administración del ciclo de vida de la carga de trabajo por tu cuenta. Si tus dispositivos tienen recursos limitados, puedes instalar una distribución básica de Kubernetes que necesite menos recursos que la canónica, como MicroK8s, K3s o GKE en Bare Metal instalado con el perfil perimetral.
  • Un sistema init: si usas un sistema init, como systemd, es adecuado para cargas de trabajo con las características siguientes:

    • Requisitos de organización simples
    • Falta de recursos para admitir un sistema de organización de cargas de trabajo
    • Cargas de trabajo que no se pueden colocar en contenedores

Una vez que hayas establecido un sistema que organice tus cargas de trabajo, también puedes usarlo para ejecutar tareas que forman parte de los procesos de aprovisionamiento y configuración. Si necesitas ejecutar una herramienta de administración de configuración como parte de los procesos de aprovisionamiento y configuración, por ejemplo, puedes usar el sistema de organización de cargas de trabajo como lo harías con cualquier otra carga de trabajo. Para ver un ejemplo de esta metodología, consulta Inicia automáticamente los nodos de GKE con DaemonSets. En el artículo, se describe cómo usar Kubernetes para ejecutar tareas de aprovisionamiento y configuración privilegiadas en los nodos del clúster.

Esta práctica recomendada ayuda a garantizar que puedas organizar las cargas de trabajo que se ejecutan en tus dispositivos.

Verifica, autentica y conecta dispositivos

Cuando necesites verificar si tus dispositivos deben conectarse a sistemas externos, como otros dispositivos o a un backend, considera las recomendaciones de las siguientes subsecciones.

Prácticas de conexión que debes aplicar

  • Autentica otras partes que realizan solicitudes de información antes de intercambiar información
  • Verifica que la información transmitida no pase por canales inesperados.
  • Cuenta con los entornos de ejecución confiables para manejar los secretos, como las claves de encriptación, las claves de autenticación y las contraseñas.
  • Verifica la integridad y la autenticidad de cualquier imagen de SO o firmware antes de su uso.
  • Verifica la validez, la integridad y la autenticidad de cualquier configuración que proporciona el usuario.
  • Limitar la superficie de ataque, no instales software innecesario y quites los que ya existen en tus dispositivos.
  • Limita el uso de cuentas y operaciones privilegiadas
  • Verifica la integridad del caso del dispositivo si este necesita resistir la manipulación física y la alteración.

Prácticas de conexión que debes evitar

  • No transmitas información sensible a través de canales sin encriptación.
  • Evita dejar el acceso con privilegios abierto, como el siguiente:
    • Puertos en serie y consolas en serie virtuales o físicos con privilegios elevados, incluso si se puede acceder a los puertos solo si una persona manipula físicamente el dispositivo.
    • Extremos que responden a solicitudes provenientes de la red y que pueden ejecutar operaciones privilegiadas.
  • No dependas de las credenciales codificadas en las imágenes de SO o firmware, la configuración o el código fuente.
  • No reveles información que pueda ayudar a un adversario a recopilar información para obtener privilegios elevados. Por ejemplo, debes encriptar los datos de tus dispositivos y desactivar los sistemas de registro y seguimiento innecesarios en los dispositivos de producción.
  • No permitas que los usuarios y las cargas de trabajo ejecuten un código arbitrario.

Esta práctica recomendada te ayudará a lograr lo siguiente:

  • Diseñar canales de comunicación seguros para tus dispositivos.
  • Evitar las posibles puertas traseras que eludan el perímetro de seguridad de tus dispositivos.
  • Verificar que tus dispositivos no expongan interfaces no autorizadas que un atacante podría aprovechar.

Supervisa tus dispositivos

Recopilar información sobre el estado de tus dispositivos sin intervención manual es esencial para la confiabilidad de tu entorno. Asegúrate de que tus dispositivos informen automáticamente todos los datos que necesites. Existen dos razones principales para recopilar y supervisar los datos. La primera razón para recopilar y supervisar datos es asegurarte de que tus dispositivos funcionen según lo previsto. La segunda razón para recopilar y supervisar datos es detectar problemas de forma proactiva y realizar mantenimiento preventivo, por ejemplo, puedes recopilar métricas y eventos de supervisión con Cloud Monitoring.

Para ayudarte a investigar y solucionar problemas, te recomendamos que diseñes e implementes procesos a fin de recopilar datos de diagnóstico de alta resolución, como información detallada de supervisión, seguimiento y depuración, además de los procesos que supervisan tu dispositivos durante su funcionamiento normal. Recopilar datos de diagnóstico de alta resolución y transferirlos a través de una red puede ser costoso en términos de recursos de dispositivos, como procesamiento, almacenamiento de datos y energía eléctrica. Por este motivo, te recomendamos que habilites procesos para recopilar datos de diagnóstico de alta resolución solo cuando sea necesario y solo en los dispositivos que necesiten más investigación. Por ejemplo, si uno de tus dispositivos no funciona según lo previsto y los datos de supervisión normales que informa el dispositivo no son suficientes para diagnosticar el problema de forma exhaustiva, puedes habilitar la recopilación de datos de alta resolución para ese dispositivo, de manera que entregue más información que pueda ayudarte a investigar las causas del problema.

Esta práctica recomendada garantizará que no dejes los dispositivos en un estado desconocido y que tengas suficientes datos para determinar si sus dispositivos tienen un buen rendimiento y cómo lo hacen.

Compatibilidad con el arranque y las actualizaciones sin supervisión

Cuando diseñes los procesos de aprovisionamiento y configuración, asegúrate de que los dispositivos sean capaces de iniciar sin supervisión y de que tengas la infraestructura necesaria. Puedes implementar un mecanismo de arranque sin supervisión que admita el primer inicio y la entrega de actualizaciones inalámbricas para aumentar la capacidad de mantenimiento de la infraestructura. El uso de un arranque sin supervisión evita que asistas de forma manual a cada dispositivo mientras se inicia o actualiza. La asistencia manual a una gran flota de dispositivos es propensa a errores porque los operadores pueden perder acciones o realizar acciones de forma incorrecta, o es posible que no tengan tiempo suficiente para realizar las acciones necesarias en cada dispositivo.

Además, no tienes que preparar cada dispositivo con anticipación para iniciar la imagen correcta de SO o firmware. Por ejemplo, puedes lanzar una versión nueva de una imagen de SO o firmware y hacer que esa versión esté disponible como una de las opciones que tus dispositivos pueden elegir cuando toman sus instrucciones de inicio desde la red.

Esta práctica recomendada te ayudará a garantizar que tus dispositivos puedan realizar inicios y actualizaciones que están automatizadas y sin supervisión.

Diseña e implementa procesos resilientes

Incluso con procesos de aprovisionamiento y configuración completamente automatizados, pueden producirse errores que impiden que esos procesos se completen de forma correcta, lo que deja a tus dispositivos en un estado incoherente. Implementa mecanismos de resguardo y reintento para garantizar que tus dispositivos puedan recuperarse de estas fallas. Cuando un dispositivo no completa una tarea que forma parte de los procesos de aprovisionamiento y configuración, por ejemplo, debería intentar recuperarse de esa falla de forma automática. Una vez que el dispositivo se recupera de la falla o vuelve a un estado de trabajo, puede reanudar los procesos en ejecución desde el momento en que fallaron.

Esta práctica recomendada te ayudará a diseñar e implementar procesos de aprovisionamiento y configuración resilientes.

Brinda asistencia a todo el ciclo de vida de tus dispositivos

Cuando diseñes los procesos de aprovisionamiento y configuración, asegúrate de que esos procesos puedan administrar todo el ciclo de vida de los dispositivos. La administración eficaz de los ciclos de vida de los dispositivos incluye la planificación para la finalización y la eliminación, incluso si los dispositivos deben ejecutarse durante un tiempo relativamente largo.

Se podrían crear problemas si no administras el ciclo de vida de tus dispositivos, como los siguientes:

  • Costos altos sostenidos: La introducción de la asistencia para la administración del ciclo de vida después de que se aplican los procesos de aprovisionamiento y configuración puede aumentar los costos. Si planificas esta asistencia al principio del diseño, puedes reducir esos costos. Si los procesos de aprovisionamiento y configuración no admiten todo el ciclo de vida de los dispositivos, por ejemplo, es posible que debas intervenir de forma manual en cada dispositivo para controlar de manera correcta cada fase del ciclo de vida. La intervención manual puede ser costosa y, a menudo, no se escala.
  • Mayor rigurosidad: Si no se admite la administración del ciclo de vida, se puede llegar a producir la imposibilidad de actualizar o administrar tus dispositivos. Si no tienes un mecanismo para apagar tus dispositivos de manera segura y eficiente, por ejemplo, puede ser difícil administrar su final del ciclo de vida y la eliminación definitiva.

¿Qué sigue?