{"id":90373,"date":"2020-07-31T13:42:12","date_gmt":"2020-07-31T11:42:12","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/canary-deployment-v-kubernetes-2-argo-rollouts"},"modified":"2020-07-31T13:42:12","modified_gmt":"2020-07-31T11:42:12","slug":"canary-deployment-v-kubernetes-2-argo-rollouts","status":"publish","type":"post","link":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/canary-deployment-v-kubernetes-2-argo-rollouts","title":{"rendered":"Implementaci\u00f3n Canary en Kubernetes #2: Argo Rollouts","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h4 id=\"my-budem-ispolzovat-k8s-nativnyy-kontroller-razvertyvaniya-argo-rollouts-i-gitlabci-dlya-zapuska-canary-deploya-v-kubernetes\">Usaremos el controlador de implementaci\u00f3n nativo de k8s Argo Rollouts y GitlabCI para lanzar una implementaci\u00f3n Canary en Kubernetes<\/h4>\n<p>\n<img decoding=\"async\" alt=\"Implementaci\u00f3n Canary en Kubernetes #2: Argo Rollouts\" src=\"\/wp-content\/uploads\/2020\/07\/0748c0dc9a71e59b8a42f39481d365da.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><em><noindex><a rel=\"nofollow\" href=\"https:\/\/unsplash.com\/photos\/V41PulGL1z0\">https:\/\/unsplash.com\/photos\/V41PulGL1z0<\/a><\/noindex><\/em><\/p>\n<p><\/p>\n<h3 id=\"stati-etogo-cikla\">Art\u00edculos de este ciclo<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/company\/nixys\/blog\/512766\/\">Despliegue Canary en Kubernetes #1: Gitlab CI<\/a><\/noindex><\/li>\n<li>(Este art\u00edculo)<\/li>\n<li>Implementaci\u00f3n Canary usando Istio<\/li>\n<li>Implementaci\u00f3n Canary usando Jenkins-X Istio Flagger<\/li>\n<\/ul>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3 id=\"canary-deployment\">Despliegue Canary<\/h3>\n<p><\/p>\n<p>Esperamos que haya le\u00eddo <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/company\/nixys\/blog\/512766\/\">la primera parte<\/a><\/noindex>, donde explicamos brevemente qu\u00e9 son las Implementaciones Canary. Tambi\u00e9n mostramos c\u00f3mo implementarlo utilizando los recursos est\u00e1ndar de Kubernetes.<\/p>\n<p><\/p>\n<h3 id=\"argo-rollouts\">Argo Rollouts<\/h3>\n<p><\/p>\n<p>Argo Rollouts es un controlador de implementaci\u00f3n nativo de Kubernetes. Proporciona CRD (Definici\u00f3n de Recursos Personalizados) para Kubernetes. Gracias a \u00e9l, podemos usar una nueva entidad: <code>Rollout<\/code>, que gestiona implementaciones blue-green y canary con diferentes opciones de configuraci\u00f3n.<\/p>\n<p><\/p>\n<blockquote><p>El controlador Argo Rollouts, utilizado con el recurso personalizado <code>Rollout,<\/code> permite utilizar estrategias de implementaci\u00f3n adicionales, como blue-green y canary para Kubernetes. El recurso <code>Rollout<\/code> ofrece funcionalidad equivalente <code>Deployment<\/code>, solo que con estrategias de implementaci\u00f3n adicionales.<br \/>\nEl recurso <code>Deployments<\/code> tiene dos estrategias para la implementaci\u00f3n: <code>RollingUpdate<\/code> y <code>Recreate<\/code>. Aunque estas estrategias son adecuadas para la mayor\u00eda de los casos, para implementar en servidores a gran escala se utilizan estrategias adicionales, como blue-green o canary, que no est\u00e1n en el controlador de implementaci\u00f3n. Para usar estas estrategias en Kubernetes, los usuarios ten\u00edan que escribir scripts sobre sus Implementaciones. El controlador Argo Rollouts proporciona estas estrategias en forma de par\u00e1metros configurables simples y declarativos.<br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/argoproj.github.io\/argo-rollouts\">https:\/\/argoproj.github.io\/argo-rollouts<\/a><\/noindex><\/p><\/blockquote>\n<p>Tambi\u00e9n existe Argo CI, que proporciona una interfaz web conveniente para usar junto con Rollouts, lo analizaremos en el siguiente art\u00edculo.<\/p>\n<p><\/p>\n<h3 id=\"ustanovka-argo-rollouts\">Instalaci\u00f3n de Argo Rollouts<\/h3>\n<p><\/p>\n<h4 id=\"na-storone-servera\">Del lado del servidor<\/h4>\n<p><\/p>\n<p><code>kubectl create namespace argo-rolloutskubectl apply -n argo-rollouts -f https:\/\/raw.githubusercontent.com\/argoproj\/argo-rollouts\/stable\/manifests\/install.yaml<\/code><\/p>\n<p><\/p>\n<p>En nuestro repositorio de infraestructura (ver m\u00e1s abajo) ya hemos agregado install.yaml como i\/k8s\/argo-rollouts\/install.yaml. As\u00ed, GitlabCI lo instalar\u00e1 en el cl\u00faster.<\/p>\n<p><\/p>\n<h4 id=\"na-storone-klienta-kubectl-plugin\">Del lado del cliente (plugin kubectl)<\/h4>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/argoproj.github.io\/argo-rollouts\/features\/kubectl-plugin\">https:\/\/argoproj.github.io\/argo-rollouts\/features\/kubectl-plugin<br \/>\n<\/a><\/noindex><\/p>\n<p><\/p>\n<h3 id=\"prilozhenie-dlya-primera\">Aplicaci\u00f3n de ejemplo<\/h3>\n<p><\/p>\n<p>Es una buena pr\u00e1ctica tener repositorios separados para el c\u00f3digo de la aplicaci\u00f3n y para la infraestructura.<\/p>\n<p><\/p>\n<h4 id=\"repozitoriy-dlya-prilozheniya\">Repositorio de la aplicaci\u00f3n<\/h4>\n<p><\/p>\n<h4 id=\"kim-wuestkamp--k8s-deployment-example-apphttpsgitlabcomwuestkampk8s-deployment-example-app\"><noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/wuestkamp\/k8s-deployment-example-app\">Kim Wuestkamp \/ k8s-deployment-example-app<\/a><\/noindex><\/h4>\n<p><\/p>\n<p>Es una API muy simple en Python+Flask, que devuelve una respuesta en formato JSON. Compilaremos el paquete utilizando GitlabCI y subiremos el resultado a Gitlab Registry. En el registro tenemos dos versiones diferentes de lanzamientos:<\/p>\n<p><\/p>\n<ul>\n<li>wuestkamp\/k8s-deployment-example-app:v1<\/li>\n<li>wuestkamp\/k8s-deployment-example-app:v2<\/li>\n<\/ul>\n<p><\/p>\n<p>La \u00fanica diferencia entre ellas es el archivo JSON devuelto. Usamos esta aplicaci\u00f3n para visualizar de la manera m\u00e1s simple posible 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 vamos a utilizar GitlabCI para el despliegue en Kubernetes, .gitlab-ci.yml se ve de la siguiente manera:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">imagen: traherom\/kustomize-dockerbefore_script:\n   - printenv\n   - versi\u00f3n de kubectlstages:\n - desplegardeploy test:\n   etapa: desplegar\n   before_script:\n     - echo $KUBECONFIG\n   script:\n     - kubectl obtener todo\n     - kubectl aplicar -f i\/k8s    solo:\n     - maestra<\/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\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><noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/faun\/manually-connect-to-your-kubernetes-cluster-from-the-outside-d852346a7f0a\">Aqu\u00ed<\/a><\/noindex> se puede leer sobre c\u00f3mo obtener credenciales para el cl\u00faster (Gcloud).<\/p>\n<p><\/p>\n<h4 id=\"infrastrukturnyy-yaml\">Yaml de infraestructura<\/h4>\n<p><\/p>\n<p>Dentro del repositorio de infraestructura tenemos el servicio:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">apiVersion: v1\nkind: Service\nmetadata:\n labels:\n   id: rollout-canary\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 rollout.yaml :<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">apiVersion: argoproj.io\/v1alpha1\nkind: Rollout\nmetadata:\n name: rollout-canary\nspec:\n replicas: 10\n revisionHistoryLimit: 2\n selector:\n   matchLabels:\n     id: rollout-canary\n template:\n   metadata:\n     labels:\n       id: rollout-canary\n   spec:\n     containers:\n     - name: rollouts-demo\n       image: registry.gitlab.com\/wuestkamp\/k8s-deployment-example-app:v1\n       imagePullPolicy: Siempre\n strategy:\n   canary:\n     steps:\n     - setWeight: 10\n     # Los despliegues se pueden reanudar manualmente ejecutando `kubectl argo rollouts promote ROLLOUT`\n     - pause: {}\n     - setWeight: 50\n     - pause: { duration: 120 } # dos minutos<\/code><\/pre>\n<p><\/p>\n<p><code>Rollout<\/code> funciona igual que un Deployment. Si no establecemos una estrategia de actualizaci\u00f3n (como canary aqu\u00ed) se comportar\u00e1 como un despliegue rolling-update por defecto.<\/p>\n<p><\/p>\n<p>Definimos dos pasos en yaml para el despliegue canary:<\/p>\n<p><\/p>\n<ol>\n<li>10% de tr\u00e1fico en canary (esperar aprobaci\u00f3n manual)<\/li>\n<li>50% de tr\u00e1fico en canary (esperar 2 minutos y luego continuar hasta 100%)<\/li>\n<\/ol>\n<p><\/p>\n<h3 id=\"vypolnenie-nachalnogo-deploya\">Ejecuci\u00f3n del despliegue inicial<\/h3>\n<p><\/p>\n<p>Despu\u00e9s del despliegue inicial, nuestros recursos se ver\u00e1n as\u00ed:<\/p>\n<p>\n<img decoding=\"async\" alt=\"Implementaci\u00f3n Canary en Kubernetes #2: Argo Rollouts\" src=\"\/wp-content\/uploads\/2020\/07\/2f161eb3c80382bbe4f14a1fd199f1d6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<p>Y solo obtenemos respuesta de la primera versi\u00f3n de la aplicaci\u00f3n:<\/p>\n<p>\n<img decoding=\"async\" alt=\"Implementaci\u00f3n Canary en Kubernetes #2: Argo Rollouts\" src=\"\/wp-content\/uploads\/2020\/07\/117526d90b2fb5c765bb13f18230e9d5.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3 id=\"vypolnyaem-canary-deployment\">Realizamos el Canary Deployment<\/h3>\n<p><\/p>\n<h4 id=\"shag-1-10-trafika\">Paso 1: 10% de tr\u00e1fico<\/h4>\n<p><\/p>\n<p>Para comenzar el despliegue canary, solo necesitamos cambiar la versi\u00f3n de la imagen, como normalmente lo hacemos con los despliegues:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">apiVersion: argoproj.io\/v1alpha1\nkind: Rollout\nmetadata:\n name: rollout-canary\nspec:\n...\n template:\n   metadata:\n     labels:\n       id: rollout-canary\n   spec:\n     containers:\n     - name: rollouts-demo\n       image: registry.gitlab.com\/wuestkamp\/k8s-deployment-example-app:v2\n...<\/code><\/pre>\n<p><\/p>\n<p>Y subimos los cambios, por lo que Gitlab CI realiza el despliegue y vemos los cambios:<\/p>\n<p>\n<img decoding=\"async\" alt=\"Implementaci\u00f3n Canary en Kubernetes #2: Argo Rollouts\" src=\"\/wp-content\/uploads\/2020\/07\/ee069d8108e6ac211827b01390c45910.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<p>Ahora, si accedemos al servicio:<\/p>\n<p>\n<img decoding=\"async\" alt=\"Implementaci\u00f3n Canary en Kubernetes #2: Argo Rollouts\" src=\"\/wp-content\/uploads\/2020\/07\/0be8a02c6ab6166d230818c43bbae3d1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<p>\u00a1Genial! Estamos a la mitad de nuestro despliegue canary. Podemos ver el progreso ejecutando:<\/p>\n<p><\/p>\n<p><code>kubectl argo rollouts get rollout rollout-canary<\/code><\/p>\n<p>\n<img decoding=\"async\" alt=\"Implementaci\u00f3n Canary en Kubernetes #2: Argo Rollouts\" src=\"\/wp-content\/uploads\/2020\/07\/5b8a9fae9f92520b62cfcb5dd12fb7ba.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h4 id=\"shag-2-50-trafika\">Paso 2: 50% de tr\u00e1fico:<\/h4>\n<p><\/p>\n<p>Ahora pasemos al siguiente paso: redirigir el 50% del tr\u00e1fico. Hemos configurado este paso para que se ejecute manualmente:<\/p>\n<p><\/p>\n<p><code>kubectl argo rollouts promote rollout-canary # continuar al paso 2<\/code><\/p>\n<p>\n<img decoding=\"async\" alt=\"Implementaci\u00f3n Canary en Kubernetes #2: Argo Rollouts\" src=\"\/wp-content\/uploads\/2020\/07\/c856b7a60930cd5f6484ebe5a9080ffd.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<p>Y nuestra aplicaci\u00f3n ha devuelto el 50% de respuestas de nuevas versiones:<\/p>\n<p>\n<img decoding=\"async\" alt=\"Implementaci\u00f3n Canary en Kubernetes #2: Argo Rollouts\" src=\"\/wp-content\/uploads\/2020\/07\/502638210f546c5d973fc284beea1ec5.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<p>Y resumen del rollout:<\/p>\n<p>\n<img decoding=\"async\" alt=\"Implementaci\u00f3n Canary en Kubernetes #2: Argo Rollouts\" src=\"\/wp-content\/uploads\/2020\/07\/64e996d9681a88475af31b09ecf61a3f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<p>Perfecto.<\/p>\n<p><\/p>\n<h4 id=\"shag-3-100-trafika\">Paso 3: 100% de tr\u00e1fico:<\/h4>\n<p><\/p>\n<p>Hemos configurado para que despu\u00e9s de 2 minutos el paso con 50% se complete autom\u00e1ticamente y se inicie el paso con 100%:<\/p>\n<p>\n<img decoding=\"async\" alt=\"Implementaci\u00f3n Canary en Kubernetes #2: Argo Rollouts\" src=\"\/wp-content\/uploads\/2020\/07\/d7eee8f41fcbd9c186b37666ea6c10fe.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<p>Y salida de la aplicaci\u00f3n:<\/p>\n<p>\n<img decoding=\"async\" alt=\"Implementaci\u00f3n Canary en Kubernetes #2: Argo Rollouts\" src=\"\/wp-content\/uploads\/2020\/07\/f66c21e326f2bf52b29b460fc6e84957.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<p>Y resumen del rollout:<\/p>\n<p>\n<img decoding=\"async\" alt=\"Implementaci\u00f3n Canary en Kubernetes #2: Argo Rollouts\" src=\"\/wp-content\/uploads\/2020\/07\/5485ddc238b4eaad9e14d338acc116a8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<p>El Canary deployment est\u00e1 completo.<\/p>\n<p><\/p>\n<h4 id=\"eschyo-primery-s-argo-rollouts\">M\u00e1s ejemplos con Argo Rollouts<\/h4>\n<p><\/p>\n<p>Aqu\u00ed hay m\u00e1s ejemplos, como configurar la vista previa del entorno y comparaciones basadas en canary:<\/p>\n<p><\/p>\n<p><u><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/argoproj\/argo-rollouts\/tree\/master\/examples\">https:\/\/github.com\/argoproj\/argo-rollouts\/tree\/master\/examples<\/a><\/noindex><\/u><\/p>\n<p><\/p>\n<h4 id=\"video-ob-argo-rollouts-i-argo-ci\">Video sobre Argo Rollouts y Argo CI<\/h4>\n<p><\/p>\n<p>Realmente recomiendo este video, muestra c\u00f3mo Argo Rollouts y Argo CI funcionan juntos:<\/p>\n<p>\n<center><div class=\"youtube-placeholder\" data-id=\"yeVkTTO9nOA\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/yeVkTTO9nOA\/hqdefault.jpg\" alt=\"Reproducir video\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><\/p>\n<h2 id=\"itog\">Summary<\/h2>\n<p><\/p>\n<p>Me gusta mucho la idea de usar CRDs que gestionan la creaci\u00f3n de tipos adicionales de deployments o replicasets, redirigen el tr\u00e1fico, etc. Trabajar con ellos es f\u00e1cil. Luego, me gustar\u00eda probar la integraci\u00f3n con Argo CI.<\/p>\n<p><\/p>\n<p>Sin embargo, aparentemente se avecina una gran fusi\u00f3n entre Argo CI y Flux CI, as\u00ed que podr\u00eda esperar hasta que salga la nueva versi\u00f3n: <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/argo-flux-join-forces\">Argo Flux<\/a><\/noindex>. <\/p>\n<p><\/p>\n<p>\u00bfHas tenido experiencia con Argo Rollouts o Argo CI?<\/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\/en\/company\/nixys\/blog\/470568\/\">Despliegue Blue-Green de aplicaciones en Spring con el servidor web Nginx<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/company\/nixys\/blog\/480072\/\">Kubernetes: \u00bfpor qu\u00e9 es tan importante configurar la gesti\u00f3n de recursos del sistema?<\/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\/en\/company\/nixys\/blog\/481992\/\">Tekton Pipeline \u2014 pipelines nativos de Kubernetes<\/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\/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\/513118\/\">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 k8s-\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f Argo Rollouts \u0438 GitlabCI \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 Canary \u0434\u0435\u043f\u043b\u043e\u044f \u0432 Kubernetes https:\/\/unsplash.com\/photos\/V41PulGL1z0 \u0421\u0442\u0430\u0442\u044c\u0438 \u044d\u0442\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 Canary Deployment \u0432 Kubernetes #1: Gitlab CI (\u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f) Canary Deployment using Istio Canary Deployment using Jenkins-X Istio Flagger Canary Deployment \u041d\u0430\u0434\u0435\u0435\u043c\u0441\u044f, \u0447\u0442\u043e \u0412\u044b \u0447\u0438\u0442\u0430\u043b\u0438 \u043f\u0435\u0440\u0432\u0443\u044e \u0447\u0430\u0441\u0442\u044c, \u0433\u0434\u0435 \u043c\u044b \u043a\u0440\u0430\u0442\u043a\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u043b\u0438 \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Canary Deployments. [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":90374,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-90373","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 k8s-\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f Argo Rollouts \u0438 GitlabCI.\" \/>\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-2-argo-rollouts\" \/>\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 #2: Argo Rollouts | 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 k8s-\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f Argo Rollouts \u0438 GitlabCI.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/canary-deployment-v-kubernetes-2-argo-rollouts\" \/>\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-31T11:42:12+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-07-31T11:42:12+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\udd47Implementaci\u00f3n Canary en Kubernetes #2: Argo Rollouts | ProHoster","description":"Usaremos el controlador de despliegue nativo de k8s Argo Rollouts y GitlabCI.","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/canary-deployment-v-kubernetes-2-argo-rollouts","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 #2: Argo Rollouts | ProHoster","og:description":"\u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c k8s-\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f Argo Rollouts \u0438 GitlabCI.","og:url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/canary-deployment-v-kubernetes-2-argo-rollouts","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-31T11:42:12+00:00","article:modified_time":"2020-07-31T11:42:12+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"90373","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:53:48","updated":"2022-09-30 17:28:16","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\/90373","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=90373"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/90373\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/90374"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=90373"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=90373"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=90373"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}