{"id":1353,"date":"2022-06-07T14:48:54","date_gmt":"2022-06-07T14:48:54","guid":{"rendered":"http:\/\/patriciocerda.com\/?p=1353"},"modified":"2022-06-07T14:48:54","modified_gmt":"2022-06-07T14:48:54","slug":"kasten-desplegar-kasten-en-modo-air-gap","status":"publish","type":"post","link":"https:\/\/patriciocerda.com\/?p=1353","title":{"rendered":"Kasten &#8211; Desplegar Kasten en modo Air-Gap"},"content":{"rendered":"<p>Hola a todos, bienvenidos a una nueva publicaci\u00f3n acerca de Kasten by Veeam. En esta ocasi\u00f3n veremos como desplegar Kasten en modo Air Gap, donde nuestra plataforma Kubernetes no tiene acceso directo a Internet.<\/p>\n<p>De acuerdo a la documentaci\u00f3n de Kasten, por defecto, cuando desplegamos Kasten K10 necesitamos acceso a trav\u00e9s de internet a 3 repositorios:<\/p>\n<ul>\n<li>Repositorio Helm que contiene el chart de K10<\/li>\n<li>El Container Registry que contiene las imagenes de los contenedores para K10<\/li>\n<li>Repositorios adicionales para instalas las dependencias de K10, como por ejemplo Prometheus.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>No obstante, es com\u00fan encontrar despliegues de Kubernetes en modo Air-Gap, es decir, que no cuentan con acceso a internet como una medida de seguridad.\u00a0 Para estos casos, existen distintas alternativas para desplegar Kasten sin requerir acceso a internet.<\/p>\n<p>&nbsp;<\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_82_2 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Contenidos<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/patriciocerda.com\/?p=1353\/#Lista_de_Materiales\" >Lista de Materiales<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/patriciocerda.com\/?p=1353\/#Pasos_previos\" >Pasos previos<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/patriciocerda.com\/?p=1353\/#Subir_imagenes_al_Private_Container_Registry\" >Subir imagenes al Private Container Registry<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/patriciocerda.com\/?p=1353\/#Instalar_Kasten_K10\" >Instalar Kasten K10<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"Lista_de_Materiales\"><\/span>Lista de Materiales<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>En primer lugar, veamos lo que necesitamos:<\/p>\n<ul>\n<li>Una plataforma Kubernetes operativa y con una versi\u00f3n soportada, en modo air-gap (sin acceso a internet)<\/li>\n<li>Un Container Registry para almacenar localmente las imagenes de K10 y dependencias.<\/li>\n<li>Si es requerido, credenciales de acceso al Private Container Registry<\/li>\n<li>Una maquina con acceso a Interner y al Private Container Registry, y con el cliente Docker, que utilizaremos para subir las imagenes al repositorio.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Pasos_previos\"><\/span>Pasos previos<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Antes de comenzar, en caso de que nuestro Container Registry requiera autenticaci\u00f3n, deberemos configurar el fichero\u00a0 <span class=\"ILfuVd\"><span class=\"hgKElc\"><b>~\/.<\/b> <b>docker\/config.<\/b> <b>json<\/b><\/span><\/span>, donde podremos indicar las credenciales de acceso a nuestro Private Container Registry.\u00a0 El fichero debiera incluir las siguientes lineas:<\/p>\n<style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-1 > .CodeMirror, .fusion-syntax-highlighter-1 > .CodeMirror .CodeMirror-gutters {background-color:var(--awb-color1);}.fusion-syntax-highlighter-1 > .CodeMirror .CodeMirror-gutters { background-color: var(--awb-color2); }.fusion-syntax-highlighter-1 > .CodeMirror .CodeMirror-linenumber { color: var(--awb-color8); }<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-1 fusion-syntax-highlighter-theme-light\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:var(--awb-color3);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_1\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_1\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_1\" data-readOnly=\"nocursor\" data-lineNumbers=\"1\" data-lineWrapping=\"\" data-theme=\"default\" data-mode=\"text\/x-sh\">{\n  \"auths\": {\n      \"https:\/\/minio.homelab.local:5000\": {\n          \"auth\": \"cmVnaXN0cnl1c2VyOlZlZWFtMTIzIQ==\",\n          \"email\": \"mail@company.com\"\n      }\n  }\n}<\/textarea><\/div>\n<p>&nbsp;<\/p>\n<p><a href=\"https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap06.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-1354\" src=\"https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap06-300x113.jpg\" alt=\"\" width=\"462\" height=\"174\" srcset=\"https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap06-200x75.jpg 200w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap06-300x113.jpg 300w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap06-400x151.jpg 400w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap06-600x226.jpg 600w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap06.jpg 691w\" sizes=\"(max-width: 462px) 100vw, 462px\" \/><\/a><\/p>\n<ul>\n<li>En primer lugar indicamos la URL de acceso a nuestro Private Container\u00a0 Registry, en mi caso https:\/\/minio.homelab.local:5000<\/li>\n<li>Luego, en auth proveemos un string username:password codificado en base64, y que utilizaremos para proveer las credenciales.\u00a0 Para obtener este string, ejecutamos el siguiente comando indicando el username y password requeridos:<\/li>\n<\/ul>\n<style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-2 > .CodeMirror, .fusion-syntax-highlighter-2 > .CodeMirror .CodeMirror-gutters {background-color:var(--awb-color1);}.fusion-syntax-highlighter-2 > .CodeMirror .CodeMirror-gutters { background-color: var(--awb-color2); }.fusion-syntax-highlighter-2 > .CodeMirror .CodeMirror-linenumber { color: var(--awb-color8); }<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-2 fusion-syntax-highlighter-theme-light\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:var(--awb-color3);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_2\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_2\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_2\" data-readOnly=\"nocursor\" data-lineNumbers=\"1\" data-lineWrapping=\"\" data-theme=\"default\" data-mode=\"text\/x-sh\">echo -n 'registryuser:password' | base64<\/textarea><\/div>\n<p>&nbsp;<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Subir_imagenes_al_Private_Container_Registry\"><\/span>Subir imagenes al Private Container Registry<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>El siguiente paso, es subir las imagenes requeridas para la instalaci\u00f3n de Kasten, a nuestro Private Container\u00a0 Registry.\u00a0 Para esto, necesitamos obviamente una maquina con acceso a internet y al Private Container Registry.\u00a0 Claramente no puede ser ninguno de los servidores Kubernetes, ya que estos estando en modo Air Gap no tienen conexi\u00f3n a Internet, pero es posible utilizar cualquier otra maquina que cuenta con el Docker Client y acceso a Internet y al Private Container Registry.<\/p>\n<ul>\n<li>En primer lugar, podemos listar todas las imagenes utilizadas por la versi\u00f3n actual de Kasten K10.\u00a0\u00a0 Esto puede ser de utilidad si hay un requerimiento de a\u00f1adir un tag a las imagenes de K10 antes de subirlas (push) manualmente al Private Registry.\u00a0\u00a0 En nuestro caso no es requerido, por lo que solo lo ejecutamos de manera informativa:<\/li>\n<\/ul>\n<style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-3 > .CodeMirror, .fusion-syntax-highlighter-3 > .CodeMirror .CodeMirror-gutters {background-color:var(--awb-color1);}.fusion-syntax-highlighter-3 > .CodeMirror .CodeMirror-gutters { background-color: var(--awb-color2); }.fusion-syntax-highlighter-3 > .CodeMirror .CodeMirror-linenumber { color: var(--awb-color8); }<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-3 fusion-syntax-highlighter-theme-light\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:var(--awb-color3);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_3\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_3\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_3\" data-readOnly=\"nocursor\" data-lineNumbers=\"1\" data-lineWrapping=\"\" data-theme=\"default\" data-mode=\"text\/x-sh\">docker run --rm -it -v \/var\/run\/docker.sock:\/var\/run\/docker.sock \\\n    gcr.io\/kasten-images\/k10offline:5.0.0 pull images<\/textarea><\/div>\n<p>&nbsp;<\/p>\n<p><a href=\"https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap07.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-1355\" src=\"https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap07-300x179.jpg\" alt=\"\" width=\"442\" height=\"264\" srcset=\"https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap07-200x119.jpg 200w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap07-300x179.jpg 300w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap07-400x239.jpg 400w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap07-600x358.jpg 600w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap07-768x458.jpg 768w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap07-800x477.jpg 800w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap07-1024x611.jpg 1024w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap07-1200x716.jpg 1200w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap07.jpg 1314w\" sizes=\"(max-width: 442px) 100vw, 442px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<ul>\n<li>Luego, con el siguiente comando ejecutaremos la herramienta k10offline, junto con el uso de docker-in-docker, para descargar todas las imagenes de Kasten K10 en el Private Container Registry.\u00a0 Durante el proceso, este comando descargar\u00e1 (pull) todas las imagenes de Kasten K10 desde los repositorios por defecto a trav\u00e9s de internet, se le aplicar\u00e1 un tag para utilizar el Private Container Registry (minio.homelab.local:5000), y luego ser\u00e1n cargadas (push) en el Private Container Registry especificado.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-4 > .CodeMirror, .fusion-syntax-highlighter-4 > .CodeMirror .CodeMirror-gutters {background-color:var(--awb-color1);}.fusion-syntax-highlighter-4 > .CodeMirror .CodeMirror-gutters { background-color: var(--awb-color2); }.fusion-syntax-highlighter-4 > .CodeMirror .CodeMirror-linenumber { color: var(--awb-color8); }<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-4 fusion-syntax-highlighter-theme-light\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:var(--awb-color3);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_4\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_4\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_4\" data-readOnly=\"nocursor\" data-lineNumbers=\"1\" data-lineWrapping=\"\" data-theme=\"default\" data-mode=\"text\/x-sh\">docker run --rm -ti -v \/var\/run\/docker.sock:\/var\/run\/docker.sock \\\n    -v ${HOME}\/.docker:\/root\/.docker \\\n    gcr.io\/kasten-images\/k10offline:5.0.0 pull images --newrepo minio.homelab.local:5000<\/textarea><\/div>\n<p>&nbsp;<\/p>\n<p><a href=\"https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap08.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-1356\" src=\"https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap08-300x160.jpg\" alt=\"\" width=\"598\" height=\"319\" srcset=\"https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap08-200x107.jpg 200w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap08-300x160.jpg 300w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap08-400x214.jpg 400w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap08-600x321.jpg 600w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap08-768x411.jpg 768w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap08-800x428.jpg 800w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap08-1024x548.jpg 1024w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap08-1200x642.jpg 1200w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap08.jpg 1408w\" sizes=\"(max-width: 598px) 100vw, 598px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>Ya con estos pasos hemos podido copiar exitosamente las images requeridas por Kasten K10 a nuestro Private Container Registry.\u00a0 Con esto, ya podemos proceder con el despliegue de Kasten K10, lo cual en nuestro caso lo realizaremos en un cluster Kubernetes on-premises, y utilizando <strong>metallb<\/strong> como Load Balancer para proveer acceso al dashboard de Kasten K10.<\/p>\n<p>&nbsp;<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Instalar_Kasten_K10\"><\/span>Instalar Kasten K10<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Como ya hemos visto en publicaci\u00f3nes anteriores, es necesario previamente haber creado el namespace donde instalaremos Kasten, en nuestro caso crearemos el Namespace llamado kasten-io<\/p>\n<style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-5 > .CodeMirror, .fusion-syntax-highlighter-5 > .CodeMirror .CodeMirror-gutters {background-color:var(--awb-color1);}.fusion-syntax-highlighter-5 > .CodeMirror .CodeMirror-gutters { background-color: var(--awb-color2); }.fusion-syntax-highlighter-5 > .CodeMirror .CodeMirror-linenumber { color: var(--awb-color8); }<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-5 fusion-syntax-highlighter-theme-light\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:var(--awb-color3);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_5\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_5\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_5\" data-readOnly=\"nocursor\" data-lineNumbers=\"1\" data-lineWrapping=\"\" data-theme=\"default\" data-mode=\"text\/x-sh\">kubectl create namespace kasten-io<\/textarea><\/div>\n<p>&nbsp;<\/p>\n<p>Ya en este punto podemos comenzar con la instalaci\u00f3n de Kasten K10, para lo cual ejecutaremos el siguiente comando:<\/p>\n<style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-6 > .CodeMirror, .fusion-syntax-highlighter-6 > .CodeMirror .CodeMirror-gutters {background-color:var(--awb-color1);}.fusion-syntax-highlighter-6 > .CodeMirror .CodeMirror-gutters { background-color: var(--awb-color2); }.fusion-syntax-highlighter-6 > .CodeMirror .CodeMirror-linenumber { color: var(--awb-color8); }<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-6 fusion-syntax-highlighter-theme-light\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:var(--awb-color3);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_6\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_6\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_6\" data-readOnly=\"nocursor\" data-lineNumbers=\"1\" data-lineWrapping=\"\" data-theme=\"default\" data-mode=\"text\/x-sh\">kubectl create namespace kasten-io\n\nhelm install k10 kasten\/k10 --namespace kasten-io \\\n    --set global.airgapped.repository=minio.homelab.local:5000 \\\n    --set secrets.dockerConfig=$(base64 -w 0 < ${HOME}\/.docker\/config.json) \\\n    --set global.imagePullSecret=\"k10-ecr\"  \\\n    --set metering.mode=airgap \\\n    --set externalGateway.create=true \\\n    --set auth.tokenAuth.enabled=true<\/textarea><\/div>\n<p>&nbsp;<\/p>\n<p>En este comando vemos los siguientes parametros:<\/p>\n<ul>\n<li>Parametro para el uso de un Private Container Registry (en este caso llamado minio.homelab.local:5000).\n<ul>\n<li><strong>Importante<\/strong>: Esto por si mismo no activa el modo Air-Gap de Kasten K10, sino que simplemente selecciona el uso de un Registry local.\u00a0 Es decir, podemos utilizar un Private Container Registry, aun si tenemos acceso a internet desde el cluster Kubernetes.<\/li>\n<li>set global.airgapped.repository=minio.homelab.local:5000<\/li>\n<\/ul>\n<\/li>\n<li>En caso de que el Private Container Registry requiera autenticaci\u00f3n, proveer acceso al fichero config.json que contenga las credenciales requeridas (ver en pasos previos) utilizando los siguientes parametros.\n<ul>\n<li>set secrets.dockerConfig=$(base64 -w 0 &lt; ${HOME}\/.docker\/config.json)<\/li>\n<\/ul>\n<\/li>\n<li>El Helm chart de Kasten por defecto crea un secreto llamado &#8220;k10-erc&#8221; con los valores indicados en el parametro <em>secrets.dockerConfig<\/em>.\u00a0 Para que este secreto sea utilizado al momento de que se obtengan las imagenes (pull) desde el Private Container Registry, debemos incluir el siguiente parametro.\n<ul>\n<li>set global.imagePullSecret=&#8221;k10-ecr&#8221;<\/li>\n<\/ul>\n<\/li>\n<li>Para ejecutar Kasten K10 en una red sin acceso a Internet, necesitamos habilitar el modo Air-Gap de K10 con el siguiente parametro.\n<ul>\n<li>set metering.mode=airgap<\/li>\n<li><strong>Importante<\/strong>: Si no incluimos este parametro al desplegar Kasten en un cluster K8s en modo Air Gap, algunas funcionalidades ser\u00e1n deshabilitadas, incluyendo la validaci\u00f3n de licencias.\u00a0 Adicionalmente nos encontraremos con multiples mensajes de errores.<\/li>\n<\/ul>\n<\/li>\n<li>Parametro que permite utilizar Load Balancer para acceso externo\n<ul>\n<li>set externalGateway.create=true<\/li>\n<\/ul>\n<\/li>\n<li>Parametro opcional para especificar el tipo de autenticaci\u00f3n. En este caso, utilizaremos autenticaci\u00f3n basada en tokens como hemos hecho previamente en otros ejemplos de instalaci\u00f3n de <a href=\"https:\/\/patriciocerda.com\/?cat=25\" target=\"_blank\" rel=\"noopener\">Kasten<\/a>.\n<ul>\n<li>set auth.tokenAuth.enabled=true<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p><a href=\"https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap09.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-1357 aligncenter\" src=\"https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap09-300x176.jpg\" alt=\"\" width=\"545\" height=\"320\" srcset=\"https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap09-200x117.jpg 200w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap09-300x176.jpg 300w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap09-400x234.jpg 400w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap09-600x352.jpg 600w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap09-768x450.jpg 768w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap09-800x469.jpg 800w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap09-1024x600.jpg 1024w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap09-1200x703.jpg 1200w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap09.jpg 1531w\" sizes=\"(max-width: 545px) 100vw, 545px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>Vemos que Kasten se ha instalado exitosamente, y que podemos acceder via browser a trav\u00e9s de la IP provista por el Load balancer. En mi caso, http:\/\/172.20.0.151\/k10\/#\/<\/p>\n<p><a href=\"https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap10.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-1358\" src=\"https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap10-300x274.jpg\" alt=\"\" width=\"372\" height=\"340\" srcset=\"https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap10-200x183.jpg 200w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap10-300x274.jpg 300w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap10-400x365.jpg 400w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap10-600x548.jpg 600w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap10-768x701.jpg 768w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap10-800x731.jpg 800w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap10-1024x935.jpg 1024w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap10.jpg 1153w\" sizes=\"(max-width: 372px) 100vw, 372px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>Queda ahora obtener token para poder autenticarnos en Kasten K10 utilizando los siguientes comandos:<\/p>\n<style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-7 > .CodeMirror, .fusion-syntax-highlighter-7 > .CodeMirror .CodeMirror-gutters {background-color:var(--awb-color1);}.fusion-syntax-highlighter-7 > .CodeMirror .CodeMirror-gutters { background-color: var(--awb-color2); }.fusion-syntax-highlighter-7 > .CodeMirror .CodeMirror-linenumber { color: var(--awb-color8); }<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-7 fusion-syntax-highlighter-theme-light\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:var(--awb-color3);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_7\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_7\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_7\" data-readOnly=\"nocursor\" data-lineNumbers=\"1\" data-lineWrapping=\"\" data-theme=\"default\" data-mode=\"text\/x-sh\">sa_secret=$(kubectl get serviceaccount k10-k10 -o jsonpath=\"{.secrets[0].name}\" --namespace kasten-io)\nkubectl get secret $sa_secret --namespace kasten-io -ojsonpath=\"{.data.token}{'\\n'}\" | base64 --decode<\/textarea><\/div>\n<p>&nbsp;<\/p>\n<p>Copiamos el token de seguridad que nos entrega el comando, y lo pegamos en el navegador:<\/p>\n<p><a href=\"https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap11.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-1359\" src=\"https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap11-300x38.jpg\" alt=\"\" width=\"647\" height=\"82\" srcset=\"https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap11-200x25.jpg 200w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap11-300x38.jpg 300w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap11-400x50.jpg 400w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap11-600x75.jpg 600w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap11-768x96.jpg 768w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap11-800x100.jpg 800w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap11-1024x128.jpg 1024w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap11-1200x150.jpg 1200w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap11-1536x192.jpg 1536w\" sizes=\"(max-width: 647px) 100vw, 647px\" \/><\/a><\/p>\n<p><a href=\"https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap12.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-1360\" src=\"https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap12-300x279.jpg\" alt=\"\" width=\"525\" height=\"488\" srcset=\"https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap12-200x186.jpg 200w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap12-300x279.jpg 300w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap12-400x371.jpg 400w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap12-600x557.jpg 600w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap12-768x713.jpg 768w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap12-800x743.jpg 800w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap12-1024x951.jpg 1024w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap12.jpg 1093w\" sizes=\"(max-width: 525px) 100vw, 525px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>Con esto, completamos la instalaci\u00f3n de Kasten en modo Air Gap, luego de lo cual podemos continuar con la <a title=\"Kasten \u2013 Configuraci\u00f3n inicial de K10\" href=\"https:\/\/patriciocerda.com\/?p=1205\" target=\"_blank\" rel=\"noopener\">configuraci\u00f3n inicial de Kasten<\/a>, para luego crear <a title=\"Kasten \u2013 Protegiendo aplicaciones con Kasten K10\" href=\"https:\/\/patriciocerda.com\/?p=1208\" target=\"_blank\" rel=\"noopener\">politicas de respaldo<\/a> para proteger nuestras aplicaciones:<\/p>\n<p><a href=\"https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap13-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-1361\" src=\"https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap13-300x137.jpg\" alt=\"\" width=\"600\" height=\"274\" srcset=\"https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap13-200x91.jpg 200w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap13-300x137.jpg 300w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap13-400x183.jpg 400w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap13-600x274.jpg 600w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap13-768x351.jpg 768w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap13-800x366.jpg 800w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap13-1024x468.jpg 1024w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap13-1200x549.jpg 1200w, https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap13-1536x703.jpg 1536w\" sizes=\"(max-width: 600px) 100vw, 600px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>Como ven, no es proceso extremadamente complejo ante un escenario que es bastante com\u00fan en despliegues de Kubernetes en entornos de producci\u00f3n.\u00a0 Nos vemos en otra ocasi\u00f3n!!!<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hola a todos, bienvenidos a una nueva publicaci\u00f3n acerca de<\/p>\n","protected":false},"author":1,"featured_media":1363,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[25,27],"tags":[37,33,32,29,31,38,30],"aioseo_notices":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Kasten - Desplegar Kasten en modo Air-Gap - vLatam<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/patriciocerda.com\/?p=1353\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Kasten - Desplegar Kasten en modo Air-Gap - vLatam\" \/>\n<meta property=\"og:description\" content=\"Hola a todos, bienvenidos a una nueva publicaci\u00f3n acerca de\" \/>\n<meta property=\"og:url\" content=\"https:\/\/patriciocerda.com\/?p=1353\" \/>\n<meta property=\"og:site_name\" content=\"vLatam\" \/>\n<meta property=\"article:published_time\" content=\"2022-06-07T14:48:54+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap-1024x576.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"576\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"pcerda\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"pcerda\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/patriciocerda.com\/?p=1353\",\"url\":\"https:\/\/patriciocerda.com\/?p=1353\",\"name\":\"Kasten - Desplegar Kasten en modo Air-Gap - vLatam\",\"isPartOf\":{\"@id\":\"https:\/\/patriciocerda.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/patriciocerda.com\/?p=1353#primaryimage\"},\"image\":{\"@id\":\"https:\/\/patriciocerda.com\/?p=1353#primaryimage\"},\"thumbnailUrl\":\"https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap.png\",\"datePublished\":\"2022-06-07T14:48:54+00:00\",\"author\":{\"@id\":\"https:\/\/patriciocerda.com\/#\/schema\/person\/613aa192d7dbcedcd20e08318891aa2a\"},\"breadcrumb\":{\"@id\":\"https:\/\/patriciocerda.com\/?p=1353#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/patriciocerda.com\/?p=1353\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/patriciocerda.com\/?p=1353#primaryimage\",\"url\":\"https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap.png\",\"contentUrl\":\"https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap.png\",\"width\":3840,\"height\":2160},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/patriciocerda.com\/?p=1353#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/patriciocerda.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Kasten &#8211; Desplegar Kasten en modo Air-Gap\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/patriciocerda.com\/#website\",\"url\":\"https:\/\/patriciocerda.com\/\",\"name\":\"vLatam\",\"description\":\"El Blog de Patricio Cerda\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/patriciocerda.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/patriciocerda.com\/#\/schema\/person\/613aa192d7dbcedcd20e08318891aa2a\",\"name\":\"pcerda\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/patriciocerda.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/patriciocerda.com\/wp-content\/litespeed\/avatar\/ce92117b9294544adeaad229a8fbac13.jpg?ver=1776772888\",\"contentUrl\":\"https:\/\/patriciocerda.com\/wp-content\/litespeed\/avatar\/ce92117b9294544adeaad229a8fbac13.jpg?ver=1776772888\",\"caption\":\"pcerda\"},\"url\":\"https:\/\/patriciocerda.com\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Kasten - Desplegar Kasten en modo Air-Gap - vLatam","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/patriciocerda.com\/?p=1353","og_locale":"en_US","og_type":"article","og_title":"Kasten - Desplegar Kasten en modo Air-Gap - vLatam","og_description":"Hola a todos, bienvenidos a una nueva publicaci\u00f3n acerca de","og_url":"https:\/\/patriciocerda.com\/?p=1353","og_site_name":"vLatam","article_published_time":"2022-06-07T14:48:54+00:00","og_image":[{"width":1024,"height":576,"url":"https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap-1024x576.png","type":"image\/png"}],"author":"pcerda","twitter_card":"summary_large_image","twitter_misc":{"Written by":"pcerda","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/patriciocerda.com\/?p=1353","url":"https:\/\/patriciocerda.com\/?p=1353","name":"Kasten - Desplegar Kasten en modo Air-Gap - vLatam","isPartOf":{"@id":"https:\/\/patriciocerda.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/patriciocerda.com\/?p=1353#primaryimage"},"image":{"@id":"https:\/\/patriciocerda.com\/?p=1353#primaryimage"},"thumbnailUrl":"https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap.png","datePublished":"2022-06-07T14:48:54+00:00","author":{"@id":"https:\/\/patriciocerda.com\/#\/schema\/person\/613aa192d7dbcedcd20e08318891aa2a"},"breadcrumb":{"@id":"https:\/\/patriciocerda.com\/?p=1353#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/patriciocerda.com\/?p=1353"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/patriciocerda.com\/?p=1353#primaryimage","url":"https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap.png","contentUrl":"https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap.png","width":3840,"height":2160},{"@type":"BreadcrumbList","@id":"https:\/\/patriciocerda.com\/?p=1353#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/patriciocerda.com\/"},{"@type":"ListItem","position":2,"name":"Kasten &#8211; Desplegar Kasten en modo Air-Gap"}]},{"@type":"WebSite","@id":"https:\/\/patriciocerda.com\/#website","url":"https:\/\/patriciocerda.com\/","name":"vLatam","description":"El Blog de Patricio Cerda","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/patriciocerda.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/patriciocerda.com\/#\/schema\/person\/613aa192d7dbcedcd20e08318891aa2a","name":"pcerda","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/patriciocerda.com\/#\/schema\/person\/image\/","url":"https:\/\/patriciocerda.com\/wp-content\/litespeed\/avatar\/ce92117b9294544adeaad229a8fbac13.jpg?ver=1776772888","contentUrl":"https:\/\/patriciocerda.com\/wp-content\/litespeed\/avatar\/ce92117b9294544adeaad229a8fbac13.jpg?ver=1776772888","caption":"pcerda"},"url":"https:\/\/patriciocerda.com\/?author=1"}]}},"jetpack_featured_media_url":"https:\/\/patriciocerda.com\/wp-content\/uploads\/2022\/06\/K10AirGap.png","_links":{"self":[{"href":"https:\/\/patriciocerda.com\/index.php?rest_route=\/wp\/v2\/posts\/1353"}],"collection":[{"href":"https:\/\/patriciocerda.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/patriciocerda.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/patriciocerda.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/patriciocerda.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1353"}],"version-history":[{"count":2,"href":"https:\/\/patriciocerda.com\/index.php?rest_route=\/wp\/v2\/posts\/1353\/revisions"}],"predecessor-version":[{"id":1364,"href":"https:\/\/patriciocerda.com\/index.php?rest_route=\/wp\/v2\/posts\/1353\/revisions\/1364"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/patriciocerda.com\/index.php?rest_route=\/wp\/v2\/media\/1363"}],"wp:attachment":[{"href":"https:\/\/patriciocerda.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1353"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/patriciocerda.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1353"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/patriciocerda.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1353"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}