Kubernetes selfhosted con K3s
Instalación y configuración de Kubernetes de K3S en un entorno local
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!