{"id":307,"date":"2020-07-30T22:08:10","date_gmt":"2020-07-30T20:08:10","guid":{"rendered":"https:\/\/www.javisalas.com\/?p=307"},"modified":"2021-06-27T10:36:39","modified_gmt":"2021-06-27T08:36:39","slug":"instala-y-configura-k3s-en-ha-o-single-server","status":"publish","type":"post","link":"https:\/\/www.javisalas.com\/index.php\/2020\/07\/30\/instala-y-configura-k3s-en-ha-o-single-server\/","title":{"rendered":"Instala y configura K3s en HA o Single Master"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Introducci\u00f3n<\/h2>\n\n\n\n<p>Continuamos con la instalaci\u00f3n de nuestro hosting privado. Llega el momento de desplegar el software de Kubernetes <a rel=\"noreferrer noopener\" href=\"https:\/\/k3s.io\" target=\"_blank\">K3s<\/a>. Como ya coment\u00e9 en el <a href=\"https:\/\/www.javisalas.com\/index.php\/2020\/06\/30\/monta-tu-propio-cloud-con-raspberry-y-kubernetes\/\" data-type=\"URL\" target=\"_blank\" rel=\"noreferrer noopener\">primer art\u00edculo<\/a> de \u00e9sta colecci\u00f3n, aunque podr\u00edamos desplegar sin problemas el sistema de Google <a rel=\"noreferrer noopener\" href=\"https:\/\/kubernetes.io\/es\/\" target=\"_blank\">K8s<\/a>, \u00e9sta version <em>lite<\/em> est\u00e1 optimizada para <a rel=\"noreferrer noopener\" href=\"https:\/\/es.wikipedia.org\/wiki\/Internet_de_las_cosas\" target=\"_blank\">IOT<\/a> y sobre todo con un gran soporte para placas ARM.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u00bfAlta disponibilidad (HA) o Single Master?<\/h2>\n\n\n\n<p>No es una elecci\u00f3n crucial, en realidad, la primera version de mi cluster contaba con un solo nodo<em> master<\/em>  y cuatro <em>workers<\/em>. Con el tiempo, y sobre todo, con al compra de placas nuevas fui cambiando la configuraci\u00f3n, pasando a dejar la placa con mas recursos como <em>master<\/em> y el resto como <em>workers<\/em>; sin embargo, tras observar como se comportaban, decid\u00ed que no hac\u00eda falta poner las placas mas potentes como <em>master<\/em>, ya que una Raspberry 3 puede gestionar perfectamente el cluster y que merece la pena dejar las que tienen mas recursos para ejecutar los pods.<\/p>\n\n\n\n<!--more-->\n<!--noteaser-->\n\n\n\n<p>Tener dos nodos <em>master<\/em> no va a dotar a nuestra infraestructura de mas velocidad o capacidad de ejecutar pods,  sin embargo si nos va a permitir tener una tolerancia a fallos en uno de los nodos maestros bien sea por un fallo hardware, un bug en el software o simplemente una actualizaci\u00f3n. Por lo tanto la decisi\u00f3n depende del numero de Raspberrys que tengamos; para un despliegue en HA recomendar\u00eda un m\u00ednimo de 4 placas: dos que har\u00edan las veces de <em>master<\/em> y las dos restantes de <em>workers<\/em>. \u00bfPodr\u00edamos tener solo un worker? definitivamente si, ya que podr\u00edamos activar la opci\u00f3n de ejecutar pods tambi\u00e9n en los nodos <em>master<\/em> como ya veremos m\u00e1s adelante, pero personalmente no me parece una buena idea.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Instalaci\u00f3n<\/h2>\n\n\n\n<p>Primero voy a detallar la instalaci\u00f3n de los <em>Master Nodes<\/em> ya sea como <em>Single Master<\/em> o bien en High <em>Availability<\/em>. El despliegue de los <em>Workers Nodes<\/em> ser\u00eda com\u00fan a ambos entornos.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Single Master<\/h3>\n\n\n\n<p>La estructura de \u00e9sta instalaci\u00f3n ser\u00eda la que podemos ver a continuaci\u00f3n:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.javisalas.com.com\/wp-content\/uploads\/2020\/07\/k3s-architecture-single-server-1024x560.png\" alt=\"\" class=\"wp-image-312\" width=\"586\" height=\"320\" srcset=\"https:\/\/www.javisalas.com\/wp-content\/uploads\/2020\/07\/k3s-architecture-single-server-1024x560.png 1024w, https:\/\/www.javisalas.com\/wp-content\/uploads\/2020\/07\/k3s-architecture-single-server-300x164.png 300w, https:\/\/www.javisalas.com\/wp-content\/uploads\/2020\/07\/k3s-architecture-single-server-768x420.png 768w, https:\/\/www.javisalas.com\/wp-content\/uploads\/2020\/07\/k3s-architecture-single-server-1536x840.png 1536w, https:\/\/www.javisalas.com\/wp-content\/uploads\/2020\/07\/k3s-architecture-single-server-2048x1120.png 2048w\" sizes=\"auto, (max-width: 586px) 100vw, 586px\" \/><figcaption>Despliegue de K3s con un solo <em>master node<\/em><\/figcaption><\/figure>\n\n\n\n<p>Los elementos que constituyen la instalaci\u00f3n son:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li><strong>K3sUser<\/strong>: Es nuestro servidor o port\u00e1til donde tenemos instalado kubectl, que es la utilidad de Kubernetes para gestionar el cluster por l\u00ednea de comandos.<\/li><li><strong>SQLite<\/strong>: Es la base de datos donde se almacenan todos los datos del cluster, est\u00e1 embebida en el propio nodo. \u00c9sta ser\u00e1 la gran diferencia con la instalaci\u00f3n en HA.<\/li><li><strong>Agent Nodes<\/strong>: O workers, donde vamos a ejecutar nuestros amplicativos<\/li><li><strong>Load Balancer:<\/strong> En base a la carga del cluster, decide a que nodo nuestra petici\u00f3n.<\/li><li><strong>External Traffic:<\/strong> Poco que a\u00f1adir, es nuestra petici\u00f3n que realizamos al cluster.<\/li><\/ol>\n\n\n\n<p>Asuminendo que ya estamos dentro del nodo seleccionado, seguimos los siguientes pasos:<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Establecer las variables de entorno<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$ export K3S_KUBECONFIG_MODE=\"644\"\n$ export INSTALL_K3S_EXEC=\" --no-deploy servicelb --disable traefik\"<\/pre>\n\n\n\n<p>La primera linea nos permite manejar el cluster sin ser usuario root. La segunda necesita una peque\u00f1a explicaci\u00f3n; por defecto, K3s despliega un <em>Load Balancer<\/em> y un <em>Proxy<\/em> propio llamados <em>servicelb<\/em> y <em>traefik<\/em>. En su momento me encontr\u00e9 con bastantes problemas para hacerlo funcionar con mis pods, por lo que decid\u00ed utilizar <em><a href=\"https:\/\/metallb.universe.tf\/\">metalb<\/a><\/em>  como <em>Load Balancer<\/em> y el m\u00e1s que conocido <em><a href=\"https:\/\/www.nginx.com\/\">Nginx<\/a><\/em> como <em>Proxy<\/em>. Mediante esos flags, evitamos que se instalen esos servicios por defecto, para poder instalar despu\u00e9s de manera manual <em>metalb<\/em> y <em>nginx<\/em>.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Ejecutar el instalador<\/h4>\n\n\n\n<p>Simple y directo, una sola l\u00ednea y \u00e9l se encarga de todo.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$ curl -sfL https:\/\/get.k3s.io | sh -\n\n[INFO]  Finding latest release\n[INFO]  Using v1.18.3+k3s as release\n[INFO]  Downloading hash https:\/\/github.com\/rancher\/k3s\/releases\/download\/v1.18.3+k3s\/sha256sum-arm.txt\n[INFO]  Downloading binary https:\/\/github.com\/rancher\/k3s\/releases\/download\/1.18.3+k3s\/k3s-armhf\n[INFO]  Verifying binary download\n[INFO]  Installing k3s to \/usr\/local\/bin\/k3s\n[INFO]  Creating \/usr\/local\/bin\/kubectl symlink to k3s\n[INFO]  Creating \/usr\/local\/bin\/crictl symlink to k3s\n[INFO]  Creating \/usr\/local\/bin\/ctr symlink to k3s\n[INFO]  Creating killall script \/usr\/local\/bin\/k3s-killall.sh\n[INFO]  Creating uninstall script \/usr\/local\/bin\/k3s-uninstall.sh\n[INFO]  env: Creating environment file \/etc\/systemd\/system\/k3s.service.env\n[INFO]  systemd: Creating service file \/etc\/systemd\/system\/k3s.service\n[INFO]  systemd: Enabling k3s unit\nCreated symlink \/etc\/systemd\/system\/multi-user.target.wants\/k3s.service \u2192 \/etc\/systemd\/system\/k3s.service.\n[INFO]  systemd: Starting k3s<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Verificar la instalaci\u00f3n<\/h4>\n\n\n\n<p>El instalador crea un servicio que se puede usar para iniciar, parar, reiniciar y verificar su estado actual:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">pi@noldork3sM:~ $ sudo systemctl status k3s\n\u25cf k3s.service - Lightweight Kubernetes\n   Loaded: loaded (\/etc\/systemd\/system\/k3s.service; enabled; vendor preset: enab\n   Active: active (running) since Sat 2020-07-04 17:16:24 CEST; 4h 16min ago\n     Docs: https:\/\/k3s.io\n  Process: 25865 ExecStartPre=\/sbin\/modprobe br_netfilter (code=exited, status=0\n  Process: 25866 ExecStartPre=\/sbin\/modprobe overlay (code=exited, status=0\/SUCC\n Main PID: 25867 (k3s-server)\n    Tasks: 15\n   Memory: 124.2M\n (...)<\/pre>\n\n\n\n<p>Igualmente, el instalador despliega el  <a rel=\"noreferrer noopener\" href=\"https:\/\/kubernetes.io\/docs\/reference\/kubectl\/overview\/\" target=\"_blank\">Kubernetes Command Line Tools<\/a>&nbsp;<code>kubectl<\/code>, para que podemos interactuar con el cluster:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">pi@noldork3sM:~ $ kubectl get nodes -o wide\nNAME          STATUS   ROLES    AGE   VERSION        INTERNAL-IP      \nnoldork3sm    Ready    master   5m   v1.18.3+k3s1   192.168.1.245   <\/pre>\n\n\n\n<p>Tambi\u00e9n podemos ver los pods que se han desplegado con la instalaci\u00f3n:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$ kubectl get pods -A -o wide\n\nNAMESPACE     NAME                                      READY   STATUS    \nkube-system   metrics-server-7566d596c8-rgwgm            1\/1   Running   \nkube-system   local-path-provisioner-6d59f47c7-xh6t5     1\/1   Running   \nkube-system   coredns-8655855d6-pkxmp                    1\/1   Running   \n<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Alta Disponibilidad (HA)<\/h3>\n\n\n\n<p>Nuestra instalaci\u00f3n en este caso, tendr\u00eda la siguiente estructura:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.javisalas.com.com\/wp-content\/uploads\/2020\/07\/k3s-architecture-ha-server-2-1024x482.png\" alt=\"\" class=\"wp-image-324\" width=\"609\" height=\"287\" srcset=\"https:\/\/www.javisalas.com\/wp-content\/uploads\/2020\/07\/k3s-architecture-ha-server-2-1024x482.png 1024w, https:\/\/www.javisalas.com\/wp-content\/uploads\/2020\/07\/k3s-architecture-ha-server-2-300x141.png 300w, https:\/\/www.javisalas.com\/wp-content\/uploads\/2020\/07\/k3s-architecture-ha-server-2-768x362.png 768w, https:\/\/www.javisalas.com\/wp-content\/uploads\/2020\/07\/k3s-architecture-ha-server-2-1536x724.png 1536w, https:\/\/www.javisalas.com\/wp-content\/uploads\/2020\/07\/k3s-architecture-ha-server-2-2048x965.png 2048w\" sizes=\"auto, (max-width: 609px) 100vw, 609px\" \/><figcaption>Despliegue de K3s en HA<\/figcaption><\/figure>\n\n\n\n<p>Las diferencias notables entre \u00e9sta instalaci\u00f3n y la anterior son dos: la primera es que contamos con un o varios nodos que act\u00faan como <em>master<\/em>s y la segunda, y m\u00e1s importante, es que la base de datos para a ser una base de datos externa. <\/p>\n\n\n\n<p>Por lo tanto, si optamos por opci\u00f3n, deberemos tener lista otra raspberry (o placa arm por continuar con la misma arquitectura) externa donde se pueda ejecutar nuestro servidor de base de datos. <\/p>\n\n\n\n<p>Una vez tengamos el servidor de base de datos listo, creamos nuestra base de datos, usuario y contrase\u00f1a mediante los siguientes comandos :<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"sql\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">mysql> CREATE database &lt;database>;\nmysql> CREATE USER &lt;user>'@'%' IDENTIFIED BY '&lt;password>';\nmysql> GRANT ALL ON &lt;database>.* TO '&lt;user>'@'%';\nmysql> flush privileges;<\/pre>\n\n\n\n<p>Ahora solo nos resta continuar con los siguientes pasos que deberemos ejecutar en todos los nodos que vayan a ser <em>Master<\/em>, y  que como ver\u00e9is son pr\u00e1cticamente los mismos que la instalaci\u00f3n <em>Single Master<\/em> :<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Establecer las variables de entorno<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$ NODE_TOKEN=$(echo $(hostname) $(date +%s) | shasum | base64) \n$ export K3S_KUBECONFIG_MODE=\"644\"\n$ export INSTALL_K3S_EXEC=\" -t ${NODE_TOKEN} --tls-san &lt;hostname> --no-deploy servicelb --disable traefik --node-taint k3s-controlplane=true:NoExecute --datastore-endpoint mysql:\/\/&lt;dbuser>:&lt;dbpassword>@tcp(&lt;dbhostname>:3306)\/&lt;database>\"<\/pre>\n\n\n\n<p>La primera linea no es una diferencia como tal, ya que la vamos a usar tambi\u00e9n en una instalaci\u00f3n <em>Single Master<\/em> cuando vayamos a a\u00f1adir los <em>workers<\/em>. Sin embargo, en esta modalidad, vamos a utilizar mas de un <em>Master Node<\/em> por lo que necesitamos este token para crear nuestro cluster. Apuntar bien el valor de esa variable puesto que la necesitaremos m\u00e1s adelante, para ello ejecutamos este comando:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$ echo $NODE_TOKEN<\/pre>\n\n\n\n<p>La segunda l\u00ednea es com\u00fan a la instalaci\u00f3n anterior. Sin embargo en la tercera l\u00ednea si encontramos diferencias: <\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><em>&#8211;tls-san &lt;hostname&gt; \/ &lt;ip&gt;: <\/em>es necesaria para evitar errores de  certificados en la configuraci\u00f3n del cluster. Debemos especificar el hostname o la ip de nuestro nodo master.<\/li><li><em>&#8211;node-taint k3s-controlplane=true:NoExecute<\/em>: esta opci\u00f3n es opcional, de hecho, la podr\u00edamos especificar tambi\u00e9n en una instalaci\u00f3n <em>Single Node<\/em> . Nos sirve para evitar que los pods se ejecuten en nuestro nodo Master, lo que es muy util si nuestras placas no tienen suficiente potencia.<\/li><li><em>&#8211;datastore-endpoint mysql:\/\/&lt;dbuser&gt;:&lt;dbpassword&gt;@tcp(&lt;dbhostname&gt;:3306)\/:<\/em> es quiz\u00e1s la m\u00e1s importante de todas y la clave de todo. Estamos especificando el usuario, contrase\u00f1a y hostname\/ip de nuestro servidor donde se ejecuta nuestra base de datos, en este ejemplo MYSQL <\/li><\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Ejecutar el instalador<\/h4>\n\n\n\n<p>Exactamente igual que con un solo master node:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$ curl -sfL https:\/\/get.k3s.io | sh -\n\n[INFO]  Finding latest release\n[INFO]  Using v1.18.3+k3s as release\n[INFO]  Downloading hash https:\/\/github.com\/rancher\/k3s\/releases\/download\/v1.18.3+k3s\/sha256sum-arm.txt\n[INFO]  Downloading binary https:\/\/github.com\/rancher\/k3s\/releases\/download\/1.18.3+k3s\/k3s-armhf\n[INFO]  Verifying binary download\n[INFO]  Installing k3s to \/usr\/local\/bin\/k3s\n[INFO]  Creating \/usr\/local\/bin\/kubectl symlink to k3s\n[INFO]  Creating \/usr\/local\/bin\/crictl symlink to k3s\n[INFO]  Creating \/usr\/local\/bin\/ctr symlink to k3s\n[INFO]  Creating killall script \/usr\/local\/bin\/k3s-killall.sh\n[INFO]  Creating uninstall script \/usr\/local\/bin\/k3s-uninstall.sh\n[INFO]  env: Creating environment file \/etc\/systemd\/system\/k3s.service.env\n[INFO]  systemd: Creating service file \/etc\/systemd\/system\/k3s.service\n[INFO]  systemd: Enabling k3s unit\nCreated symlink \/etc\/systemd\/system\/multi-user.target.wants\/k3s.service \u2192 \/etc\/systemd\/system\/k3s.service.\n[INFO]  systemd: Starting k3s<\/pre>\n\n\n\n<p>Una vez est\u00e9n listos todos los <em>Master Nodes<\/em> podemos comprobar su estado mediante el comando kubectl:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">pi@noldork3sM:~ $ kubectl get nodes -o wide\nNAME          STATUS   ROLES    AGE   VERSION        INTERNAL-IP      \nnoldork3sm    Ready    master   5m   v1.18.3+k3s1   192.168.1.245\nnoldork3sm2   Ready    master   5m   v1.18.3+k3s1   192.168.1.246<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Workers Nodes<\/h3>\n\n\n\n<p>La instalaci\u00f3n de los <em>Workers Nodes<\/em> es igual en ambos entornos, y consta de los siguientes pasos:<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Establecer las variables de entorno<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$ export K3S_KUBECONFIG_MODE=\"644\"\n$ export K3S_URL=\"https:\/\/ip_master_node:6443\"\n$ export K3s_TOKEN=&lt;token_master_node><\/pre>\n\n\n\n<p>Recordar el token del <em>Master Node<\/em> que obtuvimos anteriormente. Si por lo que sea lo hemos perdido, podemos recuperarlo entrando por ssh en cualquiera de los <em>Master Nodes<\/em> ejecutando el siguiente comando:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$ sudo cat \/var\/lib\/rancher\/k3s\/server\/node-token<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Ejecutar el instalador<\/h4>\n\n\n\n<p>Como ver\u00e9is es igual que con los <em>Master Nodes<\/em>:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$ curl -sfL https:\/\/get.k3s.io | sh -\n\n[INFO]  Finding latest release\n[INFO]  Using v1.18.3+k3s as release\n[INFO]  Downloading hash https:\/\/github.com\/rancher\/k3s\/releases\/download\/v1.18.3+k3s\/sha256sum-arm.txt\n[INFO]  Downloading binary https:\/\/github.com\/rancher\/k3s\/releases\/download\/1.18.3+k3s\/k3s-armhf\n[INFO]  Verifying binary download\n[INFO]  Installing k3s to \/usr\/local\/bin\/k3s\n[INFO]  Creating \/usr\/local\/bin\/kubectl symlink to k3s\n[INFO]  Creating \/usr\/local\/bin\/crictl symlink to k3s\n[INFO]  Creating \/usr\/local\/bin\/ctr symlink to k3s\n[INFO]  Creating killall script \/usr\/local\/bin\/k3s-killall.sh\n[INFO]  Creating uninstall script \/usr\/local\/bin\/k3s-uninstall.sh\n[INFO]  env: Creating environment file \/etc\/systemd\/system\/k3s.service.env\n[INFO]  systemd: Creating service file \/etc\/systemd\/system\/k3s.service\n[INFO]  systemd: Enabling k3s unit\nCreated symlink \/etc\/systemd\/system\/multi-user.target.wants\/k3s.service \u2192 \/etc\/systemd\/system\/k3s.service.\n[INFO]  systemd: Starting k3s<\/pre>\n\n\n\n<p>Una vez hecho en todos nuestros workers, podemos  comprobar el estado de nuestro cluster:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">pi@noldork3sM:~ $ kubectl get nodes -o wide\nNAME          STATUS   ROLES    AGE     VERSION        \nnoldork3sn1   Ready    &lt;none>   3d21h   v1.18.2+k3s1   \nnoldork3sm2   Ready    master   3d21h   v1.18.2+k3s1   \nnoldork3sm    Ready    master   3d22h   v1.18.2+k3s1   \nnoldork3sn3   Ready    &lt;none>   3d21h   v1.18.2+k3s1  <\/pre>\n\n\n\n<p>Como podeis observar tenemos nuestro cluster activo, con dos <em>Master Nodes<\/em> y dos <em>Worker Nodes<\/em>. Ver\u00e9is que \u00e9stos \u00faltimos no tienen un rol asignado, no es preocup\u00e9is, es normal.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Accediendo al cluster de manera remota.<\/h4>\n\n\n\n<p>Para acceder a nuestro cluster, o gestionarlo, no es necesario acceder a cualquiera de los nodos, podemos hacerlo desde cualquier sistema Linux, OSx o Windows. Para ello solamente tenemos que instalar la herramienta <span class=\"has-inline-color has-black-color\"><code>kubectl<\/code><\/span>, que ya viene instalada en nuestro cluster. Despu\u00e9s solo tendremos que copiar el fichero de configuraci\u00f3n de nuestro cluster a la maquina.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Instalar kubectl en nuestra m\u00e1quina<\/li><\/ul>\n\n\n<p>Solamente ten\u00e9is que leer y seguir los pasos descritos en <a href=\"https:\/\/kubernetes.io\/docs\/tasks\/tools\/install-kubectl\/\" target=\"_blank\" rel=\"noreferrer noopener\">documentaci\u00f3n oficial<\/a> para instalarla en cualquier entorno.<\/p>\n\n\n<ul class=\"wp-block-list\"><li>Copiar el fichero de configuraci\u00f3n de nuestro nodo master a nuestra m\u00e1quina<\/li><\/ul>\n\n\n\n<p>Mediante el comando <code>scp<\/code> podemos copiar informaci\u00f3n desde una maquina a otra por <code>ssh<\/code>. De \u00e9sta manera, podremos descargar el fichero <code>\/etc\/rancher\/k3s\/k3s.yaml<\/code> de nuestro nodo master a nuestra m\u00e1quina local, en el path <code>~\/.kube\/config<\/code>.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">scp i5js@nanoserver:\/etc\/rancher\/k3s\/k3s.yaml ~\/.kube\/config<\/pre>\n\n\n\n<p>Ahora solo tenemos que editarlo y cambiar la direcci\u00f3n ip que es <code>127.0.0.1<\/code> por la ip de nuestro nodo master, en mi caso <code>192.168.1.240<\/code>. Podemos hacerlo mediante el editor<code> <\/code>que mas c\u00f3modo os resulte  o bien, mediante el comando sed:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sed -i '' 's\/127\\.0\\.0\\.1\/192\\.168\\.1\\.240\/g' ~\/.kube\/config<\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Probar <code>kubectl<\/code> desde nuestra m\u00e1quina local<\/li><\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">i5js@nanoserver:~ $ kubectl get nodes -o wide\nNAME          STATUS   ROLES    AGE     VERSION        \nnoldork3sn1   Ready    &lt;none>   3d21h   v1.18.2+k3s1   \nnoldork3sm2   Ready    master   3d21h   v1.18.2+k3s1   \nnoldork3sm    Ready    master   3d22h   v1.18.2+k3s1   \nnoldork3sn3   Ready    &lt;none>   3d21h   v1.18.2+k3s1  <\/pre>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introducci\u00f3n Continuamos con la instalaci\u00f3n de nuestro hosting privado. Llega el momento de desplegar el software de Kubernetes K3s. Como ya coment\u00e9 en el primer art\u00edculo de \u00e9sta colecci\u00f3n, aunque podr\u00edamos desplegar sin problemas el sistema de Google K8s, \u00e9sta version lite est\u00e1 optimizada para IOT y sobre todo con un gran soporte para placas&#8230; <a class=\"more-link\" href=\"https:\/\/www.javisalas.com\/index.php\/2020\/07\/30\/instala-y-configura-k3s-en-ha-o-single-server\/\">Continue reading <span class=\"meta-nav\">&#8594;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[15,5],"tags":[],"class_list":["post-307","post","type-post","status-publish","format-standard","hentry","category-kubernetes","category-raspbian"],"_links":{"self":[{"href":"https:\/\/www.javisalas.com\/index.php\/wp-json\/wp\/v2\/posts\/307","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.javisalas.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.javisalas.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.javisalas.com\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.javisalas.com\/index.php\/wp-json\/wp\/v2\/comments?post=307"}],"version-history":[{"count":27,"href":"https:\/\/www.javisalas.com\/index.php\/wp-json\/wp\/v2\/posts\/307\/revisions"}],"predecessor-version":[{"id":415,"href":"https:\/\/www.javisalas.com\/index.php\/wp-json\/wp\/v2\/posts\/307\/revisions\/415"}],"wp:attachment":[{"href":"https:\/\/www.javisalas.com\/index.php\/wp-json\/wp\/v2\/media?parent=307"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javisalas.com\/index.php\/wp-json\/wp\/v2\/categories?post=307"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javisalas.com\/index.php\/wp-json\/wp\/v2\/tags?post=307"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}