Entrada

Kubernetes selfhosted con K3s

Instalación y configuración de Kubernetes de K3S en un entorno local

Kubernetes selfhosted con K3s

La presente es una guía práctica de como instalar un entorno totalmente funcional de Kubernetes utilizando k3s.io. La idea es poder contar con un cluster de k8s en donde instalar aplicaciones y servicios en el HomeLab, de momento será una instalación Standalone, es decir, sin alta disponibilidad (HA).

Setup

  • Un Hipervsor, en mi caso utilizaré Proxmox
  • Una imágen de un Linux a gusto de cada uno, en mi caso utilizaré Rocky Linux
  • Contar con direcciones IP disponibles en la red para la asignación del load balancer en k8s

Instalación K3s

Para instalar k3s utilizaré su script de instalación que puede ser encontrado en Quick-Start Guide.

1
curl -sfL https://get.k3s.io | sh -

Ejecutando este comando ya tendríamos instalado Kubernetes en nuestro nodo Linux y como buscamos una instalación Standalone, es todo lo que necesitamos.

Posteriormente, necesitaremos el archivo kubeconfig que se encuentra en la ruta /etc/rancher/k3s/k3s.yaml. Debería verse similar a esto.

Utilizaremos el contenido para autenticar contra Kubernetes.

Configuración kubectl

Luego, necesitaremos instalar kubectl para interactuar con la API de Kubernetes si es que no lo tenemos. En mi caso estoy desde un host Windows y lo instalaré utilizando Chocolately.

1
choco install kubernetes-cli

Una vez instalado tendremos que copiar el contenido del archivo /etc/rancher/k3s/k3s.yaml al host Windows y depositarlo en %HOME%\.kube\config.

En mi caso particular, quedaría en C:\Users\Cervant\.kube\config

.

Al copiar el contenido, es importante modificar la dirección IP del server, ya que probablemente estemos contactando a la API desde un host externo y nos arrojará error si dejamos la loopback (127.0.0.1) como viene por defecto. Esta nueva IP debe ser la del Linux en donde se instaló k3s.

A continuación se debe configurar la variable de entorno, para ello podemos hacerlo de dos formas:

Utilizando GUI

Settings > System > About > Advanced system settings > Environment Variables

Se debe crear como system variable.

Desde Powershell (Administrator)

1
[System.Environment]::SetEnvironmentVariable("KUBECONFIG", "C:\Users\Cervant\.kube\config", [System.EnvironmentVariableTarget]::Machine)

Una vez seteada la variable, desde una terminal nueva validar que todo funcione correctamente, listando -por ejemplo- los nodos.

Instalación MetalLB

Con el clúster de Kubernetes ya en funcionamiento, procederemos a instalar MetalLB. Esta herramienta nos permitirá habilitar el uso de balanceadores de carga, algo necesario porque, en un entorno fuera de la nube, no contamos con un servicio que asigne direcciones IP automáticamente a estos balanceadores. MetalLB cubre esa función, proporcionando las IP necesarias para exponer nuestros servicios.

Para instalar MetalLb solo deberemos seguir la documentación. En este caso lo instalaré directamente con el manifiesto pero también se puede hacer a través de Helm o Kustomize.

Luego de instalarlo, deberemos crear un IPAddressPool que nos permitirá definir el rango de direcciones IP que queremos disponibilizar.

Si revisamos en Custom Resources dentro del namespace metallb-system veremos que no existe ninguna definición creada.

Con el siguiente manifiesto crearemos un pool que entregará direcciones IP entre el rango 192.168.1.200 y 192.168.1.220.

1
2
3
4
5
6
7
8
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: cheap
  namespace: metallb-system
spec:
  addresses:
  - 192.168.1.200-192.168.1.220
1
kubectl apply -f .\ip-address-pool.yml

Otra cosa que deberemos crear es un L2Advertisement, necesario para que MetalLb pueda anunciar estas IPs.

1
2
3
4
5
6
7
8
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: l2-advertisement
  namespace: metallb-system
spec:
  ipAddressPools:
    - cheap
1
kubectl apply -f .\l2-advertisement.yml

Creación Load Balancer

Por último, crearemos un deployment de Nginx con 2 replicas y un Servicio tipo Load Balancer para verificar que todo esté funcionando. Utilizaré este manifiesto

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-loadbalancer
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: LoadBalancer

Desplegaremos esto en el namespace blog.

1
kubectl apply -f .\nginx.yml -n blog

Al verificar el servicio vemos que en la columna EXTERNAL-IP se le asignó una IP dentro del rango definido.

Desde la red interna, si consulto esta IP se mostrará el deployment de Nginx.

Construye, automatiza, repite. ¡Nos vemos en el próximo post!

Esta entrada está licenciada bajo CC BY 4.0 por el autor.