{"id":90272,"date":"2020-07-30T13:42:02","date_gmt":"2020-07-30T11:42:02","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/canary-deployment-v-kubernetes-1-gitlab-ci"},"modified":"2020-07-30T13:42:02","modified_gmt":"2020-07-30T11:42:02","slug":"canary-deployment-v-kubernetes-1-gitlab-ci","status":"publish","type":"post","link":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/canary-deployment-v-kubernetes-1-gitlab-ci","title":{"rendered":"Despliegue Canary en Kubernetes #1: Gitlab CI","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h4 id=\"my-budem-ispolzovat-gitlab-ci-i-ruchnoy-gitops-dlya-vnedreniya-i-ispolzovaniya-canary-deploya-v-kubernetes\">Usaremos Gitlab CI y GitOps manual para implementar y utilizar el despliegue Canary en Kubernetes<\/h4>\n<p>\n<img decoding=\"async\" alt=\"Despliegue Canary en Kubernetes #1: Gitlab CI\" src=\"\/wp-content\/uploads\/2020\/07\/03a53dec150529deb3438efaeaa8a1bd.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h4 id=\"stati-iz-etogo-cikla\">Art\u00edculos de este ciclo:<\/h4>\n<p><\/p>\n<ul>\n<li>(este art\u00edculo)<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/company\/nixys\/blog\/513118\/\">Despliegue Canary mediante ArgoCI<\/a><\/noindex><\/li>\n<li>Despliegue Canary mediante Istio<\/li>\n<li>Despliegue Canary mediante Jenkins-X Istio Flagger<\/li>\n<\/ul>\n<p><\/p>\n<p>Realizaremos el despliegue Canary manualmente a trav\u00e9s de GitOps y la creaci\u00f3n\/modificaci\u00f3n de recursos b\u00e1sicos de Kubernetes. <strong>Este art\u00edculo est\u00e1 destinado principalmente a familiarizarse<\/strong> con el funcionamiento del despliegue Canary en Kubernetes, ya que hay maneras m\u00e1s efectivas de automatizaci\u00f3n que examinaremos en los siguientes art\u00edculos.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\n<img decoding=\"async\" alt=\"Despliegue Canary en Kubernetes #1: Gitlab CI\" src=\"\/wp-content\/uploads\/2020\/07\/d5127cf7dcec695bd8872b1704eb7e90.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/www.norberteder.com\/canary-deployment\/\">https:\/\/www.norberteder.com\/canary-deployment\/<\/a><\/noindex><\/p>\n<p><\/p>\n<h3 id=\"canary-deployment\">Despliegue Canary<\/h3>\n<p><\/p>\n<p>Con la estrategia Canary de actualizaci\u00f3n, primero se aplica solo para una parte de los usuarios. A trav\u00e9s de monitoreo, datos de registros, pruebas manuales u otros canales de retroalimentaci\u00f3n, se prueba el lanzamiento antes de aplicarlo a todos los usuarios.<\/p>\n<p><\/p>\n<h3 id=\"kubernetes-deployment-rolling-update\">Despliegue de Kubernetes (actualizaci\u00f3n progresiva)<\/h3>\n<p><\/p>\n<p>La estrategia predeterminada para el despliegue de Kubernetes es la actualizaci\u00f3n progresiva, donde se ejecuta una cantidad determinada de pods con nuevas versiones de im\u00e1genes. Si se crean sin problemas, los pods con versiones antiguas de las im\u00e1genes se eliminan y se crean nuevos pods en paralelo.<\/p>\n<p><\/p>\n<h3 id=\"gitops\">GitOps<\/h3>\n<p><\/p>\n<p>Utilizamos GitOps en este ejemplo, ya que:<\/p>\n<p><\/p>\n<ul>\n<li>usamos Git como \u00fanica fuente de verdad<\/li>\n<li>utilizamos operaciones de Git para construir y desplegar (no se necesitan comandos, excepto git tag\/merge)<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"primer\">Ejemplo<\/h3>\n<p><\/p>\n<p>Tomemos una buena pr\u00e1ctica: tener un repositorio para el c\u00f3digo de las aplicaciones y otro para la infraestructura.<\/p>\n<p><\/p>\n<h4 id=\"repozitoriy-dlya-prilozheniy\">Repositorio para aplicaciones<\/h4>\n<p><\/p>\n<p>Es una API muy simple en Python+Flask que devuelve una respuesta en formato JSON. Construiremos el paquete a trav\u00e9s de GitlabCI y subiremos el resultado al Registro de Gitlab. En el registro tenemos dos versiones diferentes de lanzamientos:<\/p>\n<p><\/p>\n<ul>\n<li><code>wuestkamp\/k8s-deployment-example-app:v1<\/code><\/li>\n<li><code>wuestkamp\/k8s-deployment-example-app:v2<\/code><\/li>\n<\/ul>\n<p><\/p>\n<p>La \u00fanica diferencia entre ellas es el cambio en el archivo JSON devuelto. Usamos esta aplicaci\u00f3n para visualizar de manera simple con qu\u00e9 versi\u00f3n estamos interactuando.<\/p>\n<p><\/p>\n<h4 id=\"infrastrukturnyy-repozitoriy\">Repositorio de infraestructura<\/h4>\n<p><\/p>\n<p>En este repositorio desplegaremos a trav\u00e9s de GitlabCI en Kubernetes, <code>.gitlab-ci.yml<\/code> se ve de la siguiente manera:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">image: traherom\/kustomize-docker\n\nbefore_script:\n   - printenv\n   - kubectl version\n\nstages:\n - deploy\n\ndeploy test:\n   stage: deploy\n   before_script:\n     - echo $KUBECONFIG\n   script:\n     - kubectl get all\n     - kubectl apply -f i\/k8s\n\n   only:\n     - master\n<\/code><\/pre>\n<p><\/p>\n<p>Para ejecutarlo por su cuenta necesitar\u00e1 un cl\u00faster, puede usar Gcloud:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">gcloud container clusters create canary --num-nodes 3 --zone europe-west3-b\n\ngcloud compute firewall-rules create incoming-80 --allow tcp:80<\/code><\/pre>\n<p><\/p>\n<p>Necesita hacer un fork <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/wuestkamp\/k8s-deployment-example-canary-infrastructure\">https:\/\/gitlab.com\/wuestkamp\/k8s-deployment-example-canary-infrastructure<\/a><\/noindex> y crear una variable <code>KUBECONFIG<\/code> en GitlabCI, que contendr\u00e1 la configuraci\u00f3n para acceder <code>kubectl<\/code> a su cl\u00faster.<\/p>\n<p><\/p>\n<p>Sobre c\u00f3mo obtener las credenciales para el cl\u00faster (Gcloud) puede leer <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/faun\/manually-connect-to-your-kubernetes-cluster-from-the-outside-d852346a7f0a\">aqu\u00ed<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h4 id=\"infrastrukturnyy-yaml\">Yaml de infraestructura<\/h4>\n<p><\/p>\n<p>En el repositorio de infraestructura tenemos un service:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">apiVersion: v1\nkind: Service\nmetadata:\n labels:\n   id: app\n name: app\nspec:\n ports:\n - port: 80\n   protocol: TCP\n   targetPort: 5000\n selector:\n   id: app\n type: LoadBalancer<\/code><\/pre>\n<p><\/p>\n<p>Y el deployment en <code>deploy.yaml<\/code>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">apiVersion: apps\/v1\nkind: Deployment\nmetadata:\n name: app\nspec:\n replicas: 10\n selector:\n   matchLabels:\n     id: app\n     type: main\n template:\n   metadata:\n     labels:\n       id: app\n       type: main\n   spec:\n     containers:\n     - image: registry.gitlab.com\/wuestkamp\/k8s-deployment-example-app:v1\n       name: app\n       resources:\n         limits:\n           cpu: 100m\n           memory: 100Mi<\/code><\/pre>\n<p><\/p>\n<p>Y otro deployment en <code>deploy-canary.yaml<\/code>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">kind: Deployment\nmetadata:\n name: app-canary\nspec:\n replicas: 0\n selector:\n   matchLabels:\n     id: app\n     type: canary\n template:\n   metadata:\n     labels:\n       id: app\n       type: canary\n   spec:\n     containers:\n     - image: registry.gitlab.com\/wuestkamp\/k8s-deployment-example-app:v2\n       name: app\n       resources:\n         limits:\n           cpu: 100m\n           memory: 100Mi<\/code><\/pre>\n<p><\/p>\n<p>Tenga en cuenta que app-deploy a\u00fan no tiene r\u00e9plicas definidas.<\/p>\n<p><\/p>\n<h4 id=\"vypolnenie-nachalnogo-deploya\">Ejecuci\u00f3n del despliegue inicial<\/h4>\n<p><\/p>\n<p>Para iniciar el despliegue inicial, puede ejecutar el pipeline de GitlabCI manualmente en la rama maestra. Despu\u00e9s de esto, <code>kubectl<\/code> deber\u00eda mostrar lo siguiente:<\/p>\n<p>\n<img decoding=\"async\" alt=\"Despliegue Canary en Kubernetes #1: Gitlab CI\" src=\"\/wp-content\/uploads\/2020\/07\/e8ea95fe6c3925f46f6430ce2293063c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<p>Vemos <code>app<\/code> un deployment con 10 r\u00e9plicas y app-canary con 0. Tambi\u00e9n hay un LoadBalancer desde el cual podemos acceder a trav\u00e9s de <code>curl<\/code> por IP externa:<\/p>\n<p><\/p>\n<p><code>while true; do curl -s 35.198.149.232 | grep label; sleep 0.1; done<\/code><\/p>\n<p>\n<img decoding=\"async\" alt=\"Despliegue Canary en Kubernetes #1: Gitlab CI\" src=\"\/wp-content\/uploads\/2020\/07\/06e6928002532dbe03b65356964110c7.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<p>Vemos que nuestra aplicaci\u00f3n de prueba devuelve solo \u201cv1\u201d.<\/p>\n<p><\/p>\n<h3 id=\"vypolnenie-canary-deploya\">Ejecuci\u00f3n del despliegue Canary<\/h3>\n<p><\/p>\n<h4 id=\"shag-1-vypustit-novuyu-versiyu-dlya-chasti-polzovateley\">Paso 1: lanzar una nueva versi\u00f3n para parte de los usuarios<\/h4>\n<p><\/p>\n<p>Hemos establecido el n\u00famero de r\u00e9plicas en 1 en el archivo deploy-canary.yaml y la imagen de nueva versi\u00f3n:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">kind: Deployment\nmetadata:\n name: app-canary\nspec:\n replicas: 1\n selector:\n   matchLabels:\n     id: app\n     type: canary\n template:\n   metadata:\n     labels:\n       id: app\n       type: canary\n   spec:\n     containers:\n     - image: registry.gitlab.com\/wuestkamp\/k8s-deployment-example-app:v2\n       name: app\n       resources:\n         limits:\n           cpu: 100m\n           memory: 100Mi<\/code><\/pre>\n<p><\/p>\n<p>En el archivo <code>deploy.yaml<\/code> hemos cambiado el n\u00famero de r\u00e9plicas a 9:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">kind: Deployment\nmetadata:\n name: app\nspec:\n replicas: 9\n selector:\n   matchLabels:\n     id: app\n...<\/code><\/pre>\n<p><\/p>\n<p>Estamos subiendo estos cambios al repositorio desde el cual se iniciar\u00e1 el despliegue (a trav\u00e9s de GitlabCI) y vemos al final:<\/p>\n<p>\n<img decoding=\"async\" alt=\"Despliegue Canary en Kubernetes #1: Gitlab CI\" src=\"\/wp-content\/uploads\/2020\/07\/b639716b31e41e8eac573fd365ad6780.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<p>Nuestro Service apuntar\u00e1 a ambos deployments, ya que ambos tienen el selector app. Debido a la distribuci\u00f3n aleatoria por defecto en Kubernetes, deber\u00edamos ver diferentes respuestas en aproximadamente el 10% de las solicitudes:<\/p>\n<p>\n<img decoding=\"async\" alt=\"Despliegue Canary en Kubernetes #1: Gitlab CI\" src=\"\/wp-content\/uploads\/2020\/07\/d1177207ebd8952fd1994ed0ebdda6a3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<p>El estado actual de nuestra aplicaci\u00f3n (GitOps, tomado de Git como fuente \u00fanica de verdad) es tener dos deployments con r\u00e9plicas activas, uno para cada versi\u00f3n.<\/p>\n<p><\/p>\n<p>~10% de los usuarios se familiarizan con una nueva versi\u00f3n y la prueban inadvertidamente. Ahora es el momento de revisar los registros y los datos de monitoreo para detectar problemas.<\/p>\n<p><\/p>\n<h4 id=\"shag-2-vypustit-novuyu-versiyu-dlya-vseh-polzovateley\">Paso 2: lanzar una nueva versi\u00f3n para todos los usuarios<\/h4>\n<p><\/p>\n<p>Decidimos que todo ha ido bien y ahora necesitamos desplegar la nueva versi\u00f3n para todos los usuarios. Para ello, simplemente actualizamos <code>deploy.yaml<\/code> instalando la nueva versi\u00f3n de la imagen y estableciendo el n\u00famero de r\u00e9plicas en 10. En <code>deploy-canary.yaml<\/code> estamos configurando el n\u00famero de r\u00e9plicas de nuevo en 0. Despu\u00e9s del despliegue, el resultado ser\u00e1 el siguiente:<\/p>\n<p>\n<img decoding=\"async\" alt=\"Despliegue Canary en Kubernetes #1: Gitlab CI\" src=\"\/wp-content\/uploads\/2020\/07\/a31aafe96a09c6d2651b2bf7add4dd29.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3 id=\"podvodya-itog\">Resumiendo<\/h3>\n<p><\/p>\n<p>Para m\u00ed, realizar un despliegue manual de esta manera ayuda a entender lo f\u00e1cil que se puede configurar con k8s. Dado que Kubernetes permite actualizar todo a trav\u00e9s de API, estos pasos se pueden automatizar mediante scripts.<\/p>\n<p><\/p>\n<p>Otra cosa a implementar es un punto de entrada para el tester (LoadBalancer o a trav\u00e9s de Ingress), a trav\u00e9s del cual se puede acceder \u00fanicamente a la nueva versi\u00f3n. Esto puede ser utilizado para visualizarlo manualmente.<\/p>\n<p><\/p>\n<p>En los pr\u00f3ximos art\u00edculos, revisaremos otras soluciones automatizadas que implementan la mayor\u00eda de lo que hemos hecho.<\/p>\n<p><\/p>\n<h2 id=\"takzhe-chitayte-drugie-stati-v-nashem-bloge\">Tambi\u00e9n lee otros art\u00edculos en nuestro blog:<\/h2>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/nixys\/blog\/468779\/\">Qu\u00e9 result\u00f3 de la migraci\u00f3n de ClickHouse sin autenticaci\u00f3n a ClickHouse con autenticaci\u00f3n<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/nixys\/blog\/473578\/\">Compilaci\u00f3n de m\u00f3dulos din\u00e1micos para Nginx<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/nixys\/news\/t\/502658\/\">Actualizaci\u00f3n de nxs-build-tools \u2014 asistente en la construcci\u00f3n de paquetes deb y rpm<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/nixys\/blog\/473014\/\">Introducci\u00f3n a la Autorizaci\u00f3n de Kubernetes de Hashicorp Consul<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/nixys\/blog\/504762\/\">Con qu\u00e9 nos encontramos al usar la herramienta Csync2<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/nixys\/blog\/347526\/\">Telegram-bot para Redmine. C\u00f3mo simplificar la vida a uno mismo y a los dem\u00e1s<\/a><\/noindex><\/li>\n<\/ul>\n<p>Fuente: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/nixys\/blog\/512766\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Gitlab CI \u0438 \u0440\u0443\u0447\u043d\u043e\u0439 GitOps \u0434\u043b\u044f \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f Canary-\u0434\u0435\u043f\u043b\u043e\u044f \u0432 Kubernetes \u0421\u0442\u0430\u0442\u044c\u0438 \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430: (\u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f) Canary Deployment \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 ArgoCI Canary Deployment \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 Istio Canary Deployment \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 Jenkins-X Istio Flagger \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c Canary-\u0434\u0435\u043f\u043b\u043e\u0439 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0443\u043a\u0430\u043c\u0438 \u0447\u0435\u0440\u0435\u0437 GitOps \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\/\u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 Kubernetes. \u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0430 \u0432 \u043f\u0435\u0440\u0432\u0443\u044e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":90273,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-90272","post","type-post","status-publish","format-standard","has-post-thumbnail","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=\"\u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Gitlab CI \u0438 \u0440\u0443\u0447\u043d\u043e\u0439 GitOps \u0434\u043b\u044f \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f Canary-\u0434\u0435\u043f\u043b\u043e\u044f \u0432.\" \/>\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\/canary-deployment-v-kubernetes-1-gitlab-ci\" \/>\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\udd47Canary Deployment \u0432 Kubernetes #1: Gitlab CI | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Gitlab CI \u0438 \u0440\u0443\u0447\u043d\u043e\u0439 GitOps \u0434\u043b\u044f \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f Canary-\u0434\u0435\u043f\u043b\u043e\u044f \u0432.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/canary-deployment-v-kubernetes-1-gitlab-ci\" \/>\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=\"2020-07-30T11:42:02+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-07-30T11:42:02+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\udd47Canary Deployment en Kubernetes #1: Gitlab CI | ProHoster","description":"Usaremos Gitlab CI y GitOps manual para implementar y utilizar Canary Deployment en.","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/canary-deployment-v-kubernetes-1-gitlab-ci","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\udd47Canary Deployment \u0432 Kubernetes #1: Gitlab CI | ProHoster","og:description":"\u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Gitlab CI \u0438 \u0440\u0443\u0447\u043d\u043e\u0439 GitOps \u0434\u043b\u044f \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f Canary-\u0434\u0435\u043f\u043b\u043e\u044f \u0432.","og:url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/canary-deployment-v-kubernetes-1-gitlab-ci","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":"2020-07-30T11:42:02+00:00","article:modified_time":"2020-07-30T11:42:02+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"90272","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":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 12:55:28","updated":"2022-09-27 23:09:11","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\/90272","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=90272"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/90272\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/90273"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=90272"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=90272"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=90272"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}