Primeros pasos con k3s

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 servicio whoami-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)

Follow comments at Telegram group Or subscribe to the Channel Telegram channel

2019 - 2021 | Mixed with Bootstrap | Baked with JBake v2.6.7