Instalación de k3s en Debian 11#


Verificar el script de instalación de k3s#

Abrir la página de VirusTotal para escanear una URL, pegar la liga https://get.k3s.io/ y presionar <ENTER> para validar el script de instalación

Warning

  • NUNCA se deben ejecutar scripts aleatorios de internet sin antes verificar su autenticidad utilizando funciones hash, firmas criptográficas o un escaneo de antivirus
VirusTotal - get.k3s.io

Descargar el script de instalación de k3s#

Guardar el script de instalación y dar permisos de ejecución

root@example:~# wget -c -nv -O ~/get-k3s-io.sh https://get.k3s.io/
2022-05-24 11:27:32 URL:https://get.k3s.io/ [27501/27501] -> "/root/get-k3s-io.sh" [1]

root@example:~# chmod -c +x ./get-k3s-io.sh
mode of './get-k3s-io.sh' changed from 0644 (rw-r--r--) to 0755 (rwxr-xr-x)

Ejecutar el script de instalación de k3s#

Se utilizan las siguientes variables de entorno para personalizar la instalación de k3s en el sistema operativo:

  • INSTALL_K3S_SKIP_START="true" se utiliza para no iniciar k3s después de haberlo instalado, esto permite ingresar opciones adicionales para reducir el consumo de memoria RAM

  • INSTALL_K3S_EXEC permite especificar argumentos adicionales a k3s

    • Deshabilitar componentes no necesarios para reducir el uso de memoria RAM
    • Especificar nombres adicionales para el certificado SSL del servidor API de Kubernetes
      • Reemplaza k3s.example.com con tu nombre de dominio (ej. k3s.tonejito.cf)
      • Reemplaza 20.213.120.169 con la dirección IP pública de tu máquina virtual
root@example:~# export INSTALL_K3S_SKIP_START="true"
root@example:~# export INSTALL_K3S_EXEC="--tls-san='k3s.tonejito.cf' --tls-san='20.213.120.169' --disable-cloud-controller --disable=metrics-server --disable=servicelb --disable=traefik"
root@example:~# ~/get-k3s-io.sh
[INFO]  Finding release for channel stable
[INFO]  Using v1.23.6+k3s1 as release
[INFO]  Downloading hash https://github.com/k3s-io/k3s/releases/download/v1.23.6+k3s1/sha256sum-amd64.txt
[INFO]  Downloading binary https://github.com/k3s-io/k3s/releases/download/v1.23.6+k3s1/k3s
[INFO]  Verifying binary download
[INFO]  Installing k3s to /usr/local/bin/k3s
[INFO]  Skipping installation of SELinux RPM
[INFO]  Creating /usr/local/bin/kubectl symlink to k3s
[INFO]  Creating /usr/local/bin/crictl symlink to k3s
[INFO]  Creating /usr/local/bin/ctr symlink to k3s
[INFO]  Creating killall script /usr/local/bin/k3s-killall.sh
[INFO]  Creating uninstall script /usr/local/bin/k3s-uninstall.sh
[INFO]  env: Creating environment file /etc/systemd/system/k3s.service.env
[INFO]  systemd: Creating service file /etc/systemd/system/k3s.service
[INFO]  systemd: Enabling k3s unit
Created symlink /etc/systemd/system/multi-user.target.wants/k3s.service → /etc/systemd/system/k3s.service.

Establecer variables de entorno para k3s#

Establecer una variable de entorno para hacer que k3s ocupe aún menos memoria RAM en el equipo

root@example:~# cat > /etc/systemd/system/k3s.service.env << EOF
# Aggressive garbage collector
GOGC=10
EOF

Note

  • Esta configuración es únicamente para un ambiente de pruebas
  • Ninguna de estas configuraciones se debe realizar en ambientes de producción
  • Estas configuraciones se realizan para que el cluster de k3s pueda ejecutarse en el equipo B1S que tiene únicamente 1 vCPU y 512 MB de RAM
  • No utilizar el tipo de instancia B1S para clusters de Kubernetes en ambientes de producción

Iniciar el servicio de k3s#

Reinicia el equipo para verificar que los cambios sean persistentes y que el servicio de k3s se inicie de manera automática

root@example:~# reboot

Espera a que la máquina vuelva a estar en línea y verifica que el servicio de k3s se haya iniciado de manera correcta

# PAGER=cat systemctl status --full k3s
● k3s.service - Lightweight Kubernetes
     Loaded: loaded (/etc/systemd/system/k3s.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2022-05-24 11:42:28 CDT; 30s ago
       Docs: https://k3s.io
   Main PID: 256 (k3s-server)
      Tasks: 63
     Memory: 512M
        CPU: 11.015s
     CGroup: /system.slice/k3s.service
             ├─ 256 /usr/local/bin/k3s server
             ├─ 512 containerd -c /var/lib/rancher/k3s/agent/etc/containerd/config.toml -a /run/k3s/containerd/containerd.sock --state /run/k3s/containerd --root /var/lib/rancher/k3s/agent/containerd
             ├─1024 /var/lib/rancher/k3s/data/.../bin/containerd-shim-runc-v2 -namespace k8s.io -id ... -address /run/k3s/containerd/containerd.sock
             └─2048 /var/lib/rancher/k3s/data/.../bin/containerd-shim-runc-v2 -namespace k8s.io -id ... -address /run/k3s/containerd/containerd.sock

Note

Cuando k3s se haya iniciado el uso de memoria RAM crecerá considerablemente, esta fue la razón por la que se hicieron los ajustes en la sección anterior

root@example:~# free -m
               total        used        free      shared  buff/cache   available
Mem:             913         478          83           1         352         300
Swap:           4093           0        4093

Revisa que el puerto de kube-apiserver esté escuchando#

El servidor del API de Kubernetes esucha en el puerto 6443, mismo que se debe de abrir para poder administrar el cluster desde el equipo local

root@example:~# netstat -ntulp | grep 6443
tcp6       0      0 :::6443                 :::*                    LISTEN      2764/k3s server

Prepara el archivo ~/.kube/config en el equipo remoto#

Agrega al usuario redes al grupo staff y cambia los permisos del archivo /etc/rancher/k3s/k3s.yaml

root@example:~# adduser redes staff
Adding user redes to group staff
Done.

root@example:~# chown -c root:staff /etc/rancher/k3s/k3s.yaml
changed ownership of '/etc/rancher/k3s/k3s.yaml' from root:root to root:staff

root@example:~# chmod -c 0440 /etc/rancher/k3s/k3s.yaml
mode of '/etc/rancher/k3s/k3s.yaml' changed from 0600 (rw-------) to 0440 (r--r-----)

Haz una liga simbólica al archivo k3s.yaml en la ruta ~/.kube/config con el usuario root

root@example:~# mkdir -vp ~/.kube
mkdir: created directory '/root/.kube'

root@example:~# ln -vsf /etc/rancher/k3s/k3s.yaml ~/.kube/config
'/root/.kube/config' -> '/etc/rancher/k3s/k3s.yaml'

Copia el archivo k3s.yaml en la ruta ~/.kube/config con el usuario redes y ajusta los permisos

root@example:~# su - redes

redes@example:~$ mkdir -vp ~/.kube
mkdir: created directory '/home/redes/.kube'

redes@example:~$ sudo cp -v /etc/rancher/k3s/k3s.yaml ~/.kube/config
'/etc/rancher/k3s/k3s.yaml' -> '/home/redes/.kube/config'

redes@example:~$ sudo chown -c redes:staff ~/.kube/config
changed ownership of '/home/redes/.kube/config' from root:root to redes:staff

Conectarse al cluster de Kubernetes desde el equipo remoto#

Utilizar el programa kubectl que fué instalado por k3s para listar la información del cluster

redes@example:~$ which kubectl
/usr/local/bin/kubectl

redes@example:~$ kubectl version
Client Version: version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.6+k3s1", ...
Server Version: version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.6+k3s1", ...

redes@example:~$ kubectl get nodes -o wide
NAME          STATUS   ROLES                  AGE   VERSION        INTERNAL-IP   EXTERNAL-IP   OS-IMAGE                         KERNEL-VERSION          CONTAINER-RUNTIME
example.com   Ready    control-plane,master   15m   v1.23.6+k3s1   10.0.0.4      <none>        Debian GNU/Linux 11 (bullseye)   5.10.0-14-cloud-amd64   containerd://1.5.11-k3s2

Abrir el puerto 6443 en el grupo de seguridad de Azure#

Localiza el grupo de seguridad de la máquina virtual en el portal de Azure y abre el puerto 6443 al tráfico de Internet

  • Utiliza el nombre kube-api-server
Portal de Azure - Grupo de Seguridad

Instala kubectl en el equipo local#

El programa kubectl se utiliza para crear recursos en el cluster de Kubernetes

Descarga el binario de kubectl para tu sistema operativo

usuario@laptop ~ % KUBECTL_VERSION=v1.23.6
usuario@laptop ~ % curl -fsSLO https://dl.k8s.io/release/${KUBECTL_VERSION}/bin/linux/amd64/kubectl

Instala el programa kubectl en el equipo

usuario@laptop ~ % sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl

usuario@laptop ~ % which kubectl
/usr/local/bin/kubectl

Instala krew en el equipo local#

Note

  • Este programa debe ser instalado en el equipo local y el equipo remoto

El programa krew es un manejador de plugins para kubectl

Crea un directorio temporal y descarga el archivo tar.gz de krew

redes@example:~$ KREW_VERSION=v0.4.2
redes@example:~$ KREW_TMP_DIR=/tmp/krew

redes@example:~$ mkdir -vp ${KREW_TMP_DIR}
mkdir: created directory '/tmp/krew'

redes@example:~$ wget -c -nv -O ${KREW_TMP_DIR}/krew-${KREW_VERSION}.tar.gz \
  "https://github.com/kubernetes-sigs/krew/releases/download/${KREW_VERSION}/krew-linux_amd64.tar.gz"

Extrae el archivo tar.gz de krew en el directorio temporal

redes@example:~$ tar -xvvzf ${KREW_TMP_DIR}/krew-${KREW_VERSION}.tar.gz -C ${KREW_TMP_DIR}
-rw-r--r-- runner/docker    11358 1999-12-31 18:00 ./LICENSE
-rwxr-xr-x runner/docker 12164162 1999-12-31 18:00 ./krew-linux_amd64

Instala el programa krew en la cuenta del usuario

redes@example:~$ ${KREW_TMP_DIR}/krew-linux_amd64 install krew
Adding "default" plugin index from https://github.com/kubernetes-sigs/krew-index.git.
Updated the local copy of plugin index.
Installing plugin: krew
Installed plugin: krew
\
 | Use this plugin:
 |  kubectl krew
 | Documentation:
 |  https://krew.sigs.k8s.io/
 | Caveats:
 | \
 |  | krew is now installed! To start using kubectl plugins, you need to add
 |  | krew's installation directory to your PATH:
 |  |
 |  |   * macOS/Linux:
 |  |     - Add the following to your ~/.bashrc or ~/.zshrc:
 |  |         export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH"
 |  |     - Restart your shell.
 |  |
 |  |   * Windows: Add %USERPROFILE%\.krew\bin to your PATH environment variable
 |  |
 |  | To list krew commands and to get help, run:
 |  |   $ kubectl krew
 |  | For a full list of available plugins, run:
 |  |   $ kubectl krew search
 |  |
 |  | You can find documentation at
 |  |   https://krew.sigs.k8s.io/docs/user-guide/quickstart/.
 | /
/

Borra el directorio temporal donde se descargó el instalador de krew

redes@example:~$ rm -rf ${KREW_TMP_DIR}

Agrega esta línea al final del archivo ~/.bashrc

  • Después cierra y abre tu sesión para que el shell tome los cambios
export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH"

Confirma que tu shell pueda ubicar el programa kubectl-krew

redes@example:~$ which kubectl-krew
/home/redes/.krew/bin/kubectl-krew

Verifica que puedas ejecutar el comando kubectl krew

redes@example:~$ kubectl krew version
OPTION            VALUE
GitTag            v0.4.2
GitCommit         dbfefa5
IndexURI          https://github.com/kubernetes-sigs/krew-index.git
BasePath          /home/redes/.krew
IndexPath         /home/redes/.krew/index/default
InstallPath       /home/redes/.krew/store
BinPath           /home/redes/.krew/bin
DetectedPlatform  linux/amd64

Actualiza la lista de plugins de krew

redes@example:~$ kubectl krew update
Updated the local copy of plugin index.

Instala el plugin neat de krew

redes@example:~$ kubectl krew install neat
Updated the local copy of plugin index.
Installing plugin: neat
Installed plugin: neat
\
 | Use this plugin:
 |  kubectl neat
 | Documentation:
 |  https://github.com/itaysk/kubectl-neat
/
WARNING: You installed plugin "neat" from the krew-index plugin repository.
   These plugins are not audited for security by the Krew maintainers.
   Run them at your own risk.

Prepara el archivo ~/.kube/config en el equipo local#

Copia el archivo ~/.kube/config al equipo local, este archivo tiene la información para conectarse al servidor de Kubernetes

  • Reemplaza 20.213.120.169 con la dirección IP pública de tu máquina virtual
usuario@laptop ~ % scp -i ~/.ssh/redes_azure.pem root@20.213.120.169:~/.kube/config ~/Downloads/redes-kube-config.yaml

Edita el archivo redes-kube-config.yaml para poner el nombre DNS de tu máquina virtual

  • Reemplaza k3s.example.com con tu nombre de dominio (ej. k3s.tonejito.cf)
usuario@laptop ~ % sed -i'' -e 's/127.0.0.1/k3s.example.com/g' ~/Downloads/redes-kube-config.yaml

Note

No hay espacio entre la letra i y las comillas simples '' en el comando sed

Conectarse al cluster desde el equipo local#

Ejecuta el siguiente comando en tu máquina para configurar temporalmente la ruta hacia el archivo de configuración de kubectl

usuario@laptop ~ % export KUBECONFIG=~/Downloads/redes-kube-config.yaml

Warning

  • Es necesario que ejecutes el comando para crear la variable de entorno cada vez que abras una nueva terminal
  • Si quieres que este cambio sea persistente, incluye esa línea de comando al final del archivo ~/.bashrc en tu usuario

Verifica que te puedas conectar al puerto 6443 del servidor con netcat

usuario@laptop ~ % nc -vz k3s.tonejito.cf 6443
k3s.tonejito.cf [20.213.120.169] 6443 (?) open

Verifica que puedas conectarte al servidor API de Kubernetes con el comando kubectl

  • La versión local del cliente de Kubernetes debe ser la misma que la que se ejecuta en el servidor
  • La opción --insecure-skip-tls-verify=false se utiliza para forzar explícitamente la verificación del certificado SSL del servidor API del cluster de Kubernetes
usuario@laptop ~ % kubectl version --insecure-skip-tls-verify=false
Client Version: version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.6", ...
Server Version: version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.6+k3s1", ...

Lista los nodos presentes en el cluster de Kubernetes

usuario@laptop ~ % kubectl get nodes
NAME           STATUS   ROLES                  AGE   VERSION
debian-redes   Ready    control-plane,master   30m   v1.23.6+k3s1

Verifica la configuración#

Reinicia el equipo remoto para verificar que los cambios sean persistentes

root@example:~# reboot

Danger

  • Verifica que TODAS las configuraciones que hiciste estén presentes respués de reiniciar la máquina antes de continuar con la siguiente sección

Note

  • Continúa en la siguiente página si el servicio de k3s está en línea y puedes conectarte al cluster desde tu equipo local con el comando kubectl

Página anterior Arriba Página siguiente