Anatomía de mi hogar Kubernetes cluster

Hace un año, me di cuenta de que quería crear mi propio clúster de Kubernetes. Soy un programador de sofware. Por lo general, utilizo un clúster local de un solo nodo o un clúster remoto de múltiples nodos para probar mis proyectos. Cuando trabajo con un clúster de un solo nodo, normalmente confío en Minikube , aunque hay otras soluciones, como el proyecto Kind , que pueden emular la presencia de varios nodos en un clúster. El soporte para múltiples nodos puede aparecer en Minikube.

Por lo tanto, me gustaría tener a mi disposición las capacidades de los dos entornos anteriores. Es decir, para que tenga un clúster que consta de varios nodos, y para que trabajar con estos clústeres no implique retrasos en la red típicos para interactuar con entornos remotos. Ya se han escrito muchos tutoriales excelentes sobre la creación de clústeres de múltiples nodos de Kubernetes utilizando computadoras de una sola placa . Muchos de estos manuales usan Raspberry Pi como SBC. Al ver esto, decidí seguir el camino de menor resistencia y también elegí esta computadora. La plataforma Raspberry Pi se ha establecido como una solución económica y asequible.





Cabe señalar que la elección de esta plataforma proporciona algunos compromisos. Por ejemplo, Broadcom y la Fundación Raspberry Pi no licenciaron las extensiones criptográficas ARMv8 (esto es necesario para la aceleración de hardware del soporte AES). Otra solución controvertida es el uso de tarjetas microSD en forma de medio de almacenamiento estándar desde el cual se carga el sistema operativo.

Al analizar las pautas existentes para crear clústeres en computadoras de una sola placa, no encontré ninguna que describa una solución que satisfaga mis requisitos. Comenzaré la historia sobre el grupo que creé con ellos.

Requisitos


  • El clúster debe estar encerrado en una carcasa separada, que se pueda mover, abrir y mantener fácilmente, trabajando con módulos separados del sistema;
  • , . , , . , . , .
  • , .
  • , , , .

Detrás de estos requisitos, hay un objetivo no obvio, que es que necesitaba a mi hija de cuatro años para trabajar con el clúster. Espero que se convierta para ella en una especie de guía de estudio que la ayude a familiarizarse con las computadoras, los comandos y los terminales.

Accesorios


DetalleFuente
Pico 5 Raspberry PI 5S Kit de iniciopicocluster.com
Computadoras de placa única: 2 Raspberry Pi 4B (4GB) 3 Raspberry Pi 3B +
5 tarjetas microSD 32GB clase 10 / A1 raspberrypi.org
Cables Ethernet: 2 0.25m cat. 83 0.15m cat. 7, S / FTP1attack.de
Cables USB PortaPow 20AWG2 Cable USB-C3 Cable micro-USBportablepowersupplies.co.uk
Pantalla táctil oficial de Raspberry Pi 7 ″raspberrypi.org
Fuente de alimentación Dehner Elektronik STD-12090 12V / DC 9A 108Wdehner.net
Convertidor DC-Buck de 12V a 5V 15Adroking.com
Heschen 12V 25A SPST 2-Pin ON/OFFheschen.com
Noctua NF-A4x20 5V PWMnoctua.at
, (15A, 30V) 4 , MOSFET PSMN011-30YLCebay.com
2 M.2 NVMe USB 3.0, JMS58amazon.com
2 Samsung SSD 970 EVO Plus M.2 PCIe NVMe 500 Go
2 USB 3.0 ( , ) 6″/152mmusbfirewire.com
2 USB 3.0- Delock, Male-Female ( 270°)delock.com
Adafruit Raspberry Pi 24″/610mmadafruit.com
Adafruit (DSI CSI) Raspberry Pi adafruit.com
Wago 221wago.com
Lapp Unitronic 300mm/1200mm 2x0.14mm²lappgroup.com
Lemo FGG.0B.302.CLAD42 EGG.0B.302.CLLlemo.com
DuPont Female-Female

La funda PicoCluster es de tamaño pequeño y muy fácil de usar. Del kit de inicio que ordené, usé solo el chasis, incluidos los pestillos y los bastidores, así como el conmutador Gigabit Ethernet de 8 puertos.

Ahora entiendo que sería mejor si PicoCluster vendiera una versión de su kit sin ningún componente eléctrico. Otra alternativa a este kit fue el desarrollo de su propio recinto. Esto, sin embargo, requeriría más tiempo. Tendría que crear dibujos vectoriales, tendría que utilizar los servicios de corte por láser en una empresa que ofrezca láminas acrílicas, idealmente láminas con un revestimiento que disipe la descarga electrostática.

En el curso del trabajo, me encontré con advertencias sobre voltaje insuficientey descubrí que el problema fue causado por cables micro-USB que venían con el estuche. Además, junto con la carcasa, había un convertidor DC-DC reductor de 12V a 5V, 30W, que reemplacé por uno más potente. Hice esto por razones que discutiremos a continuación en la sección sobre alimentación del sistema.

Cuando comencé a trabajar en este proyecto, no planeaba usar las placas Raspberry Pi 4 lanzadas en 2019. Esto explica que todavía tengo tres placas Raspberry Pi 3 que actúan como nodos de trabajo. Cambié otras dos placas por Raspberry Pi 4. Se utilizan para nodos que necesitan más recursos. Este es el nodo principal y el nodo de trabajo, que, entre otras cosas, se utiliza para crear copias de seguridad de datos.

Poco después del lanzamiento de la Raspberry Pi 4, PicoCluster lanzó un nuevo chasis diseñado específicamente para tales placas. Incluye una potente fuente de alimentación, dos ventiladores y un interruptor de alimentación. Es cierto que este caso es más grande que el mío, y los ventiladores seguramente serán más fuertes que el Noctua NF-A4x20. La velocidad de rotación de este ventilador se puede controlar mediante la modulación de ancho de pulso (PWM), teniendo en cuenta los resultados de las mediciones de temperatura realizadas en las placas.

Cabe señalar que tanto el SoC Broadcom BCM2837 (Raspberry Pi 3) como el SoC BCM2711 (Raspberry Pi 4) tienen temporizadores de hardware capaces de generar señales PWM. Como resultado, es muy simple emitir señales de entrada de controlesperado por Noctua NF-A4x20 PWM sin sobrecargar el procesador. Además, el ventilador apenas es audible cuando está funcionando a la mitad de la velocidad que soporta (aproximadamente 2500 rpm). Resultó que esto es suficiente para mantener la temperatura del sistema por debajo de 45 ° C / 113 ° F bajo carga normal.

El nuevo gabinete incluye una fuente de alimentación integrada. Él, además, es más caro que el que yo elegí. Todas estas características de este estuche son la razón por la que elegiría el kit Pico 5S incluso si lo compro ahora. Deben hacerse más esfuerzos para recordarlo, pero lo que resultó al final me parece mejor de lo que hubiera resultado si hubiera elegido un edificio diferente. En general, vale la pena el esfuerzo y el tiempo.

Montaje


▍ Panel frontal



Panel

frontal El panel frontal tiene una abertura para acceder a las tarjetas microSD. Esto es conveniente, incluso teniendo en cuenta el hecho de que planeo organizar el arranque del sistema usando el arranque de almacenamiento masivo USB . Planeo hacer esto justo después de que Raspberry Pi 4 sea totalmente compatible con este modo de arranque. El orificio también ayuda a organizar la circulación del aire en la carcasa. En este caso, dos unidades SSD están ubicadas directamente en frente del ventilador, lo que ayuda a mantener su temperatura de funcionamiento óptima.

Los indicadores de actividad y potencia de los tableros son claramente visibles, lo que le permite evaluar el estado del clúster de un vistazo. Los indicadores de actividad del conmutador Ethernet también son visibles.


El panel superior de la carcasa sin pantalla La

pantalla se puede mover fácilmente para acercarla al teclado o para proporcionar acceso al panel superior al abrir la carcasa.

▍ Panel izquierdo



Panel izquierdo

En el panel izquierdo de la caja se encuentran los puertos GPIO de las placas. Uno de los cables conecta la unidad principal con el ventilador, para organizar el control PWM de su velocidad de rotación. Otro cable conecta el nodo principal al módulo de la placa de circuito, que se utiliza para encender y apagar los nodos de trabajo. Cuatro cables conectan cada uno de los nodos de trabajo al nodo principal. Utiliza pines GPIO con un alto nivel activo cuando está apagado. Esto permite que el nodo principal apague de forma segura la alimentación del nodo de trabajo después de que se complete la secuencia de acciones realizadas al final de su operación.


El módulo utilizado para conectar el ventilador al nodo principal

En la esquina superior izquierda hay un pequeño módulo diseñado para conectar el conector del ventilador Noctua de 4 pines al nodo principal Raspberry Pi. El conector GPIO correspondiente, gracias al soporte de hardware para generar señales PWM, está configurado para controlar la velocidad del ventilador. La velocidad se selecciona en función del análisis de la temperatura de los tableros, cuya información se recopila regularmente utilizando SSH. La unidad principal, además, para fines de monitoreo, lee la velocidad del ventilador.

▍ panel posterior



Panel

posterior El panel posterior del chasis oculta los cables. El hecho de que todo se vea así puede considerarse la consecuencia de un enfoque astuto para la organización modular de mi proyecto. Fue difícil encontrar cables de calidad. Especialmente: cables USB 3.0 cortos con enchufes curvos. Cables: este es el grupo más grande de elementos móviles en mi sistema, deben cumplir con ciertas características mecánicas y eléctricas. Probaron ser la principal fuente de problemas.

Tuve la idea de usar un solo cable en espiral para reemplazarlo con un cable de cinta DSI, con el cual se conecta una pantalla al sistema. Luego, el cable en espiral conectaría la pantalla al clúster y le suministraría energía. Pero no pude encontrar un conector DSI adecuado. Me abstuve de esta aventura y del hecho de que no me atraía la posibilidad de soldar 17 cables de 0.14 mm². Utilicé un extensor de cable DSI y apliqué un cable de alimentación micro USB en espiral de 2 hilos. Esto me dio la capacidad de mover y apagar fácilmente la pantalla sin abrir el estuche.


Intento fallido de organizar los cables

Aquí hay un intento fallido de utilizar el sistema para organizar la entrada de cables en el gabinete diseñado para cables de expansión USB 3.0. A pesar de los innumerables intentos de enrutar correctamente los cables, he encontrado sistemáticamente errores de E / S durante las transferencias de datos. Probablemente fueron causados ​​por el hecho de que se estiraron demasiado al tender los cables, o por el hecho de que esto perjudicó la conexión confiable de los cables a los conectores.

▍ Panel derecho



Panel derecho

En el lado derecho de la carcasa, puede ver el conmutador Ethernet de 8 puertos.

Diseño de sistemas


▍ Comida



Estuche con panel frontal abierto

Tuve que decidir qué fuente de alimentación usar. En particular, sobre qué potencia en vatios debe soportar para satisfacer las necesidades del clúster. Esta es una pregunta acerca de lo que vino antes: una gallina o un huevo, ya que no se pueden hacer mediciones antes de que se aplique energía al grupo.

Para obtener una estimación aproximada de la potencia, recurrí a la documentación oficial , que contiene información sobre la potencia de la Raspberry Pi, así como a las especificaciones de otros componentes. Esto me dio las siguientes cifras aproximadas basadas en el consumo promedio de energía.


Pero lo que sucedió después de tener en cuenta los valores máximos de consumo de energía de la documentación.


Esto fue mucho más alto que la potencia proporcionada por esas fuentes de alimentación que pude encontrar que producían 5V, ya que los componentes de "baja potencia" necesitaban una corriente de 10A. Esto descartó la opción de usar una sola fuente de alimentación de 5V. Al mismo tiempo, las fuentes de alimentación de 12V son muy comunes, lo que puede proporcionar el nivel de potencia necesario. Como resultado, seleccioné la fuente de alimentación Dehner Elektronik STD-12090 12V / DC 9A 108W y la conecté a un convertidor DC / DC de 12V a 5V 75W.

Aquí tenía otra opción, que consistía en usar cinco convertidores menos potentes, uno para cada placa Raspberry Pi, pero esto complicaría en gran medida el diseño del clúster.


Placa de parcheo Una placa de parche de

4 pines basada en el MOSFET PSMN011-30YLC está instalada en la parte inferior del chasis. Se utiliza para habilitar y deshabilitar nodos de trabajo. Tiene la etiqueta 15A, 30V, por lo que se adapta bien incluso con la carga creada por cuatro Raspberry Pi.

Medí la potencia media y máxima consumida por el clúster. Los resultados de la medición son aproximadamente consistentes con los cálculos aproximados que hice anteriormente. La diferencia entre los valores esperados y los reales puede explicarse por las características de la configuración del sistema y las características de la prueba. En particular, apagué Wi-Fi y Bluetooth en mi Raspberry Pi, también funcionan sin mostrar una imagen en el monitor. Esto puede explicar el hecho de que en realidad los valores resultaron ser menores.

Al final resultó que, la fuente de alimentación de 108W es mucho más potente de lo que se necesita para el clúster. Sin embargo, el hecho de que cuente con una fuente de alimentación de este tipo significa que puedo ampliar las capacidades del sistema. Por ejemplo, reemplace Raspberry Pi 3 con Raspberry Pi 4.

▍ Almacenamiento de datos


Una de las nuevas características del Raspberry Pi 4 es la presencia en la placa de dos puertos USB 3.0 que están conectados al BCM2711 SoC mediante una conexión PCIe extremadamente rápida. Gracias a esto, uno puede esperar alcanzar velocidades de datos muy altas. Decidí que estaba usando estos puertos USB 3.0 para conectar SSD usando los adaptadores M.2 NVMe a USB 3.0. Sin embargo, resultó que era muy difícil encontrar tales adaptadores. Sugerí ingenuamente que cualquier adaptador funcionaría para mí. Como resultado, compré el primer adaptador sin verificar su compatibilidad con el Raspberry Pi 4.

Afortunadamente, me encontré con estoRaspberry Pi 4 descargó la guía y luego compró el adaptador Shinestar M.2 NVMe a USB 3.0 recomendado. Era casi del mismo tamaño que el M.2 NVMe 2280 (22 mm de ancho y 80 mm de largo), lo que es ideal para el caso Pico 5S. Utilicé el adaptador para conectar el Samsung SSD 970 EVO Plus M.2 PCIe NVMe 500 Go al Raspberry Pi.


Adaptador M.2 NVMe a USB 3.0

Después de instalar y configurar todo, decidí probar rápidamente la unidad y averiguar la velocidad de transferencia de datos. Para hacer esto, copié un archivo grande del SSD a mi computadora portátil usandoscp:

$ scp pi@master:<source> <destination>
100% 1181MB 39.0MB/s 00:30


El resultado de 39 Mb / s me decepcionó. Estos números están lejos de aquellos necesarios para cargar completamente el conmutador Gigabit Ethernet. Comencé a buscar un posible cuello de botella en el sistema y me di cuenta de que durante la transferencia de archivos, uno de los núcleos del procesador siempre está 100% cargado. Después de descubrir que el procesador era el cuello de botella en la transferencia de datos, descubrí rápidamente que el Raspberry Pi 4 no tiene soporte de hardware AES, ya que Broadcom y la Fundación Raspberry Pi no licenciaron las extensiones criptográficas ARMv8. Curiosamente, el procesador es el cuello de botella del sistema en la Raspberry Pi 4, mientras que los cuellos de botella de la Raspberry Pi 3 eran USB 2.0 e interfaces de red.

Una nueva prueba usando netcat, bajo las mismas condiciones, dio resultados mucho mejores a 104 Mb / s:

$ nc -l 6000 |dd bs=1m of=<destination> & ssh pi@master "dd bs=1M if=<source> | nc -q 0 $(hostname -I | awk '{print $1}') 6000"
[1] 71300 71301
1181+1 records in
1181+1 records out
1238558304 bytes (1.2 GB, 1.2 GiB) copied, 11.8632 s, 104 MB/s
0+740624 records in
0+740624 records out
1238558304 bytes transferred in 14.212518 secs (87145593 bytes/sec)
[1]  + 71300 done       nc -l 6000 |
       71301 done       dd bs=1m of=<destination>

Después de tratar con la primera unidad SSD, conecté la segunda unidad a otra placa Raspberry Pi 4. Voy a usar esta unidad para hacer una copia de seguridad de la primera usando algo como Restic .

Además, planeo usar SSD para organizar el arranque usando el arranque de almacenamiento masivo USB inmediatamente después de que Raspberry Pi 4 sea totalmente compatible con este método de arranque. En comparación con la descarga desde microSD, promete una mayor velocidad y un nivel de rendimiento más estable.

Software


Soy programador, por lo que pensé que sería más fácil para mí tratar con la parte de software del clúster que con otras preguntas. Los resultados del maravilloso trabajo en k3s realizado por el equipo Rancher definitivamente me ayudaron aquí . No entraré en detalles particulares sobre cómo configurar un clúster de Kubernetes en una Raspberry Pi usando k3s aquí. Para aquellos que estén interesados, puedo recomendar consultar esta guía. Estos son los puntos principales para configurar en los que me gustaría detenerme.

Para comenzar, en cada nodo, habilite cgroups:

$ sudo sed -i '$ s/$/ cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory/' /boot/cmdline.txt
$ sudo reboot

Luego instale k3s en el nodo principal:

$ curl -sfL https://get.k3s.io | sh -s - --write-kubeconfig-mode 644
#   
$ sudo systemctl status k3s

Ahora obtenemos un token que autoriza la conexión de los nodos de trabajo al nodo principal:

$ sudo cat /var/lib/rancher/k3s/server/node-token

A continuación, instale k3s en cada nodo de trabajo:

$ curl -sfL https://get.k3s.io | K3S_URL="https://<MASTER_IP>:6443" K3S_TOKEN="<NODE_TOKEN>" sh -
#   
$ sudo systemctl status k3s-agent

Si planea usar el registro interno de imágenes de contenedor, que está instalado de manera predeterminada, es posible que deba configurarlo de una manera especial, haciendo esto para permitir que las containerdimágenes se carguen desde él:

$ sudo sh -c 'REGISTRY=$(kubectl get svc -n kube-system registry -o jsonpath={.spec.clusterIP}); \
cat <<EOT >> /etc/rancher/k3s/registries.yaml
mirrors:
  "$REGISTRY":
    endpoint:
      - "http://$REGISTRY"
EOT'
$ sudo service k3s restart

Planes futuros


En este material, no revelé algunos temas importantes que merecen un análisis suficientemente profundo. Por ejemplo, lo siguiente:

  • Software de gestión de energía de nodos de trabajo y escalado automático de clústeres .
  • Instalar un ventilador PWM y ajustar su velocidad teniendo en cuenta los indicadores de temperatura del sistema.
  • Instale Pi-Hole en Kubernetes usando MetalLB .

Quizás escribiré más sobre esto.

Además, planeo continuar trabajando en el clúster haciendo lo siguiente:


Estoy seguro de que cuando hablé de mi experiencia en la creación del clúster de Kubernetes, me olvidé mucho. Soy programador y estoy acostumbrado a un desglose bastante heterogéneo de tareas grandes en casos más pequeños. La experiencia ha demostrado que el hardware es mucho menos tolerante que el software cuando se trata de trabajo de prueba y error.

En general, cuanto más descubro, la mayor admiración en mí es causada por las modernas tecnologías de hardware y software. Me sorprende cómo el ingenio de una persona fue capaz de combinar fenómenos eléctricos y lenguajes de programación, convirtiéndolos en algo que puede considerarse un ejemplo de cómo la conciencia controla la materia.

¡Queridos lectores! ¿Has intentado hacer algo similar a lo que describió el autor de este artículo?


All Articles