{"id":3154,"date":"2023-03-10T09:11:42","date_gmt":"2023-03-10T13:11:42","guid":{"rendered":"https:\/\/arielantigua.com\/weblog\/?p=3154"},"modified":"2023-12-10T08:46:02","modified_gmt":"2023-12-10T12:46:02","slug":"kubeconfig-con-direnv-multiples-clusters-de-kubernetes","status":"publish","type":"post","link":"https:\/\/arielantigua.com\/weblog\/2023\/03\/kubeconfig-con-direnv-multiples-clusters-de-kubernetes\/","title":{"rendered":"kubeconfig con direnv, m\u00faltiples clusters de Kubernetes."},"content":{"rendered":"<p>kubeconfig con direnv, m\u00faltiples clusters de Kubernetes.<\/p>\n<p>Desde la documentaci\u00f3n de Kubernetes:<\/p>\n<blockquote><p><em>Utilice los archivos kubeconfig para organizar la informaci\u00f3n acerca de los cl\u00fasteres, los usuarios, los Namespaces y los mecanismos de autenticaci\u00f3n. La herramienta de l\u00ednea de comandos kubectl utiliza los archivos kubeconfig para hallar la informaci\u00f3n que necesita para escoger un cl\u00faster y comunicarse con el servidor API de un cl\u00faster.<\/em><\/p>\n<p><em>Nota: Un archivo utilizado para configurar el acceso a los cl\u00fasteres se denomina archivo kubeconfig. Esta es una forma gen\u00e9rica de referirse a los archivos de configuraci\u00f3n. Esto no significa que exista un archivo llamado kubeconfig.<\/em><\/p>\n<p><em>Por defecto, kubectl busca un archivo llamado config en el directorio $HOME\/.kube. Puedes especificar otros archivos kubeconfig mediante la configuraci\u00f3n de la variable de entorno KUBECONFIG o mediante la configuraci\u00f3n del flag &#8211;kubeconfig.<\/em><\/p><\/blockquote>\n<p>Cuando contamos con un solo cluster de k8s, es bastante f\u00e1cil conectarse a el usando kubectl con solo colocar el archivo <strong>config<\/strong> en <strong>.kube<\/strong> (como dice el texto anterior). \u00bfPero que pasa cuando tenemos varios servidores de k8s con los cuales queremos interactuar para realizar ciertas tareas?<\/p>\n<p><!--more--><\/p>\n<p>Debemos hacer uso de los contextos (<strong><a href=\"https:\/\/kubernetes.io\/es\/docs\/concepts\/configuration\/organize-cluster-access-kubeconfig\/&quot; \\l &quot;contexto\">context<\/a><\/strong>) y movernos de un cluster a otro, esto implica que en archivo <strong>config<\/strong> antes mencionado, tenemos la informaci\u00f3n de mas de un cluster. Para facilitar esta operaci\u00f3n tenemos disponibles varios plugins, uno de estos es <strong>ctx<\/strong> que se puede instalar con <strong>Krew<\/strong>. Yo personalmente me encuentro tedioso mantener el archivo <strong>config<\/strong> (se que tambi\u00e9n existen <strong>plugins<\/strong> para esto.) y muchas veces termino con configuraci\u00f3n de acceso a cluster que ya no existen y que en su momento fueron usados para alguna prueba de configuraci\u00f3n. \u00bfA donde quiero llegar con esto? Creo que hay una forma mas f\u00e1cil, por lo menos para mi.<\/p>\n<p>Tenemos disponible una herramienta llamada <a href=\"https:\/\/direnv.net\/docs\/installation.html\"><strong>direnv<\/strong><\/a>, esta herramienta permite cargar variables de entorno al momento de entrar a un directorio, inmediatamente hacemos cd dentro de un directorio que cuente con un archivo de <a href=\"https:\/\/direnv.net\/docs\/installation.html\">direnv<\/a> (<strong>.envrc<\/strong>), tendremos disponibles variables de entorno para usar y una de esas variables que podemos configurar es kubeconfig.<\/p>\n<p>Desde hace unos d\u00edas estoy estructurando el acceso a varios clusters que tengo de la siguiente manera.<\/p>\n<ol>\n<li>Un directorio con todos los cluster que deseo acceder o tengo acceso a ellos.<\/li>\n<li>En este directorio cada cluster es otro directorio, por ejemplo \u201cansible\u201d es un cluster de k8s que tiene AWX instalado.<\/li>\n<li>Dentro de \u201cansible\u201d esta el archivo config, .envrc y archivos de deploymento ha sean Helm o Kustomize.<\/li>\n<\/ol>\n<p>Dejo una captura de pantalla con la estructura del directorio.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3160\" src=\"https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2023\/03\/Picture1-dir-tree.png\" alt=\"\" width=\"330\" height=\"300\" srcset=\"https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2023\/03\/Picture1-dir-tree.png 330w, https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2023\/03\/Picture1-dir-tree-300x273.png 300w\" sizes=\"auto, (max-width: 330px) 100vw, 330px\" \/><\/p>\n<p>En lo adelante cuando siga provisionando cluster, solo tengo que crear un nuevo directorio, colocar el archivo config y crear un nuevo .envrc con la informaci\u00f3n necesaria.<\/p>\n<p>El contenido de .envrc es:<\/p>\n<p>export KUBECONFIG=\/home\/ariel\/Documents\/kubeclusters\/ansible\/config<\/p>\n<p>importante saber que aqu\u00ed podemos colocar todo tipo de acciones iguales a las que normalmente usamos en nuestro profile, por ejemplo, aliases e incluso un prompt diferente.<\/p>\n<p><a href=\"https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2023\/03\/Screenshot-from-2023-03-10-09-18-10.png\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-3163 size-large\" src=\"https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2023\/03\/Screenshot-from-2023-03-10-09-18-10-1024x457.png\" alt=\"\" width=\"840\" height=\"375\" srcset=\"https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2023\/03\/Screenshot-from-2023-03-10-09-18-10-1024x457.png 1024w, https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2023\/03\/Screenshot-from-2023-03-10-09-18-10-300x134.png 300w, https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2023\/03\/Screenshot-from-2023-03-10-09-18-10-768x342.png 768w, https:\/\/arielantigua.com\/weblog\/wp-content\/uploads\/2023\/03\/Screenshot-from-2023-03-10-09-18-10.png 1034w\" sizes=\"auto, (max-width: 840px) 100vw, 840px\" \/><\/a><\/p>\n<p>Al ejecutar kubectl get nodes, podemos ver que no tenemos respuesta ya que en ese momento kubeconfig esta configurado con un config no funcional, cuando entramos al directorio ansible, se ve que direnv habilita un nuevo valor que sobre-escribe a kubeconfig con el nuevo config del cluster de AWX.<\/p>\n<p><strong>direnv<\/strong> tiene mucho potencial para aquellos usuarios que amamos la terminal!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>kubeconfig con direnv, m\u00faltiples clusters de Kubernetes. Desde la documentaci\u00f3n de Kubernetes: Utilice los archivos kubeconfig para organizar la informaci\u00f3n acerca de los cl\u00fasteres, los usuarios, los Namespaces y los mecanismos de autenticaci\u00f3n. La herramienta de l\u00ednea de comandos kubectl utiliza los archivos kubeconfig para hallar la informaci\u00f3n que necesita para escoger un cl\u00faster y [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7,128],"tags":[],"class_list":["post-3154","post","type-post","status-publish","format-standard","hentry","category-general","category-kubernetes"],"_links":{"self":[{"href":"https:\/\/arielantigua.com\/weblog\/wp-json\/wp\/v2\/posts\/3154","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/arielantigua.com\/weblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/arielantigua.com\/weblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/arielantigua.com\/weblog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/arielantigua.com\/weblog\/wp-json\/wp\/v2\/comments?post=3154"}],"version-history":[{"count":0,"href":"https:\/\/arielantigua.com\/weblog\/wp-json\/wp\/v2\/posts\/3154\/revisions"}],"wp:attachment":[{"href":"https:\/\/arielantigua.com\/weblog\/wp-json\/wp\/v2\/media?parent=3154"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/arielantigua.com\/weblog\/wp-json\/wp\/v2\/categories?post=3154"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/arielantigua.com\/weblog\/wp-json\/wp\/v2\/tags?post=3154"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}