{"id":35941,"date":"2019-10-31T22:07:41","date_gmt":"2019-10-31T19:07:41","guid":{"rendered":"https:\/\/prohoster.info\/blog\/chto-zhe-takoe-gitops\/"},"modified":"2019-10-31T22:07:41","modified_gmt":"2019-10-31T19:07:41","slug":"chto-zhe-takoe-gitops","status":"publish","type":"post","link":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/chto-zhe-takoe-gitops","title":{"rendered":"\u00bfQu\u00e9 es GitOps?","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><i><b>Nota de traducci\u00f3n.<\/b>: Tras una reciente publicaci\u00f3n <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/456754\/\">material<\/a><\/noindex> sobre los m\u00e9todos pull y push en GitOps, hemos observado un inter\u00e9s en este modelo en general; sin embargo, ha habido muy pocas publicaciones en ruso sobre este tema (pr\u00e1cticamente no hay en Habr). Por lo tanto, estamos contentos de ofrecerles la traducci\u00f3n de otro art\u00edculo, \u00a1aunque ya tenga casi un a\u00f1o! \u2014 de la empresa Weaveworks, cuyo fundador acu\u00f1\u00f3 el t\u00e9rmino \u00abGitOps\u00bb. En el texto se explica la esencia del enfoque y las diferencias clave con respecto a lo que ya existe.<\/i><\/p>\n<p>\nHace un a\u00f1o publicamos <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/gitops-operations-by-pull-request\">una introducci\u00f3n a GitOps<\/a><\/noindex>. En ese momento, contamos c\u00f3mo el equipo de Weaveworks lanz\u00f3 un SaaS completamente basado en Kubernetes y desarroll\u00f3 un conjunto de mejores pr\u00e1cticas prescriptivas para implementar, administrar y monitorear en un entorno cloud native.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>El art\u00edculo result\u00f3 ser popular. Otras personas comenzaron a hablar sobre GitOps y a publicar nuevas herramientas para <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/hasura\/gitkube\">git push<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/dzone.com\/articles\/weaveworks-gitops-developer-toolkit-part-one-skaff\">desarrollo<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/storing-secure-sealed-secrets-using-gitops\">secretos<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/blog.alexellis.io\/introducing-openfaas-cloud\/\">funciones<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/jenkins.io\/blog\/2018\/03\/19\/introducing-jenkins-x\/\">la integraci\u00f3n continua<\/a><\/noindex> etc. En nuestro sitio web aparecieron <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/category\/gitops\/\">una gran cantidad de<\/a><\/noindex> publicaciones y casos de uso de GitOps. Pero algunas personas todav\u00eda ten\u00edan preguntas. \u00bfEn qu\u00e9 se diferencia el modelo del tradicional <noindex><a rel=\"nofollow\" href=\"https:\/\/puppet.com\/blog\/a-deployment-pipeline-for-infrastructure-a-devops-case-study-at-nbn\">infrastructure as code<\/a><\/noindex> y la entrega continua (<noindex><a rel=\"nofollow\" href=\"https:\/\/puppet.com\/blog\/a-deployment-pipeline-for-infrastructure-a-devops-case-study-at-nbn\">continuous delivery<\/a><\/noindex>)? \u00bfEs necesario usar Kubernetes?<\/p>\n<p>Pronto nos dimos cuenta de que necesit\u00e1bamos una nueva descripci\u00f3n que ofreciera:<\/p>\n<ol>\n<li> Una gran cantidad de ejemplos e historias;<\/li>\n<li> Una definici\u00f3n concreta de GitOps;<\/li>\n<li> Una comparaci\u00f3n con la entrega continua tradicional.<\/li>\n<\/ol>\n<p>\nEn este art\u00edculo intentamos abordar todos estos temas. Encontrar\u00e1s una introducci\u00f3n actualizada a GitOps y una perspectiva desde los desarrolladores y CI\/CD. Principalmente nos centramos en Kubernetes, aunque el modelo se puede generalizar.<\/p>\n<h2>Conozcan: GitOps<\/h2>\n<p>\nImagina a Alicia. Ella dirige una empresa llamada Family Insurance, que ofrece p\u00f3lizas de seguro de salud, autom\u00f3viles, bienes ra\u00edces y seguros de viaje a personas que est\u00e1n demasiado ocupadas como para entender los matices de los contratos por s\u00ed solas. Su negocio comenz\u00f3 como un proyecto paralelo, mientras Alicia trabajaba en un banco como cient\u00edfica de datos. Un d\u00eda se dio cuenta de que pod\u00eda utilizar algoritmos computacionales avanzados para analizar datos de manera m\u00e1s eficiente y crear paquetes de seguros. Los inversores financieron el proyecto, y ahora su empresa genera m\u00e1s de 20 millones de d\u00f3lares al a\u00f1o y est\u00e1 creciendo r\u00e1pidamente. En este momento, cuenta con 180 empleados en diferentes posiciones. Entre ellos est\u00e1 el equipo tecnol\u00f3gico, que se encarga del desarrollo, mantenimiento del sitio web, la base de datos y el an\u00e1lisis de la base de clientes. Este equipo de 60 personas est\u00e1 liderado por Bob, el director t\u00e9cnico de la empresa.<\/p>\n<p>El equipo de Bob despliega sistemas de producci\u00f3n en la nube. Sus principales aplicaciones funcionan en GKE, aprovechando las ventajas de Kubernetes en Google Cloud. Adem\u00e1s, utilizan diversas herramientas para el manejo de datos y an\u00e1lisis.<\/p>\n<p>Family Insurance no ten\u00eda la intenci\u00f3n de utilizar contenedores, pero se contagi\u00f3 del entusiasmo por Docker. Pronto, los especialistas de la empresa descubrieron que GKE permite desplegar cl\u00fasteres para probar nuevas funciones de manera f\u00e1cil y sin complicaciones. Se a\u00f1adieron Jenkins para CI y Quay para organizar el registro de contenedores, y se escribieron scripts para Jenkins que env\u00edan nuevas im\u00e1genes y configuraciones a GKE.<\/p>\n<p>Pas\u00f3 alg\u00fan tiempo. Alice y Bob estaban decepcionados con el rendimiento del enfoque elegido y su impacto en el negocio. La implementaci\u00f3n de contenedores no mejor\u00f3 el rendimiento tanto como esperaba el equipo. A veces, los despliegues fallaban y no estaba claro si los cambios de c\u00f3digo eran los culpables. Tambi\u00e9n result\u00f3 dif\u00edcil rastrear los cambios en las configuraciones. A menudo hab\u00eda que crear un nuevo cl\u00faster y mover aplicaciones a \u00e9l, ya que era la forma m\u00e1s sencilla de lidiar con el desorden en el que se hab\u00eda convertido el sistema. Alice tem\u00eda que la situaci\u00f3n empeorara a medida que la aplicaci\u00f3n evolucionaba (adem\u00e1s, un nuevo proyecto basado en aprendizaje autom\u00e1tico estaba en marcha). Bob hab\u00eda automatizado gran parte del trabajo y no entend\u00eda por qu\u00e9 el pipeline segu\u00eda siendo inestable, ten\u00eda una mala escalabilidad y, de vez en cuando, requer\u00eda intervenci\u00f3n manual.<\/p>\n<p><b>Entonces conocieron GitOps. Esta soluci\u00f3n result\u00f3 ser justo lo que necesitaban para avanzar con confianza.<\/b><\/p>\n<p>Alice y Bob hab\u00edan estado escuchando sobre flujos de trabajo basados en Git, DevOps e infraestructura como c\u00f3digo durante varios a\u00f1os. La singularidad de GitOps es que aporta una serie de mejores pr\u00e1cticas \u2014espec\u00edficas y normativas\u2014 para implementar estas ideas en el contexto de Kubernetes. Este tema <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/search?q=gitops&amp;src=typd\">ha sido discutido en repetidas ocasiones<\/a><\/noindex>, incluso en el <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/gitops-high-velocity-cicd-for-kubernetes\">blog de Weaveworks.<\/a><\/noindex>.<\/p>\n<p>Family Insurance decide implementar GitOps. Ahora la empresa tiene un modelo de operaci\u00f3n automatizado, compatible con Kubernetes y que combina <i>rapidez<\/i> para <i>con estabilidad<\/i>, ya que ellos:<\/p>\n<ul>\n<li> descubrieron que la productividad del equipo se hab\u00eda duplicado y nadie se estaba volviendo loco;<\/li>\n<li> dejaron de mantener scripts. En cambio, ahora pueden concentrarse en nuevas funciones y mejorar los m\u00e9todos de ingenier\u00eda, por ejemplo, implementar despliegues canarios y mejorar las pruebas;<\/li>\n<li> mejoraron el proceso de despliegue: ahora rara vez falla;<\/li>\n<li> obtuvieron la capacidad de restaurar despliegues tras fallos parciales sin intervenci\u00f3n manual;<\/li>\n<li> adquirieron una<i>mayor audiencia.<\/i>mayor confianza en los sistemas de entrega. Alice y Bob descubrieron que pod\u00edan dividir al equipo en grupos que se enfocan en microservicios y trabajan en paralelo;<\/li>\n<li> pueden hacer entre 30 y 50 cambios en el proyecto cada d\u00eda gracias al esfuerzo de cada grupo y probar nuevas t\u00e9cnicas.<\/li>\n<li> atraen f\u00e1cilmente a nuevos desarrolladores al proyecto, quienes pueden implementar actualizaciones en producci\u00f3n mediante pull requests en pocas horas;<\/li>\n<li> facilitan la auditor\u00eda en el marco de SOC2 <i>(sobre la conformidad de los proveedores de servicios con los requisitos de gesti\u00f3n segura de datos; para m\u00e1s detalles, lea, por ejemplo, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.imperva.com\/learn\/data-security\/soc-2-compliance\/\">aqu\u00ed<\/a><\/noindex> \u2014 nota del traductor)<\/i>.<\/li>\n<\/ul>\n<p><\/p>\n<h3>\u00bfQu\u00e9 sucedi\u00f3?<\/h3>\n<p>\nGitOps son dos cosas:<\/p>\n<ol>\n<li> Un modelo operativo para Kubernetes y cloud native. Proporciona un conjunto de mejores pr\u00e1cticas para la implementaci\u00f3n, gesti\u00f3n y supervisi\u00f3n de cl\u00fasteres y aplicaciones empaquetadas en contenedores. Una elegante definici\u00f3n en forma <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/vitorsilva\/status\/999978906903080961\">de una sola diapositiva<\/a><\/noindex> desde <noindex><a rel=\"nofollow\" href=\"https:\/\/2018.agilept.org\/speaker_luis_faceira.html\">Luis Faceira<\/a><\/noindex>:\n<\/li>\n<li> El camino hacia la creaci\u00f3n de un entorno orientado a desarrolladores para la gesti\u00f3n de aplicaciones. Aplicamos un flujo de trabajo de Git tanto a la operaci\u00f3n como al desarrollo. Tenga en cuenta que no se trata solo de un Git push, sino de la organizaci\u00f3n de todo el conjunto de herramientas CI\/CD y UI\/UX.<\/li>\n<\/ol>\n<p><\/p>\n<h3>Unas palabras sobre Git<\/h3>\n<p>\nSi no est\u00e1 familiarizado con los sistemas de control de versiones y el flujo de trabajo basado en Git, le recomendamos encarecidamente que los estudie. Al principio, trabajar con ramas y pull requests puede parecer magia negra, pero los beneficios valen el esfuerzo. Aqu\u00ed est\u00e1 <noindex><a rel=\"nofollow\" href=\"https:\/\/codeburst.io\/trunk-based-development-vs-git-flow-a0212a6cae64\">un buen art\u00edculo<\/a><\/noindex> para empezar.<\/p>\n<h2>C\u00f3mo funciona Kubernetes<\/h2>\n<p>\nEn nuestra historia, Alice y Bob se acercaron a GitOps despu\u00e9s de haber trabajado un tiempo con Kubernetes. De hecho, GitOps est\u00e1 estrechamente relacionado con Kubernetes: es un modelo operativo para infraestructuras y aplicaciones basadas en Kubernetes.<\/p>\n<h3>\u00bfQu\u00e9 ofrece Kubernetes a los usuarios?<\/h3>\n<p>\nAqu\u00ed hay algunas caracter\u00edsticas clave:<\/p>\n<ol>\n<li> En el modelo de Kubernetes, todo se puede describir en forma declarativa.<\/li>\n<li> El servidor API de Kubernetes acepta esa declaraci\u00f3n como entrada y luego intenta constantemente llevar el cl\u00faster al estado descrito en la declaraci\u00f3n.<\/li>\n<li> Las declaraciones son suficientes para describir y gestionar una amplia variedad de cargas de trabajo \u2014 'aplicaciones'.<\/li>\n<li> Como resultado, los cambios en la aplicaci\u00f3n y el cl\u00faster ocurren debido a:\n<ul>\n<li> cambios en las im\u00e1genes de los contenedores;<\/li>\n<li> cambios en la especificaci\u00f3n declarativa;<\/li>\n<li> errores en el entorno \u2014 por ejemplo, ca\u00eddas de contenedores.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p><\/p>\n<h3>Las maravillosas capacidades de convergencia de Kubernetes<\/h3>\n<p>\nCuando un administrador realiza cambios en la configuraci\u00f3n, el orquestador de Kubernetes aplicar\u00e1 esos cambios al cl\u00faster hasta que su estado <i>se acerque a la nueva configuraci\u00f3n<\/i>. Este modelo funciona para cualquier recurso de Kubernetes y se ampl\u00eda mediante Custom Resource Definitions (CRDs). Por lo tanto, los despliegues de Kubernetes tienen las siguientes propiedades maravillosas:<\/p>\n<ul>\n<li> <b>Automatizaci\u00f3n<\/b>: las actualizaciones de Kubernetes proporcionan un mecanismo para automatizar el proceso de aplicar cambios de manera correcta y oportuna.<\/li>\n<li> <b>Convergencia<\/b>: Kubernetes seguir\u00e1 intentando actualizaciones hasta lograr el \u00e9xito.<\/li>\n<li> <b>Idempotencia<\/b>: las reaplicaciones de convergencia conducen al mismo resultado.<\/li>\n<li> <b>Determinismo<\/b>: dada la suficiencia de recursos, el estado del cl\u00faster actualizado depende \u00fanicamente del estado deseado.<\/li>\n<\/ul>\n<p><\/p>\n<h2>C\u00f3mo funciona GitOps<\/h2>\n<p>\nHemos aprendido lo suficiente sobre Kubernetes como para explicar los principios de funcionamiento de GitOps.<\/p>\n<p>Volvamos a los equipos de Family Insurance relacionados con microservicios. \u00bfCon qu\u00e9 suelen lidiar? Mire la lista a continuaci\u00f3n (si algunos puntos le parecen extra\u00f1os o desconocidos, por favor, abst\u00e9ngase de criticar y qu\u00e9dese con nosotros). Son solo ejemplos de flujos de trabajo basados en Jenkins. Tambi\u00e9n existen muchos otros procesos al trabajar con otras herramientas.<\/p>\n<p>Lo principal es que vemos que cada actualizaci\u00f3n termina con cambios en los archivos de configuraci\u00f3n y los repositorios de Git. Estos cambios en Git hacen que el 'operador GitOps' actualice el cl\u00faster:<\/p>\n<p>1. Flujo de trabajo: '<i>Construcci\u00f3n de Jenkins \u2014 rama master<\/i>\u00bb.<br \/>\nLista de tareas:<\/p>\n<ul>\n<li> Jenkins env\u00eda im\u00e1genes etiquetadas a Quay;<\/li>\n<li> Jenkins env\u00eda la configuraci\u00f3n y los Helm charts al bucket del master storage;<\/li>\n<li> Una funci\u00f3n en la nube copia la configuraci\u00f3n y los charts del bucket del almacenamiento master al repositorio Git master;<\/li>\n<li> El operador GitOps actualiza el cl\u00faster.<\/li>\n<\/ul>\n<p>\n2. <i>Construcci\u00f3n de Jenkins \u2014 rama release o hotfix<\/i>:<\/p>\n<ul>\n<li> Jenkins env\u00eda im\u00e1genes no etiquetadas a Quay;<\/li>\n<li> Jenkins env\u00eda la configuraci\u00f3n y los Helm charts al bucket del staging storage;<\/li>\n<li> Una funci\u00f3n en la nube copia la configuraci\u00f3n y los charts del bucket del almacenamiento staging al repositorio Git staging;<\/li>\n<li> El operador GitOps actualiza el cl\u00faster.<\/li>\n<\/ul>\n<p>\n3. <i>Construcci\u00f3n de Jenkins \u2014 rama develop o feature<\/i>:<\/p>\n<ul>\n<li> Jenkins env\u00eda im\u00e1genes no etiquetadas a Quay;<\/li>\n<li> Jenkins env\u00eda la configuraci\u00f3n y los Helm charts al bucket del develop storage;<\/li>\n<li> Una funci\u00f3n en la nube copia la configuraci\u00f3n y los charts del bucket del almacenamiento develop al repositorio Git develop;<\/li>\n<li>El operador GitOps actualiza el cl\u00faster.<\/li>\n<\/ul>\n<p>\n4. <i>Agregar un nuevo cliente<\/i>:<\/p>\n<ul>\n<li> El gerente o administrador (LCM\/ops) llama a Gradle para el despliegue inicial y la configuraci\u00f3n de los balanceadores de carga de red (NLB);<\/li>\n<li> LCM\/ops commitea una nueva configuraci\u00f3n para preparar el despliegue para las actualizaciones;<\/li>\n<li> El operador GitOps actualiza el cl\u00faster.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Descripci\u00f3n breve de GitOps<\/h3>\n<p><\/p>\n<ol>\n<li> Describa el estado deseado de todo el sistema utilizando especificaciones declarativas para cada entorno (en nuestra historia, el equipo de Bob define toda la configuraci\u00f3n del sistema en Git).\n<ul>\n<li> El repositorio de Git es la \u00fanica fuente de verdad respecto al estado deseado de todo el sistema.<\/li>\n<li> Todos los cambios en el estado deseado se realizan mediante commits en Git.<\/li>\n<li> Todos los par\u00e1metros deseados del cl\u00faster tambi\u00e9n son observables en el propio cl\u00faster. As\u00ed podemos determinar si coinciden (convergen, <i>converge<\/i>) o difieren (divergen, <i>diverge<\/i>) el estado deseado y el observado.<\/li>\n<\/ul>\n<\/li>\n<li> Si el estado deseado y el observado difieren, entonces:\n<ul>\n<li> existe un mecanismo de convergencia que, tarde o temprano, sincronizar\u00e1 autom\u00e1ticamente el estado objetivo y el observado. Dentro del cl\u00faster, esto lo maneja Kubernetes.<\/li>\n<li> El proceso se inicia inmediatamente con una notificaci\u00f3n de \"cambio cometido\".<\/li>\n<li> Despu\u00e9s de un intervalo de tiempo configurable, se puede enviar una notificaci\u00f3n de \"diferencia\" si los estados difieren.<\/li>\n<\/ul>\n<\/li>\n<li> As\u00ed, todos los commits en Git provocan actualizaciones verificables e idempotentes en el cl\u00faster.\n<ul>\n<li>Un rollback es una convergencia hacia un estado deseado anterior.<\/li>\n<\/ul>\n<\/li>\n<li> La convergencia es definitiva. Su ocurrencia se indica por:\n<ul>\n<li> La ausencia de notificaciones de \"diferencia\" durante un intervalo de tiempo determinado.<\/li>\n<li> Una notificaci\u00f3n de \"convergido\" (por ejemplo, webhook, evento de escritura de Git).<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p><\/p>\n<h3>\u00bfQu\u00e9 es la divergencia?<\/h3>\n<p>\nRepitamos una vez m\u00e1s: <i>todas las propiedades deseadas del cl\u00faster deben ser observables en el propio cl\u00faster.<\/i>.<\/p>\n<p>Algunos ejemplos de divergencia:<\/p>\n<ul>\n<li> Cambio en el archivo de configuraci\u00f3n debido a la fusi\u00f3n de ramas en Git.<\/li>\n<li> Cambio en el archivo de configuraci\u00f3n debido a un commit en Git realizado por un cliente GUI.<\/li>\n<li> M\u00faltiples cambios en el estado deseado debido a un PR en Git, seguido de la creaci\u00f3n de una imagen de contenedor y cambios en la configuraci\u00f3n.<\/li>\n<li> Cambio en el estado del cl\u00faster debido a un error, conflicto de recursos que lleva a un \"mal comportamiento\", o simplemente un desv\u00edo accidental del estado original.<\/li>\n<\/ul>\n<p><\/p>\n<h3>\u00bfQu\u00e9 representa el mecanismo de convergencia?<\/h3>\n<p>\nAlgunos ejemplos:<\/p>\n<ul>\n<li> Para contenedores y cl\u00fasteres, el mecanismo de convergencia es proporcionado por Kubernetes.<\/li>\n<li> El mismo mecanismo se puede utilizar para gestionar aplicaciones y construcciones basadas en Kubernetes (por ejemplo, Istio y Kubeflow).<\/li>\n<li> El mecanismo para gestionar la interacci\u00f3n de trabajo entre Kubernetes, los repositorios de im\u00e1genes y Git proporciona <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/weaveworks\/flux\">el operador GitOps Weave Flux<\/a><\/noindex>, que forma parte de <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.weave.works\/\">Weave Cloud<\/a><\/noindex>.<\/li>\n<li> Para las m\u00e1quinas b\u00e1sicas, el mecanismo de convergencia debe ser declarativo y aut\u00f3nomo. Desde nuestra experiencia, podemos decir que <noindex><a rel=\"nofollow\" href=\"https:\/\/blog.gruntwork.io\/why-we-use-terraform-and-not-chef-puppet-ansible-saltstack-or-cloudformation-7989dad2865c\">Terraform<\/a><\/noindex> se acerca m\u00e1s a esta definici\u00f3n, sin embargo, todav\u00eda requiere supervisi\u00f3n humana. En este sentido, GitOps ampl\u00eda las tradiciones de Infrastructure as Code.<\/li>\n<\/ul>\n<p>\nGitOps une Git con un magn\u00edfico mecanismo de convergencia de Kubernetes, ofreciendo un modelo para la operaci\u00f3n.<\/p>\n<p>GitOps nos permite afirmar: <i>solo aquellos sistemas que pueden ser descritos y observados son susceptibles de automatizaci\u00f3n y control<\/i>.<\/p>\n<h3>GitOps est\u00e1 destinado a toda la pila cloud native (por ejemplo, Terraform, etc.)<\/h3>\n<p>\nGitOps no es solo Kubernetes. Queremos que todo el sistema se gestione de forma declarativa y utilice la convergencia. Por todo el sistema nos referimos al conjunto de entornos que trabajan con Kubernetes, como 'dev cluster 1', 'producci\u00f3n', etc. Cada entorno incluye m\u00e1quinas, cl\u00fasteres, aplicaciones y tambi\u00e9n interfaces para servicios externos que proporcionan datos, monitoreo, etc.<\/p>\n<p>Observe cu\u00e1n importante es Terraform para el problema de arranque. Kubernetes debe estar desplegado en alg\u00fan lugar, y usar Terraform significa que podemos aplicar los mismos flujos de trabajo de GitOps para crear la capa de gesti\u00f3n que subyace a Kubernetes y las aplicaciones. Esta es una buena pr\u00e1ctica \u00fatil.<\/p>\n<p>Se presta gran atenci\u00f3n a la aplicaci\u00f3n de los conceptos de GitOps a las capas por encima de Kubernetes. Actualmente, existen soluciones de tipo GitOps para Istio, Helm, Ksonnet, OpenFaaS y Kubeflow, as\u00ed como, por ejemplo, para Pulumi, que crean una capa para el desarrollo de aplicaciones cloud native.<\/p>\n<h2>Kubernetes CI\/CD: comparaci\u00f3n de GitOps con otros enfoques<\/h2>\n<p>\nComo se mencion\u00f3, GitOps son dos cosas:<\/p>\n<ol>\n<li> Un modelo operativo para Kubernetes y cloud native, como se describi\u00f3 anteriormente.<\/li>\n<li> El camino hacia la organizaci\u00f3n de un entorno orientado a desarrolladores para la gesti\u00f3n de aplicaciones.<\/li>\n<\/ol>\n<p>\nPara muchos, GitOps es ante todo un flujo de trabajo basado en Git pushes. A nosotros tambi\u00e9n nos gusta. Pero no es todo: ahora veamos los pipelines de CI\/CD.<\/p>\n<h3>GitOps proporciona despliegue continuo (CD) para Kubernetes<\/h3>\n<p>\nGitOps ofrece un mecanismo de despliegue continuo que elimina la necesidad de 'sistemas de gesti\u00f3n de despliegues' separados. Todo el trabajo lo realiza Kubernetes por usted.<\/p>\n<ul>\n<li> Actualizar una aplicaci\u00f3n requiere una actualizaci\u00f3n en Git. Esta es una actualizaci\u00f3n transaccional al estado deseado. El 'despliegue' se lleva a cabo dentro del cl\u00faster por Kubernetes mismo, bas\u00e1ndose en la descripci\u00f3n actualizada.<\/li>\n<li> Debido a la naturaleza del funcionamiento de Kubernetes, estas actualizaciones son convergentes. Esto proporciona un mecanismo para el despliegue continuo, donde todas las actualizaciones son at\u00f3micas.<\/li>\n<li> Nota: <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.weave.works\/\">Weave Cloud<\/a><\/noindex> ofrece un operador GitOps que integra Git y Kubernetes, permitiendo realizar CD al alinear el estado deseado con el estado actual del cl\u00faster.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Sin kubectl y scripts<\/h3>\n<p>\nSe debe evitar el uso de kubectl para actualizar el cl\u00faster, especialmente los scripts para agrupar comandos de kubectl. En su lugar, mediante un pipeline GitOps, el usuario puede actualizar su cl\u00faster de Kubernetes a trav\u00e9s de Git.<\/p>\n<p>Las ventajas incluyen:<\/p>\n<ol>\n<li> <b>Precisi\u00f3n<\/b>. Un grupo de actualizaciones puede aplicarse, converger y finalmente validarse, acerc\u00e1ndonos al objetivo de un despliegue at\u00f3mico. En contraste, el uso de scripts no garantiza ninguna convergencia (m\u00e1s sobre esto a continuaci\u00f3n).<\/li>\n<li> <b>Seguridad<\/b>. <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/kelseyhightower\/status\/939003832805179392?lang=en\">Citando<\/a><\/noindex> Kelsey Hightower: \"Limite el acceso al cl\u00faster de Kubernetes a herramientas de automatizaci\u00f3n y administradores cuya responsabilidad sea depurarlo o mantenerlo en funcionamiento\". Ver tambi\u00e9n <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/gitops-compliance-and-secure-cicd\">mi publicaci\u00f3n<\/a><\/noindex> sobre seguridad y cumplimiento de especificaciones, as\u00ed como <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/@vesirin\/how-i-gained-commit-access-to-homebrew-in-30-minutes-2ae314df03ab\">un art\u00edculo sobre la vulneraci\u00f3n de Homebrew<\/a><\/noindex> a trav\u00e9s del robo de credenciales de un script de Jenkins descuidado.<\/li>\n<li> <b>Experiencia del usuario<\/b>. Kubectl expone la mec\u00e1nica del modelo de objetos de Kubernetes, que es bastante compleja. En ideal, los usuarios deben interactuar con el sistema en un nivel de mayor abstracto. Aqu\u00ed nuevamente cito a Kelsey y recomiendo ver <noindex><a rel=\"nofollow\" href=\"http:\/\/superuser.openstack.org\/articles\/kubernetes-boring\/\">un resumen<\/a><\/noindex>.<\/li>\n<\/ol>\n<p><\/p>\n<h3>La diferencia entre CI y CD<\/h3>\n<p>\nGitOps mejora los modelos existentes de CI\/CD.<\/p>\n<p>Un servidor de CI moderno es una herramienta para la orquestaci\u00f3n. En particular, es una herramienta para orquestar pipelines de CI. Incluyen build, test, merge to trunk, etc. Los servidores de CI automatizan la gesti\u00f3n de pipelines complejos y multietapa. La tentaci\u00f3n com\u00fan es crear un script para un conjunto de actualizaciones de Kubernetes y ejecutarlo como parte de un pipeline para hacer push de cambios en el cl\u00faster. De hecho, muchos especialistas hacen eso. Sin embargo, esto no es \u00f3ptimo, y aqu\u00ed est\u00e1 el porqu\u00e9.<\/p>\n<p>CI debe utilizarse para realizar actualizaciones en trunk, y el cl\u00faster de Kubernetes debe ajustarse en funci\u00f3n de estas actualizaciones para gestionar CD \"internamente\". Lo llamamos <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/gitops-compliance-and-secure-cicd\">modelo de pull para CD<\/a><\/noindex>, a diferencia del modelo push de CI. CD es parte de <i>orquestaci\u00f3n en tiempo de ejecuci\u00f3n<\/i>.<\/p>\n<h3>Por qu\u00e9 los servidores CI no deber\u00edan realizar CD mediante actualizaciones directas en Kubernetes<\/h3>\n<p>\n<i>No utilices el servidor CI para orquestar actualizaciones directas en Kubernetes como un conjunto de tareas de CI. Este es un anti-patr\u00f3n, del cual hablamos <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/kubernetes-anti-patterns-let-s-do-gitops-not-ciops\">ya hemos hablado<\/a><\/noindex> en nuestro blog.<\/i><\/p>\n<p>Volvamos a Alicia y Bob.<\/p>\n<p>\u00bfQu\u00e9 problemas enfrentaron? El servidor CI de Bob aplica cambios al cl\u00faster, pero si falla en el proceso, Bob no sabr\u00e1 en qu\u00e9 estado est\u00e1 (o deber\u00eda estar) el cl\u00faster y c\u00f3mo corregirlo. Lo mismo se aplica en caso de \u00e9xito.<\/p>\n<p>Supongamos que el equipo de Bob construy\u00f3 una nueva imagen y luego parche\u00f3 sus despliegues para desplegar la imagen (todo esto desde el pipeline de CI).<\/p>\n<p>Si la imagen se construye correctamente, pero la tuber\u00eda falla, el equipo tendr\u00e1 que averiguar:<\/p>\n<ul>\n<li> \u00bfSe implement\u00f3 la actualizaci\u00f3n?<\/li>\n<li> \u00bfEstamos ejecutando una nueva construcci\u00f3n? \u00bfEsto conducir\u00e1 a efectos secundarios no deseados, con la posibilidad de obtener dos construcciones de la misma imagen inalterada? <\/li>\n<li> \u00bfDeber\u00edamos esperar a la pr\u00f3xima actualizaci\u00f3n antes de ejecutar la construcci\u00f3n?<\/li>\n<li> \u00bfQu\u00e9 sali\u00f3 mal exactamente? \u00bfQu\u00e9 pasos hay que repetir (y cu\u00e1les de ellos se pueden repetir de manera segura)?<\/li>\n<\/ul>\n<p>\n<i>Organizar un flujo de trabajo basado en Git no garantiza que el equipo de Bob no se enfrente a estos problemas. A\u00fan pueden cometer errores con el push de un commit, con una etiqueta o cualquier otro par\u00e1metro; sin embargo, este enfoque es mucho m\u00e1s cercano al todo o nada expl\u00edcito.<\/i><\/p>\n<p>En resumen, aqu\u00ed est\u00e1n las razones por las que los servidores CI no deben encargarse de CD:<\/p>\n<ul>\n<li> Los scripts de actualizaci\u00f3n no siempre son deterministas; es f\u00e1cil cometer errores en ellos.<\/li>\n<li> Los servidores CI no convergen hacia un modelo declarativo del cl\u00faster.<\/li>\n<li> Es dif\u00edcil garantizar la idempotencia. Los usuarios deben comprender la sem\u00e1ntica profunda del sistema.<\/li>\n<li> Es m\u00e1s dif\u00edcil realizar una recuperaci\u00f3n despu\u00e9s de una falla parcial.<\/li>\n<\/ul>\n<p>\n<i>Nota sobre Helm: si desea utilizar Helm, recomendamos combinarlo con un operador de GitOps, como <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/managing-helm-releases-the-gitops-way\">Flux-Helm<\/a><\/noindex>. Esto ayudar\u00e1 a garantizar la convergencia. Helm por s\u00ed solo no es determinista ni at\u00f3mico.<\/i><\/p>\n<h2>GitOps como la mejor manera de realizar Entrega Continua para Kubernetes<\/h2>\n<p>\nEl equipo de Alice y Bob implementa GitOps y descubre que es mucho m\u00e1s f\u00e1cil trabajar con productos de software, mantener un alto rendimiento y estabilidad. Terminemos este art\u00edculo con ilustraciones que muestren c\u00f3mo se ve su nuevo enfoque. Tenga en cuenta que principalmente hablamos de aplicaciones y servicios, sin embargo, GitOps se puede utilizar para gestionar toda la plataforma.<\/p>\n<h3>Modelo de operaci\u00f3n para Kubernetes<\/h3>\n<p>\nMire el siguiente diagrama. Representa a Git y el repositorio de im\u00e1genes de contenedores como recursos compartidos para dos ciclos de vida orquestados:<\/p>\n<ul>\n<li> El pipeline de integraci\u00f3n continua, que lee y escribe archivos en Git y puede actualizar el repositorio de im\u00e1genes de contenedores.<\/li>\n<li> El pipeline de Runtime GitOps, que combina despliegue con gesti\u00f3n y observabilidad. Lee y escribe archivos en Git y puede cargar im\u00e1genes de contenedores.<\/li>\n<\/ul>\n<h3>\u00bfCu\u00e1les son las principales conclusiones?<\/h3>\n<p><\/p>\n<ol>\n<li> <b>Divisi\u00f3n de problemas<\/b>: Tenga en cuenta que ambos pipelines pueden intercambiar datos solo actualizando Git o el repositorio de im\u00e1genes. En otras palabras, existe un cortafuegos entre la CI y el entorno de ejecuci\u00f3n. Lo llamamos \"cortafuegos de inmutabilidad\" <i>(immutability firewall)<\/i>, ya que todas las actualizaciones de los repositorios crean nuevas versiones. Para informaci\u00f3n adicional sobre este tema, consulte las diapositivas 72-87. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.slideshare.net\/weaveworks\/continuous-lifecycle-london-2018-event-keynote-97418556\">esta presentaci\u00f3n<\/a><\/noindex>.<\/li>\n<li> <b>Se puede utilizar cualquier servidor CI y Git<\/b>: GitOps funciona con cualquier componente. Puede seguir utilizando sus servidores CI y Git favoritos, repositorios de im\u00e1genes y conjuntos de pruebas. Casi todas las dem\u00e1s herramientas de Continuous Delivery en el mercado requieren su propio servidor CI\/Git o repositorio de im\u00e1genes. Esto puede convertirse en un factor limitante en el desarrollo de cloud native. En el caso de GitOps, puede usar las herramientas con las que ya est\u00e1 familiarizado.<\/li>\n<li> <b>Eventos como herramienta de integraci\u00f3n<\/b>: Tan pronto como los datos en Git se actualizan, Weave Flux (o el operador Weave Cloud) notifica al runtime. Cada vez que Kubernetes acepta un conjunto de cambios, Git se actualiza. Esto proporciona un modelo de integraci\u00f3n sencillo para organizar flujos de trabajo para GitOps, como se muestra a continuaci\u00f3n.<\/li>\n<\/ol>\n<h2>Conclusi\u00f3n<\/h2>\n<p>\nGitOps proporciona garant\u00edas significativas de actualizaci\u00f3n necesarias para cualquier herramienta moderna de CI\/CD:<\/p>\n<ul>\n<li> automatizaci\u00f3n;<\/li>\n<li> convergencia;<\/li>\n<li> idempotencia;<\/li>\n<li> determinismo.<\/li>\n<\/ul>\n<p>\nEsto es importante, ya que ofrece un modelo de operaci\u00f3n para desarrolladores en el \u00e1mbito cloud native.<\/p>\n<ul>\n<li> Las herramientas tradicionales para gestionar y monitorizar sistemas est\u00e1n asociadas con equipos de operaciones que funcionan dentro de un runbook <i>(conjunto de procedimientos y operaciones rutinarias \u2014 nota del traductor)<\/i>, vinculado a un despliegue espec\u00edfico.<\/li>\n<li> En la gesti\u00f3n de sistemas cloud native, las herramientas de observaci\u00f3n son la mejor manera de evaluar los resultados de los despliegues, para que el equipo de desarrolladores pueda reaccionar r\u00e1pidamente a ellos.<\/li>\n<\/ul>\n<p>\nImagina m\u00faltiples cl\u00fasteres dispersos en diferentes nubes y numerosos servicios con sus propios equipos y planes de despliegue. GitOps ofrece un modelo invariante a gran escala para gestionar toda esta abundancia.<\/p>\n<h2>P.D. del traductor<\/h2>\n<p>\nTambi\u00e9n puedes leer en nuestro blog:<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/456754\/\">GitOps: comparaci\u00f3n de m\u00e9todos Pull y Push<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/434160\/\">Presentamos la biblioteca kubedog para hacer seguimiento de los recursos de Kubernetes<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/449096\/\">Ampliando y complementando Kubernetes (rese\u00f1a y video de la presentaci\u00f3n)<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<p class=\"for_users_only_msg\">Solo los usuarios registrados pueden participar en la encuesta. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Inicie sesi\u00f3n<\/a><\/noindex>, por favor.<\/p>\n<h2 class=\"default-block__polling-title\">\u00bfSab\u00edas sobre GitOps antes de la aparici\u00f3n de estas dos traducciones en Habr?<\/h2>\n<ul class=\"content-list content-list_polling\">\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    S\u00ed, lo sab\u00eda.<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Solo de manera superficial.<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    No<\/p>\n<\/li>\n<\/ul>\n<p>    35 usuarios votaron. 10 usuarios se abstuvieron.<br \/>\n<br \/>Fuente: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/458878\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u043c. \u043f\u0435\u0440\u0435\u0432.: \u041f\u043e\u0441\u043b\u0435 \u043d\u0435\u0434\u0430\u0432\u043d\u0435\u0439 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u043e \u043c\u0435\u0442\u043e\u0434\u0430\u0445 pull \u0438 push \u0432 GitOps \u043c\u044b \u0443\u0432\u0438\u0434\u0435\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441 \u043a \u044d\u0442\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0432 \u0446\u0435\u043b\u043e\u043c, \u043e\u0434\u043d\u0430\u043a\u043e \u0440\u0443\u0441\u0441\u043a\u043e\u044f\u0437\u044b\u0447\u043d\u044b\u0445 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0439 \u043d\u0430 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0432\u0441\u0435\u043c \u043c\u0430\u043b\u043e (\u043d\u0430 \u0445\u0430\u0431\u0440\u0435 \u0438\u0445 \u043f\u043e\u043f\u0440\u043e\u0441\u0442\u0443 \u043d\u0435\u0442). \u041f\u043e\u0441\u0435\u043c\u0443 \u0440\u0430\u0434\u044b \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u0442\u044c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u2014 \u043f\u0443\u0441\u0442\u044c \u0438 \u0443\u0436\u0435 \u043f\u043e\u0447\u0442\u0438 \u0433\u043e\u0434\u0438\u0447\u043d\u043e\u0439 \u0434\u0430\u0432\u043d\u043e\u0441\u0442\u0438! \u2014 \u043e\u0442 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 Weaveworks, \u0433\u043b\u0430\u0432\u0430 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-35941","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u043c.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/chto-zhe-takoe-gitops\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0427\u0442\u043e \u0436\u0435 \u0442\u0430\u043a\u043e\u0435 GitOps? | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u043c.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/chto-zhe-takoe-gitops\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:07:41+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:07:41+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47\u00bfQu\u00e9 es GitOps? | ProHoster","description":"Ej.","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/chto-zhe-takoe-gitops","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"es_ES","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0427\u0442\u043e \u0436\u0435 \u0442\u0430\u043a\u043e\u0435 GitOps? | ProHoster","og:description":"\u041f\u0440\u0438\u043c.","og:url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/chto-zhe-takoe-gitops","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:07:41+00:00","article:modified_time":"2019-10-31T19:07:41+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"35941","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-22 01:21:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:53:31","updated":"2026-01-22 01:21:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/35941","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=35941"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/35941\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=35941"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=35941"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=35941"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}