En este documento se sugieren prácticas recomendadas para diseñar e implementar procesos de aprovisionamiento y configuración fiables y automatizados para dispositivos que se ejecutan en los extremos de tu entorno, como los siguientes:
- Dispositivos perimetrales, como dispositivos del Internet de las cosas (IoT), microordenadores y microcontroladores
- Sistemas y servidores Bare Metal
Lee este documento si diseñas procesos de aprovisionamiento y configuración para dispositivos perimetrales, sistemas y servidores bare metal, o si quieres obtener más información sobre las prácticas recomendadas para aprovisionar y configurar estos tipos de dispositivos.
En este documento no se enumeran todas las prácticas recomendadas posibles para aprovisionar y configurar sistemas y servidores bare metal y de periferia, ni se garantiza el éxito. En su lugar, te ayuda a fomentar debates sobre posibles cambios y mejoras en tus procesos de aprovisionamiento y configuración.
Este documento forma parte de una serie de documentos que proporcionan información sobre las arquitecturas de IoT en Google Cloud. Los demás documentos de esta serie incluyen lo siguiente:
- Descripción general de las arquitecturas de dispositivos conectados en Google Cloud
- Arquitectura de agente de MQTT independiente en Google Cloud
- Arquitectura de producto de la plataforma de IoT en Google Cloud
- Arquitectura de dispositivo en Pub/Sub para Google Cloud
- Prácticas recomendadas para ejecutar un backend de IoT en Google Cloud
- Prácticas recomendadas para aprovisionar y configurar automáticamente sistemas y servidores bare metal y de periferia (este documento)
El aprovisionamiento y la configuración manuales de una gran flota de dispositivos son propensos a errores humanos y no se pueden escalar a medida que crece la flota. Por ejemplo, puede que olvides ejecutar una tarea de aprovisionamiento o configuración crítica, o que dependas de procesos que no estén documentados o que lo estén solo parcialmente. Los procesos de aprovisionamiento y configuración totalmente automatizados y fiables ayudan a resolver estos problemas. También te ayudan a gestionar el ciclo de vida de cada dispositivo, desde la fabricación hasta la retirada y la eliminación.
Terminología
Es importante que conozcas los siguientes términos para saber cómo implementar y crear procesos de aprovisionamiento y configuración automatizados para tus dispositivos:
- Dispositivo perimetral: dispositivo que se implementa en los extremos de tu entorno y que está cerca de los datos que quieres procesar.
- Proceso de aprovisionamiento: conjunto de tareas que debes completar para preparar un dispositivo para la configuración.
- Proceso de configuración: conjunto de tareas que debes completar para que un dispositivo esté listo para funcionar en un entorno específico.
- Gestión de la configuración: conjunto de tareas que realizas continuamente para gestionar la configuración de tu entorno y tus dispositivos.
- Imagen base: imagen mínima de un sistema operativo (SO) o firmware que funcione y que haya creado tu empresa o el fabricante de un dispositivo o SO.
- Imagen dorada: imagen inmutable de un SO o firmware 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 necesitan tus dispositivos para llevar a cabo las tareas que tienen asignadas. Puedes preparar varias imágenes doradas para llevar a cabo diferentes tareas. Entre los sinónimos de los tipos de imágenes doradas se incluyen variantes, versiones y arquetipos.
- Imagen silver: imagen de SO o firmware que preparas para tus dispositivos aplicando cambios mínimos a una imagen golden o a una imagen base. Los dispositivos que ejecutan una imagen silver completan su aprovisionamiento y configuración en el primer arranque, según las necesidades de los casos prácticos que deben admitir.
- Dispositivo de inicialización: dispositivo que inicializa tu entorno sin dependencias externas.
- Arranque de red: conjunto de tecnologías que permite 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.
Para ayudarte a definir objetivos y evitar problemas habituales, aplica las prácticas recomendadas de aprovisionamiento y configuración que se describen en las siguientes secciones.
Automatizar los procesos de aprovisionamiento y configuración
Durante el primer arranque o en cualquier momento en que sea necesario, tus dispositivos deberían poder aprovisionarse y configurarse por sí mismos usando solo la imagen de software instalada en ellos.
Para no tener que implementar la lógica que necesitas durante los procesos de aprovisionamiento y configuración, puedes usar herramientas que te proporcionen los elementos primitivos necesarios para coordinar e implementar esos procesos. Por ejemplo, puedes usar cloud-init y su fuente de datos NoCloud junto con secuencias de comandos o una herramienta de gestión de la configuración, como Ansible, Puppet o Chef, que se ejecutan en el host local.
Para diseñar procesos de aprovisionamiento y configuración fiables, asegúrate de que todos los pasos y las tareas que se realicen durante esos procesos sean válidos, posiblemente de forma automática. Por ejemplo, puedes usar un marco de pruebas de cumplimiento automatizado, como InSpec, para verificar que tus procesos de aprovisionamiento y configuración funcionan correctamente.
Esta práctica recomendada te ayuda a evitar puntos únicos de fallo y la necesidad de intervención manual cuando tengas que completar el aprovisionamiento y la configuración de dispositivos.
Evita los dispositivos específicos
Cuando diseñes tus dispositivos periféricos, minimiza su varianza en términos de propósito y especialidad. Esta recomendación no significa que todos tus dispositivos perimetrales deban ser iguales entre sí o tener el mismo propósito, pero sí que deben ser lo más homogéneos posible. Por ejemplo, puedes definir arquetipos de dispositivo según los tipos de carga de trabajo que deban admitir. Después, puedes implementar y gestionar tus dispositivos según las propiedades de esos arquetipos.
Para asegurarte de que sigues esta práctica recomendada, comprueba que puedes elegir un dispositivo aleatorio de los de un arquetipo determinado y, a continuación, haz lo siguiente:
- Trata el dispositivo como lo harías con otros dispositivos del mismo arquetipo. De esta forma, demuestras que tienes eficiencia operativa.
- Sustituye el dispositivo por otros del mismo arquetipo sin personalizaciones adicionales. De esta forma, se demuestra que has implementado correctamente esos arquetipos.
Con esta práctica recomendada, se reduce la varianza en tu flota de dispositivos, lo que conlleva una menor fragmentación en tu entorno y en los procesos de aprovisionamiento y configuración.
Usar dispositivos de inicio para inicializar tu entorno
Al aprovisionar y configurar tus dispositivos, puede que te encuentres con un problema de dependencia circular: tus dispositivos necesitan una infraestructura compatible para aprovisionarse y configurarse, pero esa infraestructura no está disponible porque aún tienes que aprovisionarla y configurarla.
Puedes solucionar este problema con dispositivos semilla. Los dispositivos de inicio tienen un propósito especial temporal. Una vez completadas las tareas para las que se ha diseñado el propósito especial, el dispositivo adapta su comportamiento y estado al arquetipo correspondiente.
Por ejemplo, si usas cloud-init para inicializar automáticamente tus dispositivos, puede que tengas que configurar una fuente de datos NoCloud de cloud-init de las siguientes formas:
- Proporciona los datos de la fuente de datos NoCloud al dispositivo de inicio a través de un sistema de archivos.
Espera a que el dispositivo de origen complete su propio aprovisionamiento y configuración para su propósito especial, que incluye proporcionar los datos de la fuente de datos NoCloud a otros dispositivos a través de la red.
Los procesos de aprovisionamiento y configuración del dispositivo inicial esperan hasta que se cumplan las condiciones para eliminar el propósito especial temporal del dispositivo inicial. Estos son algunos ejemplos de estas condiciones:
- ¿Hay otros dispositivos en el entorno que proporcionen datos de la fuente de datos NoCloud a través de la red?
- ¿Hay suficientes nodos en el clúster?
- ¿Se ha completado la primera copia de seguridad?
- ¿Está listo el sitio de recuperación tras fallos?
Aprovisiona y configura otros dispositivos que descarguen los datos de la fuente de datos NoCloud a través de la red desde el dispositivo inicial. Algunos dispositivos deben poder proporcionar los datos de la fuente de datos NoCloud a través de la red.
Los procesos de aprovisionamiento y configuración del dispositivo inicial se reanudan porque se cumplen las condiciones para dejar de usar el dispositivo inicial con fines especiales: hay otros dispositivos en la flota que proporcionan los datos de la fuente de datos NoCloud a través de la red.
Los procesos de aprovisionamiento y configuración del dispositivo inicial eliminan el propósito especial, por lo que el dispositivo inicial no se distingue de otros dispositivos del mismo arquetipo.
Esta práctica recomendada te permite inicializar tu entorno aunque no tengas una infraestructura compatible y sin contravenir la práctica recomendada Evita los dispositivos específicos.
Minimizar el estado de tus dispositivos
Cuando diseñes tus dispositivos perimetrales, procura que la necesidad de almacenar información con estado sea mínima. Los dispositivos perimetrales pueden tener recursos de hardware limitados o desplegarse en entornos hostiles. Al minimizar la información con estado que necesitan para funcionar, se simplifican los procesos de aprovisionamiento, configuración, copia de seguridad y recuperación, ya que puedes tratar estos dispositivos de forma homogénea. Si un dispositivo periférico sin estado empieza a fallar y no se puede recuperar, puedes sustituirlo por otro dispositivo del mismo arquetipo con interrupciones o pérdida de datos mínimas.
Esta práctica recomendada te ayuda a evitar problemas imprevistos debido a la pérdida de datos o a que tus procesos sean demasiado complejos. La mayor parte de la complejidad se debe a la necesidad de admitir una flota de dispositivos heterogéneos.
Compilar automáticamente imágenes de SO y firmware
Para evitar tareas de aprovisionamiento y configuración costosas cuando los dispositivos se inician por primera vez, y para ahorrar recursos del dispositivo, personaliza las imágenes del SO y del firmware antes de ponerlas a disposición. Por ejemplo, puedes instalar dependencias directamente en la imagen en lugar de instalarlas cuando cada dispositivo se inicie por primera vez.
Cuando prepares las imágenes del SO y del firmware de tus dispositivos, empezarás con una imagen base. Cuando personalizas la imagen base, puedes hacer lo siguiente:
- Producir imágenes de referencia. Las imágenes doradas contienen todas las dependencias en la imagen, por lo que tus dispositivos no tienen que instalar esas dependencias en el primer arranque. Crear imágenes doradas puede ser una tarea compleja, pero permite que tus dispositivos ahorren tiempo y recursos durante el aprovisionamiento y la configuración.
- Produce imágenes en plata. 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 arranque. Producir imágenes silver puede ser menos complejo que producir imágenes golden, pero los dispositivos que ejecutan una imagen silver dedican más tiempo y recursos durante el aprovisionamiento y la configuración.
Puedes personalizar las imágenes del SO y del firmware como parte de tus procesos de integración continua y despliegue continuo (CI/CD), y hacer que las imágenes personalizadas estén disponibles automáticamente en tus dispositivos después de la validación. Los procesos de CI/CD que implementes con una herramienta como Cloud Build, GitHub Actions, GitLab CI/CD o Jenkins pueden realizar la siguiente secuencia de tareas:
- Realiza una validación automatizada de las imágenes personalizadas.
- Publica las imágenes personalizadas en un repositorio donde tus dispositivos puedan obtenerlas.
Si tu entorno de CI/CD y el SO o el firmware para los que necesitas compilar imágenes usan arquitecturas de hardware diferentes, puedes usar herramientas como QEMU para emular esas arquitecturas. Por ejemplo, puedes emular la arquitectura de hardware de la familia ARM en una arquitectura x86_64.
Para personalizar las imágenes de tu SO o firmware, debes poder modificarlas y verificar esas modificaciones en un entorno de prueba antes de instalarlas en tus dispositivos periféricos. Herramientas como chroot te permiten cambiar virtualmente el directorio raíz, pero no físicamente, antes de ejecutar un comando.
Esta práctica recomendada te ayuda a personalizar las imágenes del SO y del firmware antes de ponerlas a disposición de tus dispositivos.
Orquestar de forma fiable las cargas de trabajo que se ejecutan en tus dispositivos
Si tus dispositivos admiten cargas de trabajo heterogéneas, puedes usar las siguientes herramientas para orquestar esas cargas de trabajo y gestionar su ciclo de vida:
- Un sistema de orquestación de cargas de trabajo: usar un sistema de orquestación de cargas de trabajo, como Kubernetes, es adecuado para cargas de trabajo que tienen requisitos complejos de orquestación o de gestió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 orquestación y gestión del ciclo de vida de las cargas de trabajo por tu cuenta. Si tus dispositivos tienen recursos limitados, puedes instalar una distribución de Kubernetes ligera que necesite menos recursos que la canónica, como MicroK8s, K3s o Google Distributed Cloud instalado con el perfil de edge.
Un sistema init: usar un sistema init, como systemd, es adecuado para cargas de trabajo con las siguientes características:
- Requisitos de orquestación sencillos
- Falta de recursos para admitir un sistema de orquestación de cargas de trabajo
- Cargas de trabajo que no se pueden colocar en contenedores
Una vez que tengas un sistema para orquestar tus cargas de trabajo, también podrás usarlo para ejecutar tareas que formen parte de tus procesos de aprovisionamiento y configuración. Si necesitas ejecutar una herramienta de gestión de la configuración como parte de tus procesos de aprovisionamiento y configuración, puedes usar el sistema de orquestación de cargas de trabajo como lo harías con cualquier otra carga de trabajo.
Esta práctica recomendada te ayuda a orquestar las cargas de trabajo que se ejecutan en tus dispositivos.
Verificar, autenticar y conectar dispositivos
Cuando necesites verificar si tus dispositivos deben conectarse a sistemas externos, como otros dispositivos o un backend, ten en cuenta las recomendaciones de las siguientes subsecciones.
Esta práctica recomendada te ayuda a lo siguiente:
- Diseña canales de comunicación seguros para tus dispositivos.
- Evita posibles puertas traseras que eludan el perímetro de seguridad de tus dispositivos.
- Verifica que tus dispositivos no expongan interfaces no autorizadas que un atacante pueda aprovechar.
Prácticas de conexión que se deben aplicar
- Autentica a las otras partes que soliciten información antes de intercambiarla.
- Verifica que la información transmitida no se desplace por canales inesperados.
- Utiliza entornos de ejecución de confianza para gestionar secretos, como claves de cifrado, claves de autenticación y contraseñas.
- Verifica la integridad y la autenticidad de cualquier imagen del SO o del firmware antes de usarla.
- Verifica la validez, la integridad y la autenticidad de cualquier configuración proporcionada por el usuario.
- Limita la superficie de ataque no instalando software innecesario y eliminando el que ya esté en tus dispositivos.
- Limita el uso de operaciones y cuentas con privilegios.
- Verifica la integridad de la carcasa del dispositivo si esta debe resistir la manipulación física.
Prácticas de conexión que se deben evitar
- No transmita información sensible a través de canales sin cifrar.
- No dejes abierto el acceso privilegiado, como los siguientes:
- Puertos serie y consolas serie virtuales o físicos con privilegios elevados, aunque solo se pueda acceder a los puertos si alguien manipula físicamente el dispositivo.
- Endpoints que responden a las solicitudes procedentes de la red y que pueden ejecutar operaciones con privilegios.
- No utilices credenciales codificadas en las imágenes de tu SO o firmware, en la configuración ni en el código fuente.
- No reveles ninguna información que pueda ayudar a un adversario a recopilar información para obtener privilegios elevados. Por ejemplo, debes cifrar 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 código arbitrario.
Monitorizar tus dispositivos
Recoger información sobre el estado de tus dispositivos sin intervención manual es fundamental para la fiabilidad de tu entorno. Asegúrate de que tus dispositivos registren automáticamente todos los datos que necesites. Hay dos motivos principales para recoger y monitorizar datos:
- Para ayudarte a asegurarte de que tus dispositivos funcionan correctamente.
- Para detectar problemas de forma proactiva y realizar tareas de mantenimiento preventivo.
Por ejemplo, puede recoger métricas y eventos de monitorización con Cloud Monitoring.
Para ayudarte a investigar y solucionar problemas, te recomendamos que diseñes e implementes procesos para recoger datos de diagnóstico de alta resolución, como información detallada de monitorización, seguimiento y depuración, además de los procesos que monitorizan tus dispositivos durante su funcionamiento normal. Recopilar datos de diagnóstico de alta resolución y transferirlos mediante una red puede resultar caro en términos de recursos del dispositivo, como computación, almacenamiento de datos y energía eléctrica. Por este motivo, te recomendamos que habilites los procesos para recoger datos de diagnóstico de alta resolución solo cuando sea necesario y solo en los dispositivos que requieran una investigación más exhaustiva. Por ejemplo, si uno de tus dispositivos no funciona correctamente y los datos de monitorización habituales que envía no son suficientes para diagnosticar el problema a fondo, puedes habilitar la recogida de datos de alta resolución en ese dispositivo para que envíe más información que te ayude a investigar las causas del problema.
Esta práctica recomendada asegura que no dejes los dispositivos en un estado desconocido y que tengas suficientes datos para determinar si tus dispositivos funcionan correctamente y cómo lo hacen.
Admite el arranque y las actualizaciones desatendidos
Cuando diseñes tus procesos de aprovisionamiento y configuración, asegúrate de que tus dispositivos puedan iniciarse sin supervisión y de que tengas la infraestructura necesaria. Al implementar un mecanismo de arranque automático que admite tanto el primer arranque como la entrega de actualizaciones inalámbricas, aumentas la capacidad de mantenimiento de tu infraestructura. Si usas el arranque desatendido, no tendrás que atender manualmente cada dispositivo cuando se inicie o se actualice. Gestionar manualmente una gran flota de dispositivos es una tarea propensa a errores, ya que los operadores pueden pasar por alto o realizar acciones incorrectamente, o bien no tener suficiente tiempo para llevar a cabo las acciones necesarias en todos los dispositivos de la flota.
Además, no tienes que preparar cada dispositivo con antelación para iniciar el SO o la imagen de firmware correctos. Puedes lanzar una nueva versión de una imagen de SO o firmware, por ejemplo, y hacer que esa versión esté disponible como una de las opciones que pueden elegir tus dispositivos cuando obtienen sus instrucciones de arranque de la red.
Esta práctica recomendada te ayuda a asegurarte de que tus dispositivos puedan realizar arranques y actualizaciones automáticos y desatendidos.
Diseñar e implementar procesos resilientes
Incluso con procesos de aprovisionamiento y configuración totalmente automatizados, pueden producirse errores que impidan que esos procesos se completen correctamente, lo que dejará tus dispositivos en un estado incoherente. Asegúrate de que tus dispositivos puedan recuperarse de estos fallos implementando mecanismos de reintento y de respaldo. Cuando un dispositivo no puede completar una tarea que forma parte de los procesos de aprovisionamiento y configuración, por ejemplo, debe intentar recuperarse automáticamente de ese error. Cuando el dispositivo se recupera del fallo o vuelve a un estado de funcionamiento, puede reanudar los procesos desde el punto en el que fallaron.
Esta práctica recomendada te ayuda a diseñar e implementar procesos de aprovisionamiento y configuración resilientes.
Admite todo el ciclo de vida de tus dispositivos
Al diseñar los procesos de aprovisionamiento y configuración, asegúrate de que puedan gestionar todo el ciclo de vida del dispositivo. La gestión eficaz del ciclo de vida de los dispositivos incluye la planificación de la finalización y la eliminación, aunque se suponga que los dispositivos van a funcionar durante un periodo relativamente largo.
Si no gestionas el ciclo de vida de tus dispositivos, pueden surgir problemas como los siguientes:
- Costes elevados continuos: si introduces la asistencia para la gestión del ciclo de vida después de que se hayan implementado los procesos de aprovisionamiento y configuración, los costes pueden aumentar. Si planificas esta asistencia al principio del diseño, es posible que reduzcas esos costes. Si tus procesos de aprovisionamiento y configuración no admiten todo el ciclo de vida de tus dispositivos, es posible que tengas que intervenir manualmente en cada dispositivo para gestionar correctamente cada fase de su ciclo de vida. La intervención manual puede ser costosa y, a menudo, no se puede escalar.
- Mayor rigidez: si no se admite la gestión del ciclo de vida, es posible que no puedas actualizar ni gestionar tus dispositivos. Si no tienes un mecanismo para apagar tus dispositivos de forma segura y eficiente, por ejemplo, puede que te resulte difícil gestionar el final de su vida útil y su eliminación definitiva.
Siguientes pasos
- Consulta las arquitecturas de dispositivos conectados en Google Cloud.
- Para ver más arquitecturas de referencia, diagramas y prácticas recomendadas, consulta el centro de arquitectura de Cloud. .
Colaboradores
Autor: Marco Ferrari | Arquitecto de soluciones en la nube