domingo, 26 de noviembre de 2017

Como poner un contenedor LXD en tu misma red local

En esta entrada me gustaría habar de LXD y un problema que considero que es común pero al que no he encontrado una respuesta satisfactoria por ningún lado.
Se trata de como poner un contenedor en la misma red local en la que se encuentra el anfitrión (la máquina sobre la que está montado el LXD).

Antes de nada decir que no explicaré como instalar o configurar LXD, ya que considero que hay literatura de sobras al respecto (y muy buena).
No obstante decir que LXD es una forma "suave" de crear "maquinas virtuales" en linux (dicho pronto y mal).

Al lio.

Método 1: MacVlan

NOTA: Para todos los ejemplos asumiré que existe un contenedor llamado "miContenedor" y que cuenta con una interface llamada "ethContenedor". También asumiré que la máquina anfitriona ("Anfitrión") tiene una interface llamada "ethHost".
NOTA2: También asumiré que el anfitrión es un Debian (o basado en Debian como por ejemplo Ubuntu) sin ningún gestor de redes como "network-manager" que inhabilite el fichero "/etc/network/interfaces".

Cuando queremos poner un contenedor en nuestra misma red local, se nos aconseja añadir una interface de tipo "macvlan". Este sería el comando para hacer dicha tarea:
 lxc network attach ethHost miContenedor ethContenedor

Con eso ya tendríamos el contenedor en la misma red local que el anfitrión utilizando el DHCP que tenga la propia red. Así de simple. El resultado podéis verlo en la imagen siguiente.



Ahora, esto tiene un gran "Pero...".
Si deseas comunicar el anfitrión con el contenedor por esa interface, simplemente no puedes. En el momento en el que creas una macvlan, anfitrión y contenedor quedan incomunicados por esa interface. El resto de dispositivos de la red podrán ver a ambos.
Por tanto según el esquema de antes, "otroEquipo" podría ver a todos los equipos de la red, pero "miContenedor" no podría ver a "Anfitrión" y viceversa.
Si esta limitación no te importa, este es el mejor procedimiento para meter tu contenedor en tu misma red local, así que no necesitas seguir con el post.

Una forma de soslayar el problema es tener 2 interfaces entre anfitrión y contenedor, de tal forma que comuniques por una con la red local y por la otra con el anfitrión. Otra forma, es usando un puente.

Método 2: Puente

Otra forma de conseguir meter al contenedor en la misma red local sin limitaciones, es hacerlo a través de un puente virtual. De tal manera que tendríamos un escenario como el de la siguiente imagen.

Como se aprecia, ambas máquinas, anfitrión y contenedor están conectados al mismo puente virtual, de tal forma que no hay problemas de conectividad.

Para llegar a esto, haremos 2 cosas. La primera quitar la configuración de red a la interface por la que se comunica la maquina anfitriona y pasarla al puente. Supongamos que la maquina tiene la siguiente configuración:
ip -4 addr show
 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
   inet 127.0.0.1/8 scope host lo
     valid_lft forever preferred_lft forever
 3: ethAnfitrion: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
   inet 192.168.1.3/24 brd 192.168.1.255 scope global ethAnfitrion
     valid_lft forever preferred_lft forever
 4: lxdbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
   inet 10.137.142.1/24 scope global lxdbr0
     valid_lft forever preferred_lft forever

Bien, pues tendríamos que configurar nuestro fichero de "/etc/network/interfaces" algo así:
Nota: omitiré la de "lo" y "lxdbr0" (si está) ya que no hay que tocarlas:
auto ethAnfitrion
allow-hotplug ethAnfitrion
iface ethAnfitrion inet manual

auto mibr0
iface mibr0 inet static
    address 192.168.1.3/24
    gateway 192.168.1.1
    bridge_ports ethAnfitrion
    dns-nameservers 8.8.8.8 8.8.4.4

Ahora para hacer los cambios efectivos sin reiniciar, hay dos formas:
Reiniciando los servicios de red:
sudo service networking restart

O la que me parece más correcta. Crear el puente a mano.
Primero eliminamos la ip de la interface anterior:
sudo ip address flush dev ethAnfitrion

Ahora creamos el puente y agregamos la interface:
sudo ip link add name mibr0 type bridge
sudo ip link set mibr0 up
sudo ip link set dev ethAnfitrion master mibr0

Finalmente restablecemos la ip:
sudo ip address add 192.168.1.3/24 dev mibr0

Si por algún motivo no salimos a internet, tal vez sea necesario restablecer la puerta de enlace:
sudo ip route delete default
sudo ip route add default via 192.168.1.1


Si todo ha ido bien, ahora nuestra configuración tendría que quedar algo así:
ip -4 addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
  inet 127.0.0.1/8 scope host lo
    valid_lft forever preferred_lft forever
4: lxdbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
  inet 10.137.142.1/24 scope global lxdbr0
    valid_lft forever preferred_lft forever
5: mibr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
  inet 192.168.1.3/24 brd 192.168.1.255 scope global br0
    valid_lft forever preferred_lft forever

Si os fijáis, "ethAnfitrion" no aparece en la lista. Esto es normal, ya que ahora no tiene dirección IPv4. Si se quiere ver todas las interfaces independientemente de si tienen o no dirección, hay que ejecutar:
ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    valid_lft forever preferred_lft forever
3: ethAnfitrion: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master mibr0 state UP mode DEFAULT group default qlen 1000
    link/ether 00:12:34:56:78:9A brd ff:ff:ff:ff:ff:ff
4: lxdbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/ether 12:51:0d:22:19:6c brd ff:ff:ff:ff:ff:ff
5: mibr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether A0:98:76:54:32:10 brd ff:ff:ff:ff:ff:ff

Meter el contenedor en la red

Con la red ya configurada, solo queda el paso final. Para ello solo hay que ejecutar:
lxc network attach mibr0 miContenedor ethContenedor

Y eso es todo. Espero que si has llegado hasta aquí esto te sea de utilidad.
Si tienes dudas o encuentras errores, te invito a comentar.

Un saludo!

miércoles, 8 de marzo de 2017

Yo (no) Robot. (El problema de los Robots).

Desde hace años me ronda la cabeza una cuestión a la que Bill Gates le dio "solución" hace unos días. Esa cuestión es el tema de la mano de obra robot.

Antes de seguir, me gustaría aclarar el concepto de robot, ya que creo que hay mucha gente que tiene un concepto desacertado sobre ellos.
Ha de entenderse un robot no como un individuo, un ente o entidad capaz de realizar una tarea cualquiera de forma autónoma y sobre todo de forma independiente. Hay que sacarse de la cabeza el estereotipo de robot humanoide que se nos presentan en novelas como "Yo Robot" o películas como "Autómata" o "Terminator". Un robot es mucho más que eso. Es una maquinaria que generalmente es de propósito específico capaz de realizar una o varias tareas concretas de forma extremadamente precisa y eficiente. Puede tratarse de un ordenador que recomiende viajes, un coche que se desplace solo, un brazo que realice soldaduras en una fabrica de coches, etc.

Echando la vista atrás, desde los tiempos de la revolución industrial, la maquinaría ha ido desplazando el trabajo humano. Primero fueron las fabricas textiles y ahora son los taxis y vehículos de reparto. Este desplazamiento se debe a que las maquinas pueden realizar el mismo trabajo que una persona de forma más rápida y precisa. Este hecho está llevándonos a una situación inevitable en la que la gran mayoría de trabajos serán remplazados por robots.

Cuando imaginamos un futuro en el que vivir, a todos nos gusta pensar en una sociedad utópica en la cual no hay que trabajar ya que todo el trabajo lo realizan los robots. Y creo que este futuro poco a poco se acerca, pero no como nos gustaría.
Si en una empresa trabajan 100 personas de las cuales 90 son reemplazadas por robots, son 90 sueldos que se ahorra la empresa.
También se puede ver esto desde otra perspectiva:
Si en una empresa trabajan 100 personas de las cuales 90 son reemplazadas por robots, son 90 personas menos que dejan de recibir un salario.
Si juntamos esto, nos topamos en este ejemplo con una sociedad en la cual solo el 10% de las personas tienen acceso al dinero existente, lo cual hace que la sociedad utópica que comentaba antes, deja de ser utópica.

Para solucionar esta desigualdad, Bill Gates propone algo muy razonable. Que los robots paguen impuestos.

Pienso que no sería acertado decir que los robots paguen impuestos, ya que los robots no son personas y no pueden pagarlos, pero sí las empresas que los controlan. También es evidente que no pueden ser pagados de la misma manera en la que lo haría un trabajador, ya que un robot podría realizar la tarea de uno o más operarios. Según lo veo yo, tendría que tratarse de un impuesto tecnológico a la empresa, en el cual, el porcentaje de ese impuesto tendría que ir determinado por el volumen de trabajo realizado por robots.
Como se ve es una medida sencilla que asegura un mínimo reequilibrio social. Sin embargo es un equilibrio ficticio, ya que los impuestos irían a parar al estado, y eso significa que no necesariamente las personas ven ese dinero. Por ejemplo ¿Qué haría el estado si de pronto se encuentra con un presupuesto mayor para sanidad? Pues en el mejor de los casos, gastar más en sanidad. Pero ¿Y si necesito un coche, una tablet o unas vacaciones en Cancun? ¿Va a pagar el estado esos? Rotundamente no.

Como se ve, según este planteamiento, una sociedad "ideal" donde los trabajos estén 100% automatizados no resultaría para nada beneficiosa para las personas.

A modo de opinión, creo que este problema tiene muy mala solución dentro del mundo capitalista tal y como lo conocemos. No es posible tratar de repartir la riqueza entre la población sin que salgan sentimientos como "caridad" o "parasitismo". Algo que considero muy negativo.
No parece justo que cada vez más gente pierda su empleo, o mejor dicho, su acceso a un salario, cuando la industria siguen avanzando a la vez que reduce sus puestos de trabajo.

Esta entrada está un poco fuera de lo que esperaba para este blog, pero me parecía interesante ponerla como reflexión.