{"id":33989,"date":"2025-04-11T11:41:57","date_gmt":"2025-04-11T09:41:57","guid":{"rendered":"https:\/\/inlab.fib.upc.edu\/?p=33989"},"modified":"2025-05-12T11:08:35","modified_gmt":"2025-05-12T09:08:35","slug":"aplicando-gitops-en-kubernetes-con-argocd","status":"publish","type":"post","link":"https:\/\/inlab.fib.upc.edu\/es\/articulos\/aplicando-gitops-en-kubernetes-con-argocd","title":{"rendered":"Aplicando GitOps en Kubernetes con ArgoCD"},"content":{"rendered":"\n<p>El t\u00e9rmino DevOps hace referencia a la cultura y conjunto de pr\u00e1cticas que pretenden acortar el ciclo de vida de desarrollo del <em>software<\/em> mediante el acercamiento de los equipos de desarrollo y de operaciones, quienes tradicionalmente trabajaban aisladamente. DevOps tiene su origen en las metodolog\u00edas \u00e1giles y se basa principalmente en la automatizaci\u00f3n de las tareas y el monitoreo constante de estas. A ra\u00edz de su aplicaci\u00f3n en distintos \u00e1mbitos, han ido surgiendo otros conceptos parecidos como <em>MLOps, DevSecOps, DataOps<\/em>, etc.&nbsp; As\u00ed, es razonable plantearse: \u00bfEs posible aplicar estos principios a la gesti\u00f3n de la infraestructura?<\/p>\n\n\n\n<p>La respuesta es <strong>S\u00ed. <\/strong>GitOps es una evoluci\u00f3n de DevOps que consiste en el uso de repositorios de Git como \u00fanica fuente de verdad del estado de la infraestructura. Mediante el uso de pr\u00e1cticas y herramientas como <em>infraestructura como c\u00f3digo (IaC) <\/em>o <em>pipelines <\/em>de <em>CI\/CD<\/em>, el objetivo consiste en conseguir que el estado del sistema descrito por el contenido de los ficheros del repositorio coincida exactamente con su estado real. Algunas de las ventajas m\u00e1s destacadas son:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Automatizaci\u00f3n<\/strong>: El c\u00f3digo y configuraciones que conducen al estado actual se encuentran en un repositorio accesible por el equipo de trabajo. En caso de fallo, es posible reproducir autom\u00e1ticamente el estado de la infraestructura.<\/li>\n\n\n\n<li><strong>Transparencia y visibilidad: <\/strong>El propio repositorio de Git sirve como documentaci\u00f3n del estado del sistema. Cualquiera con acceso a este puede conocer con exactitud qu\u00e9 configuraciones se est\u00e1n aplicando, ya que Git act\u00faa como fuente \u00fanica de verdad.<\/li>\n\n\n\n<li><strong>Control de versiones: <\/strong>Git, al ser un sistema de control de versiones, permite registrar cada uno de los cambios realizados en la infraestructura, permitiendo realizar <em>rollbacks<\/em> f\u00e1cilmente en caso de errores o conocer su historial.<\/li>\n<\/ul>\n\n\n\n<p><strong>GitOps y Kubernetes<\/strong><\/p>\n\n\n\n<p>Uno de los puntos clave de Kubernetes es su car\u00e1cter declarativo, es decir, los recursos del cl\u00faster como pueden ser los <em>Pods, Deployments, Ingress, Service<\/em>, etc. pueden ser creados de manera declarativa mediante archivos <em>yaml,<\/em> llamados <em>manifests.<\/em> \u00bfQu\u00e9 pasar\u00eda si se elimina un <em>Ingress<\/em>? Si conservamos su definici\u00f3n, basta con volverlo a aplicar y Kubernetes se encargar\u00e1 de realizar los cambios correspondientes. Pero, \u00bfy si incluso este proceso se pudiera llegar a automatizar, de manera que el propio sistema fuera capaz de detectar qu\u00e9 recursos faltan y recrearlos?<\/p>\n\n\n\n<p>El t\u00e9rmino GitOps se origin\u00f3 en este contexto, pero a\u00fan falta por introducir un componente,&nbsp; \u201cel controlador\u201d. El controlador es el <em>software <\/em>responsable de reconciliar el estado del repositorio con el estado del cl\u00faster. Para ello, el controlador debe poder conectarse al cl\u00faster, monitorizar las definiciones de los recursos existentes y compararlos con aquellos del repositorio. Si el controlador detecta alguna diferencia, este se encargar\u00e1 de sincronizarlos y aplicar las medidas necesarias para solucionarlo, incluyendo tareas como la creaci\u00f3n, eliminaci\u00f3n y actualizaci\u00f3n de recursos.<\/p>\n\n\n\n<p><strong>\u00bfQu\u00e9 es ArgoCD?<\/strong><\/p>\n\n\n\n<p>ArgoCD es una herramienta declarativa de despliegue continuo (CD) que permite implementar GitOps en Kubernetes. ArgoCD consiste en un controlador de Kubernetes que monitoriza continuamente las aplicaciones que se est\u00e1n ejecutando (estado actual) y las compara con el estado deseado. Si estos dos estados difieren, ArgoCD marcar\u00e1 la aplicaci\u00f3n como <em>OutOfSync<\/em> y ofrecer\u00e1 la posibilidad de sincronizarla autom\u00e1ticamente o manualmente a trav\u00e9s de una interfaz web o CLI.&nbsp;<\/p>\n\n\n\n<p><strong>Ejemplo pr\u00e1ctico: Modificando un <\/strong><strong><em>Deployment<\/em><\/strong><\/p>\n\n\n\n<p>Supongamos que queremos gestionar un conjunto de recursos de Kubernetes con GitOps, y para ello queremos usar ArgoCD. Inicialmente, se debe disponer de un repositorio de Git y un cl\u00faster de Kubernetes con ArgoCD instalado. Existen varias formas de instalarlo (por ejemplo Helm). En este caso, se asume que ArgoCD se ha instalado en el mismo cl\u00faster de Kubernetes, aunque esto no tiene por qu\u00e9 siempre ser as\u00ed.&nbsp;<\/p>\n\n\n\n<p>Para este ejemplo, se desplegar\u00e1 el siguiente <em>Deployment<\/em>:&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter is-resized\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXdnNMdKyDSBqGVcG4IuOIodN8FfBYj0Sbrdl711h6SEEA3WoAfqqdcymrX1MYTUMdfd48oSRR0C-qDXImrewG-okHR4WLNTYLx7kAIBSsOBHAhY9q2cnlv_L_sIBYwbGSbLDm0KTrTTfOKdj0aOKt8?key=jJpPycavC8bru09YELydsARG\" alt=\"\" style=\"width:458px;height:auto\"\/><\/figure>\n\n\n\n<p>ArgoCD distingue qu\u00e9 recursos debe gestionar mediante <em>Applications. <\/em>Una <em>Application <\/em>es un <em>Custom Resource (CR)<\/em> propio de ArgoCD que contiene informaci\u00f3n acerca de d\u00f3nde encontrar los <em>manifests <\/em>y d\u00f3nde aplicarlos.&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter is-resized\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXe3H8nVVOqV8vAeFxLx6nS-skeouVLXw1qwM8oBnpzOuJy4qjBmUPqkPUynREzr13KND4nl1xniDkWgL_2kp30Eacl-10rPDyVp7J9OMwUFUHYXjwyFiN1jH0gKj0At8orv5Rx0maVQoVlJcY-S_x4?key=jJpPycavC8bru09YELydsARG\" alt=\"\" style=\"width:693px;height:auto\"\/><\/figure>\n\n\n\n<p>Con esta aplicaci\u00f3n, ArgoCD se configurar\u00e1 de la siguiente manera:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Estado deseado<\/strong>: El directorio <em>manifests <\/em>de la rama <em>main<\/em> del repositorio de Git <em>gitops-workshop.<\/em><\/li>\n\n\n\n<li><strong>Estado actual<\/strong>: El contenido del <em>namespace<\/em> <em>nginx<\/em> del cl\u00faster de Kubernetes d\u00f3nde se encuentra ArgoCD.<em>&nbsp;<\/em><\/li>\n<\/ul>\n\n\n\n<p><em>Nota<\/em>: Las aplicaciones<em> tambi\u00e9n se pueden crear desde la Web UI o la CLI. Ambos m\u00e9todos acaban generando el mismo recurso.&nbsp;<\/em><\/p>\n\n\n\n<p>Accediendo a la interfaz web de ArgoCD se podr\u00e1 observar que se ha creado la aplicaci\u00f3n <em>nginx<\/em>. Aparecer\u00e1 como <em>OutOfSync<\/em>, ya que el <em>deployment<\/em> que hay en el repositorio a\u00fan no existe en el cl\u00faster. Para solucionarlo, hay que clicar en el bot\u00f3n de <em>Sync.<\/em><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXd79GVjeykaYk9h2tpCu68JBJwCQ7k_NtIuEJ0QAg6KbmSikPJ2y_Y91wqsZyyW_36WwYZOLY453qmvvELo_U-97oW-Nn_grCTo5XWzbkjZkOrzH8EQfeNiAfeFo_Xn8bwp7OZlR8GhxW41E0Mtrvo?key=jJpPycavC8bru09YELydsARG\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"has-text-align-left\">Si todo ha ido bien, unos instantes despu\u00e9s la aplicaci\u00f3n pasar\u00e1 a <em>Synced<\/em>, pudi\u00e9ndose verificar c\u00f3mo ArgoCD ha creado el recurso.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXeCIj08-ca5NYat9NBTdoKYCPv_p57_mAt5UEkbkPkSFmLqJElbNOTJNzQzdb_fLWDexqyWgw-W3HouurXCPJ-LrhMQI61V1MLl1zWPpCL7c8mi2MjDSft1h8wFnP96ew1FwuT2tewXrSI6Ybc10H0?key=jJpPycavC8bru09YELydsARG\" alt=\"\"\/><\/figure>\n\n\n\n<p>Para ilustrar el funcionamiento de ArgoCD, se puede modificar alg\u00fan par\u00e1metro del recurso. El siguiente comando reduce el n\u00famero de r\u00e9plicas del <em>deployment <\/em>a 1:<br>$ kubectl scale deploy nginx-deployment &#8211;replicas=1 -n nginx<\/p>\n\n\n\n<p>Al ejecutarlo, veremos como la aplicaci\u00f3n vuelve de nuevo a estar <em>OutOfSync. <\/em>Al clicar en la secci\u00f3n <em>diff<\/em>, podremos comprobar las diferencias entre el estado actual (izquierda) y el estado deseado (derecha).&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXdUb-9qmozCNcMtEKbsRPNOZkiSSZzxlGij67x0OySNnfa0oXJxlX7htynTAPnCvfguqSFouIkkXFz1ZibK-5bOUeXoUwBqlmzUfYrz0YrsRG5amkCQ7qr0cRhzqYWDXZSgEiujerfzfV7NdBm0-Xg?key=jJpPycavC8bru09YELydsARG\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXfuxM-9eIdHi8H5SwN8dzrV3ElB_ilKz-X7q_h_5zo2bfezTXwsB6VeJeqyiKhcmvmNQl_Qk5bN8xaILBdEZJMUnnkdyL13AK0fqKwHilayQXDKTr63H_OTAsKfpUR_3ui0YghdjLy_QlkdWGZlYw?key=jJpPycavC8bru09YELydsARG\" alt=\"\"\/><\/figure>\n\n\n\n<p>Despu\u00e9s de volver a sincronizar<em>,<\/em> ArgoCD restaurar\u00e1 el n\u00famero original de r\u00e9plicas, reconciliando as\u00ed el cl\u00faster con la informaci\u00f3n del repositorio de Git. En consecuencia, cualquier cambio que se desee llevar a cabo debe estar registrado en el repositorio de Git.<\/p>\n\n\n\n<p>ArgoCD ofrece un amplio n\u00famero de posibles configuraciones, como por ejemplo la posibilidad de ignorar cambios en campos espec\u00edficos de algunos recursos, la selecci\u00f3n de distintas maneras de crearlos, la posibilidad de sincronizar autom\u00e1ticamente las aplicaciones, etc. Su documentaci\u00f3n es detallada y contiene informaci\u00f3n acerca de todas sus funcionalidades.<\/p>\n\n\n\n<p><strong>Conclusi\u00f3n<\/strong><\/p>\n\n\n\n<p>Hemos visto en qu\u00e9 consiste el paradigma GitOps y c\u00f3mo se puede llevar a cabo para gestionar cl\u00fasters de Kubernetes mediante ArgoCD. Sin embargo, su aplicaci\u00f3n no est\u00e1 limitada \u00fanicamente a este sector: Debido a las ventajas que ofrece GitOps, en los \u00faltimos a\u00f1os han surgido otras soluciones destinadas a aplicar estas pr\u00e1cticas en otros contextos, como es el despliegue de infraestructura <em>cloud<\/em> con Terraform. Actualmente, GitOps es una realidad consolidada en muchos sistemas IT y es un paradigma recomendado a la hora de iniciar un proyecto de estas caracter\u00edsticas.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>El t\u00e9rmino DevOps hace referencia a la cultura y conjunto de pr\u00e1cticas que pretenden acortar el ciclo de vida de desarrollo del software mediante el acercamiento de los equipos de desarrollo y de operaciones, quienes tradicionalmente trabajaban aisladamente. DevOps tiene su origen en las metodolog\u00edas \u00e1giles y se basa principalmente en la automatizaci\u00f3n de las [&hellip;]<\/p>\n","protected":false},"author":1273,"featured_media":34013,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[496],"tags":[],"experteses":[969],"class_list":["post-33989","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-articulos","experteses-computacion-nube"],"acf":[],"_links":{"self":[{"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/posts\/33989","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/users\/1273"}],"replies":[{"embeddable":true,"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/comments?post=33989"}],"version-history":[{"count":5,"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/posts\/33989\/revisions"}],"predecessor-version":[{"id":34173,"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/posts\/33989\/revisions\/34173"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/media\/34013"}],"wp:attachment":[{"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/media?parent=33989"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/categories?post=33989"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/tags?post=33989"},{"taxonomy":"experteses","embeddable":true,"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/experteses?post=33989"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}