Primeros pasos con k3s
Tags: k8s, k3s, kubernetes
Published: 2021-11-13 07:41:37

---
title: Primeros pasos con k3s
published: true
date: 2021-11-03 00:00:00 UTC
tags: k8s,k3s,kubernetes
canonical_url: https://jorge.aguilera.soy/blog/2021/k3s.html
---

<dl>
<dt>INFO</dt>
<dd>
<p>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 <code>v1.21.5+k3s2</code></p>
</dd>
</dl>

K3s es la distribución ligera de kubernetes de Rancher ([https://rancher.com/docs/k3s/latest/en/](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

<dl>
<dt>INFO</dt>
<dd>
<p>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 <code>kubectl</code> tienes que indicarle el contexto contra el que ejecutarse</p>
</dd>
</dl>

## 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

<dl>
<dt>WARNING</dt>
<dd>
<p>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 <code>traefik</code> 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</p>
</dd>
</dl>

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.

<dl>
<dt>INFO</dt>
<dd>
<p>Esta configuración usa la última versión que es precisamente lo que no encontraba
en todos los post que trataban el tema</p>
</dd>
</dl>

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 servicio`whoami-service`

Una vez aplicado el fichero podemos navegar a

[http://localhost/quiensoy](http://localhost/quiensoy)

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)