Icono del sitio Disaster Project

K3s: Kubernetes más simple

¿Que es K3s?

K3s ( https://k3s.io/ ) es una solución Kubernetes creada por Rancher Labs ( https://rancher.com/ ) que nos promete fácil instalación, pocos requisitos y un uso de memoría mínimo.

Para el planteamiento de un entorno Demo/Desarrollo esto se convierte en una gran mejora sobre lo que hemos hablado anteriormente en Kubernetes: Crear un entorno mínimo para demos , donde la creación del entorno es compleja y requiere de muchos recursos aunque sea Ansible quien realice el trabajo difícil.

Pasamos a comprobar si es cierto lo que se nos presenta y si podemos incluir las herramientas metallb (https://metallb.universe.tf/) que nos permitirá emular la potencia de los balanceadores de los entornos Cloud y K8dash (https://github.com/herbrandson/k8dash) que nos permitirá un seguimiento de estado de la infraestructura .

Descargar K3s

La configuración de las máquinas virtuales la realizamos de la misma manera que para Kubernetes, con la instalación de dependencias:

#Debian
sudo apt-get install -y ebtables ethtool socat libseccomp2 conntrack ipvsadm
#Centos
sudo yum install -y ebtables ethtool socat libseccomp conntrack-tools ipvsadm

Descargamos la última versión de k3s desde https://github.com/rancher/k3s/releases/latest/download/k3s y la ponemos en /usr/bin con permisos de ejecución en todos los nodos.

Servicios “extras” de K3s

K3s incluye tres servicios “extras” que nos van a cambiar el planteamiento inicial que usamos para Kubernetes, el primero es Flannel ( https://github.com/coreos/flannel) que está integrado en K3s y nos va a realizar toda la capa de gestión de red interna a Kubernetes, aunque no es tan completo en características como Weave (por ejemplo soporte multicast) cumple con ser compatible con Metallb. Una comparación muy completa de proveedores de red de Kubernetes se puede ver en https://rancher.com/blog/2019/2019-03-21-comparing-kubernetes-cni-providers-flannel-calico-canal-and-weave/ .

El segundo servicio es Traefik ( https://traefik.io/ ) que realiza funciones de entrada desde fuera del entorno Kubernetes, es un potente proxy inverso/balanceador con múltiples características que realizará las funciones de red de capa 7 por detrás de Metallb que realizará las funciones de balanceador de capa de red 3.

El último servicio “extra” de K3s es servicelb, que permite dispone de balaceador de carga de las aplicaciones, el problema de este servicio es que trabaja en capa 3 y sobre los mismos puntos que metallb, por lo que no podemos instalarlo.

Instalar Master K3s

En el primer nodo (que será el master) a instalar ejecutamos /usr/bin/k3s server --no-deploy servicelb --bind-address IP_MÁQUINA, si queremos que se realize la ejecución cada vez que se inicie la máquina configuramos un servicio creando el archivo /etc/systemd/system/k3smaster.service

[Unit]
Description=k3s

[Service]
ExecStart=/usr/bin/k3s server --no-deploy servicelb --bind-address 192.168.8.10
Restart=always
StartLimitInterval=0
RestartSec=10

[Install]
WantedBy=multi-user.target

Y ejecutamos

sudo systemctl enable k3smaster
sudo systemctl start k3smaster

Para que se lance K3s e instale el nodo master, al final de la instalación (unos 20 segundos), guardaremos el contenido del fichero /var/lib/rancher/k3s/server/node-token ya que es el código de activación para los nodos (token), es importante ver que está en base64 y para usarlo hay que decodificarlo.

Configurar Metallb

Antes de preparar los nodos procedemos a instalar Metallb y el panel K8dash:

$ sudo mkdir ~/.kube
$ sudo cp -i /etc/rancher/k3s/k3s.yaml $HOME/.kube/config
$ sudo k3s kubectl apply -f "https://raw.githubusercontent.com/danderson/metallb/master/manifests/metallb.yaml"
$ sudo k3s kubectl apply -f "https://raw.githubusercontent.com/herbrandson/k8dash/master/kubernetes-k8dash.yaml"

Debemos observar que para reducir al máximo el espacio, kubectl está incluido dentro del propio ejecutable k3s, lo que lo hace ideal para entornos con muy poco espacio de almacenamiento.

Para activar Metallb le creamos una configuración que tendrá la forma:

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: my-ip-space
      protocol: layer2
      addresses:
      - 192.168.8.240/28

Que al aplicar con k3s kubectl apply -f pool.yml configurará Metallb para que en el caso de que existan servicios con loadBalancer utilicen una de las IPs definidas en el rango especificado, en nuestro ejemplo corresponde a la red definida en inventory.k3s.yml y el rango x.x.x.240 a x.x.x.254.

Para probar dicho cargamos un servicio para acceder a K8dash:

apiVersion: v1
kind: Service
metadata:
  name: k8dashlb
  namespace: kube-system
spec:
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 4654
  selector:
    k8s-app: k8dash
  type: LoadBalancer

Aplicamos k3s kubectl apply -f service.yml y vamos a ver que IPs tienen los servicios activos:

$sudo k3s kubectl get services -A
NAMESPACE     NAME         TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)                      AGE
default       kubernetes   ClusterIP      10.43.0.1      <none>          443/TCP                      32m
kube-system   k8dash       ClusterIP      10.43.183.3    <none>          80/TCP                       31m
kube-system   k8dashlb     LoadBalancer   10.43.86.34    192.168.8.240   80:32324/TCP                 31m
kube-system   kube-dns     ClusterIP      10.43.0.10     <none>          53/UDP,53/TCP,9153/TCP       32m
kube-system   traefik      LoadBalancer   10.43.91.178   192.168.8.241   80:30668/TCP,443:31859/TCP   30m

Vemos por un lado que los servicios marcados como loadBalancer han cogido correctamente las IPs, tanto el que acabamos de configurar, como el servicio Traefik desplegado por K3s.

Instalar nodos K3s

En el resto de nodos ejecutamos /usr/bin/k3s agent --server https://IP_MASTER:6443 --token TOKEN_DECODIFICADO_BASE64, si queremos que la ejecución sea cada vez que se inicie la máquina configuramos un servicio creando el archivo /etc/systemd/system/k3s.service

[Unit]
Description=k3s

[Service]
ExecStart=/usr/bin/k3s agent --server https://IP_MASTER:6443 --token TOKEN_DECODIFICADO_BASE64
Restart=always
StartLimitInterval=0
RestartSec=10

[Install]
WantedBy=multi-user.target

Y ejecutamos para configurar el servicio

sudo systemctl enable k3s
sudo systemctl start k3s

Conclusiones

Si accedemos a la IP de servicio para K8dash obtenida anteriormente y con el token que no da el comando k3s kubectl get secret `k3s kubectl get secret|grep ^k8dash|awk '{print $1}'` -o jsonpath="{.data.token}"|base64 -d (nota: el Ansible al finalizar de ejecutar nos devolverá la IP y el token para acceder) podemos comprobar el funcionamiento de la plataforma:

Por último una pequeña comparación entre kubernetes y k3s en uso de memoria, ambos recién instalados:

Salir de la versión móvil