- INFO
-
En Internet hay ahora mismo muchos post mejores que este sobre cómo instalar y desplegar apliaciones en k3s, pero pocos en español y sobre todo actualizados a la última versión
v1.21.5+k3s2
K3s es la distribución ligera de kubernetes de Rancher (https://rancher.com/docs/k3s/latest/en/)
Es super fácil de instalar (al menos en Linux):
curl -sfL https://get.k3s.io | sh -
y si tienes ya instalado kubectl
, el comando docker de kubernetes, puedes desplegar aplicaciones simplemente configurando tu variable de entorno KUBECONFIG=/etc/rancher/k3s/k3s.yaml o importando el fichero a tu $HOME/.kube/config
- INFO
-
puedes tener múltiples clusters, usuarios, etc en tu fichero .kube/config, por ejemplo apuntando a tu recien instlado k3s y además a tu cluster en Okteto y/o diferentes namespaces. Simplemente cuando ejecutes el comando
kubectl
tienes que indicarle el contexto contra el que ejecutarse
Objetivo
Desplegar un simple "hello-world" en el cluster (de una sóla máquina) y poder acceder a ella mediante algo parecido a "http://localhost:xxxx/hello-world"
Una vez conseguido podremos continuar desplegando otras aplicaciones en diferentes rutas de tal forma que podamos ofrecer a los usuarios de nuestra red un único sitio en el que encontrar las aplicaciones si tener que andar preocupandonos por puertos, etc y a la vez tener un sitio centralizado donde desplegarlas
- WARNING
-
Una vez instalado k3s en mi local estuve leyendo multitud de post sobre cómo hacer que la aplicación tuviera su ruta y prácticamente todos hablaban de desinstalar
traefik
e instalar una versión nueva que lo permitía. El caso es que la versión actual de k3s YA LA INCLUYE y no hay que hacer nada , sólo "atinar" con la configuración correcta
Para esta prueba vamos a desplegar una aplicacion WhoAmI
que simplemente devuelve información sobre el container donde está corriendo, para lo que usaremos la imagen containous/whoami:latest
Para ir paso a paso voy a usar diferentes ficheros de despliegue pero puedes "juntarlos" todos en uno sólo y desplegarlo en un sólo paso
Deployment
En este fichero describimos la aplicacion que queremos desplegar (en nuestro caso la imagen mencionada anteriormente)
deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: whoami-deployment
labels:
app: whoami
spec:
replicas: 3
selector:
matchLabels:
app: whoami
template:
metadata:
labels:
app: whoami
spec:
containers:
- name: whoami
image: containous/whoami:latest
ports:
- containerPort: 80
En este ejemplo vamos a correr 3 replicas (por probar)
kubectl apply -f deployment.yml
kubectl get pods
NAME READY STATUS RESTARTS AGE
whoami-deployment-67446995f4-ccfjv 1/1 Running 1 2m
Service
Si todo ha ido bien, nuestros pods están corriendo en el cluster pero no se pueden acceder a ellos, para lo que desplegamos un servicio:
service.yml
apiVersion: v1
kind: Service
metadata:
name: whoami-service
spec:
selector:
app: whoami
ports:
- protocol: TCP
port: 80
targetPort: 80
Fijate cómo enlazamos el nombre del deployment whoami
con el selector, así como mapeamos los puertos
kubectl apply -f service.yml
kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.43.0.1 <none> 443/TCP 37h
whoami-service ClusterIP 10.43.110.224 <none> 80/TCP 2m
Con este servicio k3s nos crea una IP y un puerto con el que poder acceder a nuestros pods, pero lo que queremos es no tener que manejar tantas IPs y puertos, así que lo que necesitamos es definir una ruta en nuestro cluster que nos permita crear una ruta hacia nuestro servicio
Ingress
Precisamente, mediante este fichero, le podemos decir a k3s que haga ese routeo.
- INFO
-
Esta configuración usa la última versión que es precisamente lo que no encontraba en todos los post que trataban el tema
ingress.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: whoami-ingress
spec:
rules:
- http:
paths:
- path: /quiensoy
pathType: Prefix
backend:
service:
name: whoami-service
port:
number: 80
Aplicando este fichero le estamos diciendo a k3s (en realidad a traefik que es el encargado de realizar el routeo) que las peticiones a /quiensoy
las rediriga al serviciowhoami-service
Una vez aplicado el fichero podemos navegar a
y la página nos contestará algo como:
Hostname: whoami-deployment2-746cf888d5-ss2f9
IP: 127.0.0.1
IP: ::1
IP: 10.42.0.58
IP: fe80::80af:5dff:fe12:6e48
RemoteAddr: 10.42.0.43:51310
GET /quiensoy HTTP/1.1
Host: 192.168.1.126
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:94.0) Gecko/20100101 Firefox/94.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
X-Forwarded-For: 10.42.0.1
X-Forwarded-Host: 192.168.1.126
X-Forwarded-Port: 80
X-Forwarded-Proto: http
X-Forwarded-Server: traefik-97b44b794-8xfp7
X-Real-Ip: 10.42.0.1
Fijate, que como desplegamos varias réplicas, puedes refrescar la página y cada vez dará información diferente del container (cambia Hostname)