LACNIC31 – dia 3

LACNIC31 – dia 3

Oficialmente LACNIC31 inicia el día de hoy con varios eventos de “rendición de cuenta” diría yo. La lista de estos eventos se puede encontrar en: https://www.lacnic.net/3635/49/evento/agenda-lacnic-31#martes-lacnic

Donde quiero que se enfoquen es en el Keynote, Radia Perlman ha tenido a cargo esta parte del inicio, y personalmente hacia muchos anos que no prestaba atención a alguien hablar como a esta señora, aun mejor cuando he investigado y leído que ha sido la creadora del Spanning Tree Protocol y grandes contribuciones como link-state routing protocols del cual se derivan tales como el protocolo de enrutamiento IS-IS y OSPF.

La presentación es mayormente una recopilación de acontecimientos y decisiones hechas en torno al desarrollo o colaboración en nuevas tecnologías.

Para los que se la perdieron en la transmisión en vivo, el STAFF de LACNIC ya ha publicado el video!

https://www.youtube.com/watch?v=0DcogUv4NNM&feature=youtu.be

nota: si quieren entender mejor como funciona spanning tree, prestarle atención al poema, epico!!

Foro público de políticas

Muy importante sección esta, se discutieron varias políticas que actualmente tiene el estado = DISCUSION. Como comenté en el post anterior, espero poder integrarme a este tipo de aportes porque me interesa mucho que los cambios necesarios sean realizados y así todos saldremos beneficiados.

El día de mañana promete mucho y tendrá más sesiones técnicas que los anteriores!!!

 

LACNIC31 – dia 2

LACNIC31 – dia 2

¡Seguimos sacándole provecho a este evento!

El día de hoy ha sido completo de IPv6, hemos tenido un refresh de que es IPv6 y de planes de direccionamiento, una de las partes más interesantes fue de los mecanismos de transición disponibles actualmente, en esta sección vimos los pro y contras de algunos de estos y las recomendaciones.

Mecanismos de transición IPv6-only y IPv4aaS en redes fijas y móviles.

https://www.lacnic.net/innovaportal/file/3512/1/ipv6-only_v13.pdf

Si le pegamos una mirada a la presentación de Jordit Palet podremos ver varias comparaciones y recomendaciones para ayudarnos al momento de seleccionar unas de estas tecnologías.

Una cosa esta clara, NAT64 tiene demasiados temas pendientes.

Teniendo en cuenta todo lo bueno que se hablo de 464XLAN este parece ser el ganador indiscutible, no crean mucho de lo que escribo con relación a esta implementación ya que no la he usado y pretendo subir unos laboratorios relacionado a estos métodos de transición.

IPv6 en Cable

Otro tema discutido en el día de hoy fue con relación a despliegues en un operador de Cable, muchas de las decisiones realizadas en este despliegue se pueden extrapolar a una implementación de otro tipo, por ejemplo, una implementación Wireless teniendo en cuenta que se debe tener control de CPE y que este soporte CLAT o dual-stack en el mejor de los casos.

https://www.lacnic.net/innovaportal/file/3512/1/lacnic-31—tutorial-ipv6-en-redes-de-cable-v2.pdf

 

Demo con conexión a internet de Jool/464XLAT.

Para cerrar el día nos han presentado una herramienta desarrollada por NIC México la cual nos permite implementar una plataforma con mecanismo de transición de IPv4/IPv6 de una manera rápida y fácil.

Robándome un poco de la página oficial del proyecto:

Jool is an Open Source implementation of IPv4/IPv6 Translation on Linux. Until version 3.2.x, it used to be only a Stateful NAT64; starting from 3.3.0, it also supports SIIT mode.

Si miramos en las implementaciones de transición soportadas vemos que sobre sale:

RFC 6877 464XLAT Rather implemented as SIIT-DC-DTM; see below.

Realizamos varios laboratorios los cuales se pueden encontrar en la diapositiva publica de la sesión:

https://www.lacnic.net/innovaportal/file/3512/1/jool.lacnic.31.pdf

Voy a probar esta solución en mi ambiente de enrutamiento virtual basado en EVE-ng para entender mejor como esta plataforma encajaría en una red empresarial y las ventajas que nos brindaría.

LACNIC31 – dia 1

LACNIC31 – dia 1

Iniciando con mi primera asistencia a este evento, hoy todo ha ido muy tranquilo.

Llegada al hotel, registro al evento y asistencia a la Sesión para Becados. La sesión fue muy interesante y saber que aplicaron casi 500 personas para asistir como becados a LACNIC31, de los cuales solo se seleccionaron 38 (conté la lista en lacnic.net) y saber que he sido uno de ellos me emociona mucho, y esa es la razón por la cual verán posts relacionados a LACNIC31 toda esta semana.

Luego de terminar la Sesión para Becados, me quede para la segunda sesión del día que fue relacionada a las políticas que se van a discutir en esta semana.

Es importante participar de las discusiones de políticas en LACNIC, aunque no lo he hecho anteriormente pretendo activarme en lo que a esto respecta para cambiar algunas cosas que personalmente no me gustan de cómo funciona la asignación de direcciones en LACNIC, eso es un tema para otro post.

Aquí esta la lista de políticas que están para discusión, si les interesa claro.

https://politicas.lacnic.net/politicas/list?state=ENDISCUSION

Kubernetes en premisa con MetalLB en modo BGP.

Kubernetes en premisa con MetalLB en modo BGP.

Una de las desventajas de tener un cluster de k8s en premisa es la falta de LoadBalancer. Gracias a MetalLB esto está resuelto de una manera fácil y elegante.

Cuando queremos publicar servicios en k8s, lo hacemos usando un Ingress Controller (nginx o Traefik por nombrar algunos). Este servicio se apoya de las direcciones IP de los hosts si no tenemos LoadBalancer. El tema se complica cuando queremos publicar servicios que no son HTTP o HTTPS, sé que nginx puede publicar otros protocolos. La ventaja de un IP via LoadBalancer es que podemos usarlos en varios servicios (pods) y publicar cualquier puerto en TCP o UDP.

MetalLB

Los requerimientos son los siguientes:

  • Un cluster de k8s en la versión 1.9.0 o más reciente y que no tenga un tipo de LoadBalancer en funcionamiento, esto quiere decir que tendríamos problemas usando esta solución en GKE por ejemplo.
  • Una configuración de cluster que pueda coexistir con MetalLB https://metallb.universe.tf/installation/network-addons/
  • Direcciones IPv4 para asignar usando este servicio.
  • Dependiendo del modo operativo, podríamos necesitar un router que soporte BGP.
  • https://metallb.universe.tf/#requirements

En mis primeras pruebas, MetalLB fue configurado usando Layer2 (capa 2), es la forma más rápida de probar esta solución, después de varios días de desplegar aplicaciones que hacían uso de LoadBalancer me di cuenta de que algunas direcciones IP de momento no respondían a las peticiones ARP que son necesarias para alcanzar dicha dirección IP. Por esta razón ahora desplegare MetalLB usando BGP.

En modo BGP, la configuración es más extensa y cuanta con campos que tendrán sentido si se ha usado BGP anteriormente.

En mi caso, ya tengo algo de experiencia usando este protocolo y por eso decidí cambiar de Layer2 a BGP en lugar de buscar una solución al problema descrito anteriormente. Además, mi router de core soporte BGP.

Configuración en Mikrotik RouterOS.

Debemos preparar el router (o en su defecto un Switch con L3 & BGP) para aceptar sesiones BGP desde los nodos de k8s, MetalLB ejecutara un agente en todos los nodos de k8s y estos iniciaran una sesión BGP con nuestro router.

Configuración básica en RouterOS – CLI:

/routing bgp instance
set default as=64635 redistribute-connected=yes redistribute-static=yes router-id=10.45.254.2
/routing bgp peer
add multihop=no name=kube1 remote-address=172.22.35.25 remote-as=64636 ttl=default
add multihop=no name=kube2 remote-address=172.22.35.26 remote-as=64636 ttl=default
add multihop=no name=kube3 remote-address=172.22.35.27 remote-as=64636 ttl=default

 

Instalando MetalLB.

kubectl apply -f https://raw.githubusercontent.com/google/metallb/v0.7.3/manifests/metallb.yaml

También se puede instalar usando Helm, para más información: https://metallb.universe.tf/installation/

Revisamos nuestro entorno k8s para validar que tenemos los componentes de MetalLB en un correcto estado.

¡Excelente! Tenemos tres speaker, uno en cada nodo.

Configurando MetalLB.

Necesitamos un kind tipo ConfigMap para aplicar la configuración deseada a MetalLB.


apiVersion: v1

kind: ConfigMap

metadata:

namespace: metallb-system

name: config

data: config: |

peers:

- peer-address: 172.22.35.1

peer-asn: 64635

my-asn: 64636

address-pools:

- name: default

protocol: bgp

addresses:

- 172.22.35.64/26

bgp-advertisements:

- aggregation-length: 32

localpref: 100

communities:

- name: public

protocol: bgp

addresses:

- 200.1.154.64/26

auto-assign: false

bgp-advertisements:

- aggregation-length: 32

localpref: 100

communities:

Aplicamos el configMap:

Si todos nuestros parámetros son correctos, revisamos en el core router y debemos tener las sesiones BGP establecidas.

¿Qué tenemos?

En este punto deberemos contar con la opción de seleccionar una dirección IP, en mi caso podría ser del pool llamado default o del pool llamado public, se puede diferenciar que las IP del pool llamado public son ruteables y existen en la tabla de Internet (200.1.154.0/24).

Vamos a inicializar un pod que haga uso de una dirección del pool default. Para esto usare un contenedor con un servicio de SMTP el cual no necesita almacenamiento.

Deployment + Service

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
labels:
app: smtp
name: smtp
spec:
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: smtp
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: smtp
spec:
containers:
- env:
- name: RELAY_NETWORKS
value: 172.22.35.0/24:10.45.0.0/16:200.1.154.0/24
image: namshi/smtp
imagePullPolicy: IfNotPresent
name: smtp
ports:
- containerPort: 25
name: smtp-port
---
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
app: smtp
name: smtp
annotations:
metallb.universe.tf/allow-shared-ip: ekvm
metallb.universe.tf/address-pool: default
spec:
externalTrafficPolicy: Local
ports:
- name: smtp
nodePort: 25
port: 25
protocol: TCP
targetport: smtp-port
selector:
app: smtp
loadBalancerIP: 172.22.35.70
type: LoadBalancer</pre>

¡Excelente!

¡Nuestro servicio de SMTP responde en el IP asignado por MetalLB!

El próximo paso es el almacenamiento.

Kubernetes – montándonos un entorno de pruebas y producción – homeLAB – Parte2

Kubernetes – montándonos un entorno de pruebas y producción – homeLAB – Parte2

Hace unos meses escribí como iniciaba un entorno k8s en casa para hacer pruebas y entender las ventajas de esta nueva plataforma que está revolucionando la forma en que manejamos contenedores.

En mi primer intento me auxilie de varios Raspberry Pi los cuales son excelentes para pequeños procesos y pruebas, lamentablemente en mi caso no me gustó mucho el resultado. En un segundo intento, use la distribución de Rancher junto a su plataforma de administración que permite provisionar un cluster ya sea en premisa o en la nube, en todos mis intentos lo hice en premisa ya que no cuento con un presupuesto para pagar horas en Amazon o Google.

En esta “segunda parte” he llegado mucho más lejos y con mejores resultados, digamos que ahora me he tomado más tiempo para entender cómo se conectan las partes y he decidido administrar k8s sin ningún front-end. Esta vez no he usado RPi, todo se ha instalado en Ubuntu 16.04 con la distribución de Rancher llamada RKE (Rancher Kubernetes Engine). https://github.com/rancher/rke

Rancher Kubernetes Engine, an extremely simple, lightning fast Kubernetes installer that works everywhere.

Esta es la descripción del Proyecto en Github, se puede decir que es una de las maneras más rápidas de tener un cluster de k8s, al menos que yo he probado hasta el momento.

BOM:

  • 3 Ubuntu Servers 16.04 – en mi caso, estos son tres máquinas virtuales.
  • 1 Management server – Otra VM con Ubuntu, no necesariamente debe ser la misma versión que los nodos del cluster.
  • Un rango de direcciones IP para MetalLB.

Instalando RKE:

Primero debemos revisar cumplimos con el Node Requriments. Rancher tiene una tabla con las recomendaciones de OS, hardware y Networking.

https://rancher.com/docs/rancher/v2.x/en/installation/requirements/

Luego procederemos a preparar el equipo que usaremos para levantar el cluster de RKE.

https://rancher.com/docs/rke/v0.1.x/en/installation/

En mi caso fue descargar el binario para Linux y colocarlo en mi PATH, crear un cluster configuration file, este archivo puede tener cualquier nombre, para simplificar los pasos le pondremos cluster.yml igual que la documentación de Rancher.

En este archivo [cluster.yml] colocaremos la información de los nodos que usaremos para formar el cluster, antes de poder lanzar este proceso debemos cumplir con algunos pasos.

  1. En la maquina usada para administración necesitamos contar con SSH keys, desplegar este key en los nodos del cluster, RKE no envía password para hacer login a estos nodos, por esta razón debemos tener ssh-passwordless.
  2. Docker ya instalado y el usuario que cuenta con los keys de SSH en el grupo de Docker.

La forma más rápida de cumplir con este paso es usando un script ya preparado para realizar esta tarea, este script es oficialmente soportado por Rancher.

https://rancher.com/docs/rke/v0.1.x/en/os/

curl https://releases.rancher.com/install-docker/17.03.sh | sh
  1. Tener las herramientas necesarias en la máquina de administración, una de ellas es kubelet. En el caso de Ubuntu se instala como cualquier otro paquete usando APT.

En la siguiente imagen se puede apreciar el mensaje final del script para instalar Docker versión 17.03.

Ya podemos continuar con la preparación del cluster.yaml. Yo he usado uno bastante sencillo:

Ejecutando RKE para inicializar el cluster.

rke up –config rancher-cluster.yml

Al finalizar este proceso, tendremos un mensaje como:

Para probar que nuestros nodos responden y que tenemos un cluster de k8s, copiamos el archivo resultante de la operación anterior [kube_config_rancher-cluster.yml] a la ubicación por defecto usada por kubectl.

cp kube_config_rancher-cluster.yml ~./kube/config

Una alternativa cargarlo en la variable KUBECONFIG:

export KUBECONFIG=$(pwd)/kube_config_rancher-cluster.yml

Hacemos un kubectl get nodes:

… Houston, we have a cluster.

Alguien preguntara: ¿Ya témenos un cluster, ahora que hacemos con él?

En el estado actual, se pueden desplegar aplicaciones que no hagan uso de almacenamiento persistente (no me gusta el hostPath) y que hagan uso del host IP ya que no tenemos un LoadBalacer instalado. Para el próximo articulo estaré desplegando dos soluciones para que nuestro cluster se parezca más a un GKE o un EKS.