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/'
2023-05-22 13:04:24 URL:https://get.k3s.io/ [30463/30463] -> "/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.58.191.222 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.58.191.222' --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.26.4+k3s1 as release
[INFO]  Downloading hash https://github.com/k3s-io/k3s/releases/download/v1.26.4+k3s1/sha256sum-amd64.txt
[INFO]  Downloading binary https://github.com/k3s-io/k3s/releases/download/v1.26.4+k3s1/k3s
[INFO]  Verifying binary download
[INFO]  Installing k3s to /usr/local/bin/k3s
[INFO]  Finding available k3s-selinux versions
/root/get-k3s-io.sh: 407: [: k3s-selinux-1.2-2.el8.noarch.rpm: unexpected operator
[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

Danger

  • 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

root@example:~# 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 Mon 2023-05-22 13:07:47 CST; 27s ago
       Docs: https://k3s.io
   Main PID: 256 (k3s-server)
      Tasks: 48
     Memory: 522.8M
        CPU: 14.941s
     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
             └─4096 /var/lib/rancher/k3s/data/.../bin/unpigz -d -c

Warning

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:             863         416          67           0         379         315
Swap:           1023           0        1023

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      256/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' ...
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'

root@k3s:~# ls -la ~/.kube
total 8
drwxr-xr-x 2 root root 4096 May 22 13:11 .
drwx------ 4 root root 4096 May 22 13:11 ..
lrwxrwxrwx 1 root root   25 May 22 13:11 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 -cR redes:staff ~/.kube
changed ownership of '/home/redes/.kube' from redes:users to redes:staff
changed ownership of '/home/redes/.kube/config' from root:root to redes:staff

redes@example:~$ chmod -c 0640 ~/.kube/config
mode of '/home/redes/.kube/config' changed from 0440 (r--r-----) to 0640 (rw-r-----)

redes@example:~$ ls -la ~/.kube
total 12
drwxr-xr-x 2 redes staff 4096 May 22 13:11 .
drwxr-xr-x 4 redes users 4096 May 22 13:11 ..
-rw-r----- 1 redes staff 2961 May 22 13:11 config

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 --short
Flag --short has been deprecated, and will be removed in the future. The --short output will become the default.
Client Version: v1.26.4+k3s1
Kustomize Version: v4.5.7
Server Version: v1.26.4+k3s1

redes@example:~$ kubectl get nodes -o wide
NAME              STATUS   ROLES                  AGE     VERSION        INTERNAL-IP   EXTERNAL-IP   OS-IMAGE                         KERNEL-VERSION          CONTAINER-RUNTIME
k3s.tonejito.cf   Ready    control-plane,master   6m19s   v1.26.4+k3s1   10.0.0.4      <none>        Debian GNU/Linux 11 (bullseye)   5.10.0-23-cloud-amd64   containerd://1.6.19-k3s1

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.26.4
usuario@laptop ~ % curl -fsSLO https://dl.k8s.io/release/${KUBECTL_VERSION}/bin/linux/amd64/kubectl

usuario@laptop ~ % chmod -c +x kubectl
mode of 'kubectl' changed from 0644 (rw-r--r--) to 0755 (rwxr-xr-x)

Instala el programa kubectl en el equipo

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

usuario@laptop ~ % rm -v ~/kubectl
removed '/home/usuario/kubectl'

usuario@laptop ~ % ls -la /usr/local/bin/kubectl
-rwxr-xr-x 1 root root 48037888 May 22 13:18 /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.3
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"

redes@example:~$ ls -la "${KREW_TMP_DIR}/krew-${KREW_VERSION}.tar.gz"
-rw-r--r-- 1 redes users 4128657 Feb  4  2022 /tmp/krew/krew-v0.4.3.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 11836580 1999-12-31 18:00 ./krew-linux_amd64

Instala el programa krew en la cuenta del usuario

redes@example:~$ ls -la ${KREW_TMP_DIR}/krew-linux_amd64
-rwxr-xr-x 1 redes users 11836580 Dec 31  1999 /tmp/krew/krew-linux_amd64

redes@example:~$ ${KREW_TMP_DIR}/krew-linux_amd64 install krew
WARNING: To be able to run kubectl plugins, you need to add
the following to your ~/.bash_profile or ~/.bashrc:

    export PATH="${PATH}:${HOME}/.krew/bin"

and restart your shell.

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 -vrf ${KREW_TMP_DIR}
removed '/tmp/krew/krew-v0.4.3.tar.gz'
removed '/tmp/krew/krew-linux_amd64'
removed '/tmp/krew/LICENSE'
removed directory '/tmp/krew'

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="${PATH}:${HOME}/.krew/bin"

Verifica que ~/.krew/bin aparezca en tu PATH

redes@example:~$ echo ${PATH}
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/home/redes/.krew/bin

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.3
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.58.191.222 con la dirección IP pública de tu máquina virtual
usuario@laptop ~ % scp -i ~/.ssh/redes_azure.pem redes@20.58.191.222:~/.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

Crea el directorio ~/.kube en el equipo local

usuario@laptop ~ % mkdir -vp --mode 0700 ~/.kube
mkdir: created directory '/home/usuario/.kube'

Copia el archivo ~/Downloads/redes-kube-config.yaml al directorio ~/.kube en el equipo local

usuario@laptop ~ % install --verbose --owner "$(id -u)" --group "$(id -g)" --mode 0640 ~/Downloads/redes-kube-config.yaml ~/.kube/config
'/home/usuario/Downloads/redes-kube-config.yaml' -> '/home/usuario/.kube/config'

Verifica los permisos

usuario@laptop ~ % ls -la ~/.kube
total 12
drwx------ 2 usuario grupo 4096 May 25 23:48 .
drwxr-xr-x 8 usuario grupo 4096 May 25 23:48 ..
-rw-r----- 1 usuario grupo 2967 May 25 23:48 config

Conectarse al cluster desde el equipo local#

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

usuario@laptop ~ % nc -vz k3s.tonejito.cf 6443
k3s.tonejito.cf [20.58.191.222] 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 --short se utiliza para dar una salida compacta del comando
  • 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 --short --insecure-skip-tls-verify=false
Flag --short has been deprecated, and will be removed in the future. The --short output will become the default.
Client Version: v1.26.4
Kustomize Version: v4.5.7
Server Version: v1.26.4+k3s1

Lista los nodos presentes en el cluster de Kubernetes

usuario@laptop ~ % kubectl get nodes
NAME              STATUS   ROLES                  AGE  VERSION
k3s.tonejito.cf   Ready    control-plane,master   1d   v1.26.4+k3s1

Verifica la configuración#

Reinicia el equipo local y el equipo remoto para verificar que los cambios sean persistentes

  • Equipo remoto
root@laptop:~# systemctl reboot
  • Equipo local
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