{"id":35955,"date":"2019-10-31T22:08:26","date_gmt":"2019-10-31T19:08:26","guid":{"rendered":"https:\/\/prohoster.info\/blog\/razvertyvanie-prilozhenij-na-neskolkih-klasterah-kubernetes-s-helm\/"},"modified":"2019-10-31T22:08:26","modified_gmt":"2019-10-31T19:08:26","slug":"razvertyvanie-prilozhenij-na-neskolkih-klasterah-kubernetes-s-helm","status":"publish","type":"post","link":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/razvertyvanie-prilozhenij-na-neskolkih-klasterah-kubernetes-s-helm","title":{"rendered":"Despliegue de aplicaciones en varios cl\u00fasteres de Kubernetes con Helm","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<\/p>\n<p><\/p>\n<h2 id=\"kak-dailymotion-ispolzuet-kubernetes-razvertyvanie-prilozheniy\">C\u00f3mo Dailymotion utiliza Kubernetes: despliegue de aplicaciones<\/h2>\n<p><\/p>\n<p>En Dailymotion comenzamos a utilizar Kubernetes en producci\u00f3n hace 3 a\u00f1os. Sin embargo, desplegar aplicaciones en varios cl\u00fasteres es un reto, por lo que en los \u00faltimos a\u00f1os hemos trabajado para mejorar nuestras herramientas y procesos.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3 id=\"s-chego-nachalos\">El comienzo<\/h3>\n<p><\/p>\n<p>Aqu\u00ed explicaremos c\u00f3mo desplegamos nuestras aplicaciones en varios cl\u00fasteres de Kubernetes en todo el mundo.<\/p>\n<p><\/p>\n<p>Para desplegar varios objetos de Kubernetes a la vez, utilizamos <noindex><a rel=\"nofollow\" href=\"https:\/\/helm.sh\/\">Helm<\/a><\/noindex>, y todos nuestros charts se almacenan en un \u00fanico repositorio git. Para desplegar la pila completa de la aplicaci\u00f3n que consiste en varios servicios, utilizamos lo que llamamos un chart general. Esencialmente, este chart declara dependencias y permite inicializar la API y sus servicios con un solo comando.<\/p>\n<p><\/p>\n<p>Adem\u00e1s, hemos escrito un peque\u00f1o script en Python sobre Helm para realizar verificaciones, crear charts, agregar secretos y desplegar aplicaciones. Todas estas tareas se ejecutan en una plataforma central de CI utilizando una imagen de docker.<\/p>\n<p><\/p>\n<p>Vayamos al grano.<\/p>\n<p><\/p>\n<blockquote><p>Nota. Cuando leas esto, ya se ha anunciado el primer candidato a lanzamiento de Helm 3. La versi\u00f3n principal contiene un conjunto completo de mejoras dise\u00f1adas para resolver algunos problemas que enfrentamos en el pasado.<\/p><\/blockquote>\n<p><\/p>\n<h3 id=\"rabochiy-process-razrabotki-chartov\">Flujo de trabajo de desarrollo de charts<\/h3>\n<p><\/p>\n<p>Para las aplicaciones, utilizamos ramificaci\u00f3n, y decidimos aplicar este mismo enfoque a los charts.<\/p>\n<p><\/p>\n<ul>\n<li>La rama <strong>dev<\/strong> se utiliza para crear charts que ser\u00e1n probados en cl\u00fasteres de desarrollo.<\/li>\n<li>Cuando se env\u00eda un pull request a <strong>master<\/strong>, se verifica en staging.<\/li>\n<li>Finalmente, creamos un pull request para enviar los cambios a la rama <strong>prod<\/strong> y aplicarlos en producci\u00f3n.<\/li>\n<\/ul>\n<p><\/p>\n<p>Cada entorno tiene su propio repositorio privado que almacena nuestros charts, y damos uso a <noindex><a rel=\"nofollow\" href=\"https:\/\/chartmuseum.com\/\">Chartmuseum<\/a><\/noindex> con APIs muy \u00fatiles. De este modo garantizamos un estricto aislamiento entre entornos y la validaci\u00f3n de los charts en condiciones reales antes de utilizarlos en producci\u00f3n.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/rz\/vt\/uk\/rzvtuk6q7b_rkeaxnyujzhmfjog.png\"><\/a><\/noindex><\/p>\n<p><\/p>\n<p><em>Repositorios de charts en diferentes entornos<\/em><\/p>\n<p><\/p>\n<p>Cabe se\u00f1alar que cuando los desarrolladores env\u00edan una rama dev, la versi\u00f3n de su chart se env\u00eda autom\u00e1ticamente al dev Chartmuseum. As\u00ed, todos los desarrolladores utilizan un \u00fanico repositorio dev, y es importante especificar correctamente la versi\u00f3n de su chart para no usar accidentalmente los cambios de otros.<\/p>\n<p><\/p>\n<p>Adem\u00e1s, nuestro peque\u00f1o script de Python verifica los objetos de Kubernetes seg\u00fan las especificaciones de Kubernetes OpenAPI mediante <noindex><a rel=\"nofollow\" href=\"https:\/\/kubeval.instrumenta.dev\/\">Kubeval<\/a><\/noindex>, antes de publicarlos en Chartmuseum.<\/p>\n<p><\/p>\n<h3 id=\"obschee-opisanie-rabochego-processa-razrabotki-charta\">Descripci\u00f3n general del flujo de trabajo de desarrollo del chart<\/h3>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/yd\/cw\/qw\/ydcwqw-vqfitu5bj8ky4nh7xxea.png\"><\/a><\/noindex><\/p>\n<p><\/p>\n<ol>\n<li>Configuraci\u00f3n de tareas del pipeline seg\u00fan la especificaci\u00f3n <noindex><a rel=\"nofollow\" href=\"https:\/\/gazr.io\/\">gazr.io<\/a><\/noindex> para el control de calidad (lint, unit-test).<\/li>\n<li>Env\u00edo de la imagen de docker con herramientas de Python que despliegan nuestras aplicaciones.<\/li>\n<li>Configuraci\u00f3n del entorno seg\u00fan el nombre de la rama.<\/li>\n<li>Verificaci\u00f3n de archivos yaml de Kubernetes con Kubeval.<\/li>\n<li>Incremento autom\u00e1tico de la versi\u00f3n del chart y sus charts padres (charts que dependen del chart modificado).<\/li>\n<li>Env\u00edo del chart a Chartmuseum, correspondiente a su entorno<\/li>\n<\/ol>\n<p><\/p>\n<h2 id=\"upravlenie-razlichiyami-v-klasterah\">Gesti\u00f3n de diferencias en cl\u00fasteres<\/h2>\n<p><\/p>\n<h3 id=\"federaciya-klasterov\">Federaci\u00f3n de cl\u00fasteres<\/h3>\n<p><\/p>\n<p>Hubo un tiempo en el que utilizamos <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/concepts\/cluster-administration\/federation\/\">la federaci\u00f3n de cl\u00fasteres de Kubernetes<\/a><\/noindex>, donde se pod\u00edan declarar objetos de Kubernetes desde un \u00fanico punto final de API. Pero surgieron problemas. Por ejemplo, algunos objetos de Kubernetes no se pod\u00edan crear en el punto final de la federaci\u00f3n, lo que dificultaba el mantenimiento de los objetos combinados y otros objetos para cl\u00fasteres individuales.<\/p>\n<p><\/p>\n<p>Para solucionar el problema, comenzamos a gestionar los cl\u00fasteres de forma independiente, lo que simplific\u00f3 considerablemente el proceso (utilizamos la primera versi\u00f3n de la federaci\u00f3n; en la segunda algo podr\u00eda haber cambiado).<\/p>\n<p><\/p>\n<h3 id=\"georaspredelennaya-platforma\">Plataforma geodistribuida<\/h3>\n<p><\/p>\n<p>Ahora nuestra plataforma est\u00e1 distribuida en 6 regiones: 3 localmente y 3 en la nube.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/jq\/c1\/mr\/jqc1mru36g5byams4wddzducauw.png\"><\/a><\/noindex><br \/>\n<em>Despliegue distribuido<\/em><\/p>\n<p><\/p>\n<h3 id=\"globalnye-znacheniya-helm\">Valores globales de Helm<\/h3>\n<p><\/p>\n<p>4 valores globales de Helm permiten definir diferencias entre cl\u00fasteres. Para todos nuestros charts, hay valores m\u00ednimos predeterminados.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">global:\n  cloud: True\n  env: staging\n  region: us-central1\n  clusterName: staging-us-central1<\/code><\/pre>\n<p><\/p>\n<p><em>Valores globales<\/em><\/p>\n<p><\/p>\n<p>Estos valores ayudan a definir el contexto para nuestras aplicaciones y se utilizan para diferentes tareas: monitoreo, trazado, registro, realizaci\u00f3n de llamadas externas, escalado, etc.<\/p>\n<p><\/p>\n<ul>\n<li>\"cloud\": tenemos una plataforma h\u00edbrida de Kubernetes. Por ejemplo, nuestra API se despliega en las zonas de GCP y en nuestros centros de datos.<\/li>\n<li>\"env\": algunos valores pueden cambiar para entornos no operativos. Por ejemplo, definiciones de recursos y configuraci\u00f3n de escalado autom\u00e1tico.<\/li>\n<li>\"region\": esta informaci\u00f3n ayuda a determinar la ubicaci\u00f3n del cl\u00faster y puede utilizarse para definir los puntos finales m\u00e1s cercanos para servicios externos.<\/li>\n<li>\"clusterName\": si y cuando queremos definir un valor para un cl\u00faster espec\u00edfico.<\/li>\n<\/ul>\n<p><\/p>\n<p>Aqu\u00ed hay un ejemplo concreto:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">{{\n\/* Devuelve r\u00e9plicas de Horizontal Pod Autoscaler para GraphQL *\/}}\n{{- define \"graphql.hpaReplicas\" -}}\n{{- if eq .Values.global.env \"prod\" }}\n{{- if eq .Values.global.region \"europe-west1\" }}\nminReplicas: 40\n{{- else }}\nminReplicas: 150\n{{- end }}\nmaxReplicas: 1400\n{{- else }}\nminReplicas: 4\nmaxReplicas: 20\n{{- end }}\n{{- end -}}<\/code><\/pre>\n<p><\/p>\n<p><em>Ejemplo de plantilla Helm<\/em><\/p>\n<p><\/p>\n<p>Esta l\u00f3gica est\u00e1 definida en una plantilla auxiliar para no saturar el YAML de Kubernetes.<\/p>\n<p><\/p>\n<h3 id=\"obyavlenie-prilozheniya\">Declaraci\u00f3n de la aplicaci\u00f3n<\/h3>\n<p><\/p>\n<p>Nuestras herramientas de despliegue se basan en varios archivos YAML. A continuaci\u00f3n, se muestra un ejemplo de c\u00f3mo declaramos el servicio y su topolog\u00eda de escalado (n\u00famero de r\u00e9plicas) en el cl\u00faster.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">releases:\n  - foo.world\n\nfoo.world:                # Nombre de la versi\u00f3n\n  services:               # Lista de aplicaciones\/proyectos de dailymotion\n    foobar:\n      chart_name: foo-foobar\n      repo: git@github.com:dailymotion\/foobar\n      contexts:\n        prod-europe-west1:\n          deployments:\n            - name: foo-bar-baz\n              replicas: 18\n            - name: another-deployment\n              replicas: 3<\/code><\/pre>\n<p><\/p>\n<p><em>Definici\u00f3n del servicio<\/em><\/p>\n<p><\/p>\n<p>Este es el esquema de todos los pasos que definen nuestro flujo de trabajo de despliegue. El \u00faltimo paso despliega la aplicaci\u00f3n simult\u00e1neamente en varios cl\u00fasteres de trabajo.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/iu\/qh\/xk\/iuqhxki4nfqoi0mus258j0feylu.png\"><\/a><\/noindex><br \/>\n<em>Pasos de despliegue en Jenkins<\/em><\/p>\n<p><\/p>\n<h3 id=\"a-sekrety\">\u00bfY los secretos?<\/h3>\n<p><\/p>\n<p>En lo que respecta a la seguridad, rastreamos todos los secretos de diferentes lugares y los almacenamos en un almac\u00e9n \u00fanico <noindex><a rel=\"nofollow\" href=\"https:\/\/www.vaultproject.io\/\">Vault<\/a><\/noindex> en Par\u00eds.<\/p>\n<p><\/p>\n<p>Nuestras herramientas de despliegue extraen valores de los secretos de Vault y, cuando llega el momento del despliegue, los insertan en Helm.<\/p>\n<p><\/p>\n<p>Para esto, hemos definido un mapeo entre los secretos en Vault y los secretos que necesitan nuestras aplicaciones:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">secretos:                                                                                                                                                                                                        \n     - secret_id: \"stack1-app1-password\"                                                                                                                                                                                  \n       contexts:                                                                                                                                                                                                   \n         - name: \"default\"                                                                                                                                                                                         \n           vaultPath: \"\\\/kv\\\/dev\\\/stack1\\\/app1\\\/test\"                                                                                                                                                               \n           vaultKey: \"password\"                                                                                                                                                                                    \n         - name: \"cluster1\"                                                                                                                                                                           \n           vaultPath: \"\\\/kv\\\/dev\\\/stack1\\\/app1\\\/test\"                                                                                                                                                               \n           vaultKey: \"password\"<\/code><\/pre>\n<p><\/p>\n<ul>\n<li>Hemos definido reglas generales que deben seguirse al registrar secretos en Vault.<\/li>\n<li>Si el secreto est\u00e1 relacionado <strong>con un contexto o cl\u00faster espec\u00edfico<\/strong>, es necesario agregar una entrada concreta. (Aqu\u00ed, el contexto cluster1 tiene su propio valor para el secreto stack-app1-password).<\/li>\n<li>De lo contrario, se utiliza el valor <strong>por defecto<\/strong>.<\/li>\n<li>Para cada elemento en esta lista en <strong>el secreto de Kubernetes<\/strong> se inserta un par clave-valor. Por lo tanto, la plantilla del secreto en nuestros charts es muy simple.<\/li>\n<\/ul>\n<p><\/p>\n<pre><code class=\"plaintext\">apiVersion: v1\ndata:\n{{- range $key,$value := .Values.secrets }}\n  {{ $key }}: {{ $value | b64enc | quote }}\n{{ end }}\nkind: Secret\nmetadata:\n  name: \"{{ .Chart.Name }}\"\n  labels:\n    chartVersion: \"{{ .Chart.Version }}\"\n    tillerVersion: \"{{ .Capabilities.TillerVersion.SemVer }}\"\ntype: Opaque<\/code><\/pre>\n<p><\/p>\n<h2 id=\"problemy-i-ogranicheniya\">Problemas y limitaciones<\/h2>\n<p><\/p>\n<h3 id=\"rabota-s-neskolkimi-repozitoriyami\">Trabajando con m\u00faltiples repositorios<\/h3>\n<p><\/p>\n<p>Actualmente estamos separando el desarrollo de charts y aplicaciones. Esto significa que los desarrolladores tienen que trabajar en dos repositorios git: uno para la aplicaci\u00f3n y otro para definir su despliegue en Kubernetes. 2 repositorios git significan 2 flujos de trabajo, y es f\u00e1cil que un principiante se confunda.<\/p>\n<p><\/p>\n<h3 id=\"upravlyat-obobschennymi-chartami-hlopotno\">Gestionar charts gen\u00e9ricos es laborioso<\/h3>\n<p><\/p>\n<p>Como se mencion\u00f3, los charts gen\u00e9ricos son muy convenientes para definir dependencias y desplegar r\u00e1pidamente varias aplicaciones. Pero estamos utilizando <code>--reuse-values<\/code>, para evitar pasar todos los valores cada vez que desplegamos una aplicaci\u00f3n que forma parte de este chart gen\u00e9rico.<\/p>\n<p><\/p>\n<p>En el proceso de entrega continua, solo tenemos dos valores que cambian regularmente: el n\u00famero de r\u00e9plicas y la etiqueta de la imagen (versi\u00f3n). Otros valores, m\u00e1s estables, se cambian manualmente, lo que resulta complicado. Adem\u00e1s, un error en el despliegue de un gr\u00e1fico gen\u00e9rico puede causar fallos serios, como hemos aprendido por experiencia propia.<\/p>\n<p><\/p>\n<h3 id=\"obnovlenie-neskolkih-faylov-konfiguracii\">Actualizaci\u00f3n de varios archivos de configuraci\u00f3n<\/h3>\n<p><\/p>\n<p>Cuando el desarrollador a\u00f1ade una nueva aplicaci\u00f3n, tiene que modificar varios archivos: la declaraci\u00f3n de la aplicaci\u00f3n, la lista de secretos, a\u00f1adir la aplicaci\u00f3n como dependencia si est\u00e1 en el gr\u00e1fico gen\u00e9rico.<\/p>\n<p><\/p>\n<h3 id=\"razresheniya-jenkins-slishkom-rasshireny-v-vault\">Los permisos de Jenkins son demasiado amplios en Vault<\/h3>\n<p><\/p>\n<p>Actualmente tenemos uno <noindex><a rel=\"nofollow\" href=\"https:\/\/www.vaultproject.io\/docs\/auth\/approle.html\">AppRole<\/a><\/noindex>, que lee todos los secretos de Vault.<\/p>\n<p><\/p>\n<h3 id=\"process-otkata-ne-avtomatizirovan\">El proceso de reversi\u00f3n no est\u00e1 automatizado<\/h3>\n<p><\/p>\n<p>Para revertir, hay que ejecutar un comando en varios cl\u00fasteres, lo que conlleva riesgos de errores. Realizamos esta operaci\u00f3n manualmente para garantizar un identificador de versi\u00f3n correcto.<\/p>\n<p><\/p>\n<h2 id=\"my-dvizhemsya-v-storonu-gitops\">Nos estamos moviendo hacia GitOps<\/h2>\n<p><\/p>\n<h3 id=\"nasha-cel\">Nuestro objetivo<\/h3>\n<p><\/p>\n<p>Queremos devolver el gr\u00e1fico al repositorio de la aplicaci\u00f3n que despliega.<\/p>\n<p><\/p>\n<p>El flujo de trabajo ser\u00e1 el mismo que para el desarrollo. Por ejemplo, cuando una rama se env\u00eda a master, el despliegue se iniciar\u00e1 autom\u00e1ticamente. La principal diferencia entre este enfoque y el flujo de trabajo actual es que <strong>todo ser\u00e1 gestionado en git<\/strong> (la propia aplicaci\u00f3n y la forma en que se despliega en Kubernetes).<\/p>\n<p><\/p>\n<p>Hay varias ventajas:<\/p>\n<p><\/p>\n<ul>\n<li>Mucho <strong>m\u00e1s claro<\/strong> para el desarrollador. Es m\u00e1s f\u00e1cil aprender a aplicar cambios en el gr\u00e1fico local.<\/li>\n<li>La definici\u00f3n del despliegue del servicio se puede indicar <strong>junto con el c\u00f3digo<\/strong> del servicio.<\/li>\n<li><strong>Gesti\u00f3n de la eliminaci\u00f3n de gr\u00e1ficos gen\u00e9ricos<\/strong>. El servicio tendr\u00e1 su propio lanzamiento de Helm. Esto permitir\u00e1 gestionar el ciclo de vida de la aplicaci\u00f3n (reversi\u00f3n, actualizaci\u00f3n) a un nivel m\u00e1s granular sin afectar a otros servicios.<\/li>\n<li><strong>Las ventajas de git<\/strong> para la gesti\u00f3n de gr\u00e1ficos: reversi\u00f3n de cambios, registro de auditor\u00eda, etc. Si es necesario revertir un cambio en el gr\u00e1fico, se puede hacer utilizando git. El despliegue se inicia autom\u00e1ticamente.<\/li>\n<li>Se puede considerar la mejora del flujo de trabajo de desarrollo utilizando herramientas como <strong>Skaffold<\/strong>, con las que los desarrolladores pueden probar cambios en un contexto similar al de producci\u00f3n.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"dvuhetapnaya-migraciya\">Migraci\u00f3n en dos etapas<\/h3>\n<p><\/p>\n<p>Nuestros desarrolladores han estado utilizando este flujo de trabajo durante 2 a\u00f1os, por lo que necesitamos una migraci\u00f3n lo m\u00e1s indolora posible. Por eso decidimos agregar una etapa intermedia en el camino hacia la meta.<br \/>\nLa primera etapa es sencilla:<\/p>\n<p><\/p>\n<ul>\n<li>Mantenemos una estructura similar para la configuraci\u00f3n de implementaci\u00f3n de aplicaciones, pero en un solo objeto llamado DailymotionRelease.<\/li>\n<\/ul>\n<p><\/p>\n<pre><code class=\"plaintext\">apiVersion: \"v1\"\nkind: \"DailymotionRelease\"\nmetadata:\n  name: \"app1.ns1\"\n  environment: \"dev\"\n  branch: \"mybranch\"\nspec:\n  slack_channel: \"#admin\"\n  chart_name: \"app1\"\n  scaling:\n    - context: \"dev-us-central1-0\"\n      replicas:\n        - name: \"hermes\"\n          count: 2\n    - context: \"dev-europe-west1-0\"\n      replicas:\n        - name: \"app1-deploy\"\n          count: 2\n  secrets:\n    - secret_id: \"app1\"\n      contexts:\n        - name: \"default\"\n          vaultPath: \"\\\/kv\\\/dev\\\/ns1\\\/app1\\\/test\"\n          vaultKey: \"password\"\n        - name: \"dev-europe-west1-0\"\n          vaultPath: \"\\\/kv\\\/dev\\\/ns1\\\/app1\\\/test\"\n          vaultKey: \"password\"<\/code><\/pre>\n<p><\/p>\n<ul>\n<li>1 lanzamiento por aplicaci\u00f3n (sin gr\u00e1ficos generalizados).<\/li>\n<li>Gr\u00e1ficos en el repositorio git de la aplicaci\u00f3n.<\/li>\n<\/ul>\n<p><\/p>\n<p>Hemos hablado con todos los desarrolladores, as\u00ed que el proceso de migraci\u00f3n ya ha comenzado. La primera etapa a\u00fan se controla utilizando la plataforma CI. Pronto escribir\u00e9 otro post sobre la segunda etapa: c\u00f3mo pasamos al flujo de trabajo de GitOps con <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/weaveworks\/flux\">Flux<\/a><\/noindex>. Les contar\u00e9 c\u00f3mo configuramos todo y las dificultades que enfrentamos (varios repositorios, secretos, etc.). Est\u00e9n atentos a las novedades.<\/p>\n<p><\/p>\n<p>Aqu\u00ed intentamos describir nuestro progreso en el flujo de trabajo de implementaci\u00f3n de aplicaciones durante los \u00faltimos a\u00f1os, que nos llev\u00f3 a pensar en el enfoque de GitOps. A\u00fan no hemos alcanzado nuestra meta y estaremos informando sobre los resultados, pero ahora estamos convencidos de que hicimos bien al simplificar todo y acercarlo a los h\u00e1bitos de los desarrolladores.<\/p>\n<p>Fuente: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/southbridge\/blog\/458934\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041a\u0430\u043a Dailymotion \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Kubernetes: \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u041c\u044b \u0432 Dailymotion \u043d\u0430\u0447\u0430\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Kubernetes \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435 3 \u0433\u043e\u0434\u0430 \u043d\u0430\u0437\u0430\u0434. \u041d\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430\u0445 \u0442\u043e \u0435\u0449\u0435 \u0443\u0434\u043e\u0432\u043e\u043b\u044c\u0441\u0442\u0432\u0438\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043b\u0435\u0442 \u043c\u044b \u0441\u0442\u0430\u0440\u0430\u043b\u0438\u0441\u044c \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u043d\u0430\u0448\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0438 \u0440\u0430\u0431\u043e\u0447\u0438\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b. \u0421 \u0447\u0435\u0433\u043e \u043d\u0430\u0447\u0430\u043b\u043e\u0441\u044c \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c, \u043a\u0430\u043a \u043c\u044b \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u0435\u043c \u043d\u0430\u0448\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430\u0445 Kubernetes \u043f\u043e [&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-35955","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041a\u0430\u043a Dailymotion \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Kubernetes: \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u041c\u044b \u0432 Dailymotion \u043d\u0430\u0447\u0430\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Kubernetes \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\/razvertyvanie-prilozhenij-na-neskolkih-klasterah-kubernetes-s-helm\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\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\u0420\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430\u0445 Kubernetes \u0441 Helm | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041a\u0430\u043a Dailymotion \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Kubernetes: \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u041c\u044b \u0432 Dailymotion \u043d\u0430\u0447\u0430\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Kubernetes \u0432.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/razvertyvanie-prilozhenij-na-neskolkih-klasterah-kubernetes-s-helm\" \/>\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:08:26+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:08:26+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 de aplicaciones en m\u00faltiples cl\u00fasteres de Kubernetes con Helm | ProHoster","description":"C\u00f3mo Dailymotion utiliza Kubernetes: implementaci\u00f3n de aplicaciones. En Dailymotion comenzamos a usar Kubernetes en.","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/razvertyvanie-prilozhenij-na-neskolkih-klasterah-kubernetes-s-helm","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\u0420\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430\u0445 Kubernetes \u0441 Helm | ProHoster","og:description":"\u041a\u0430\u043a Dailymotion \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Kubernetes: \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u041c\u044b \u0432 Dailymotion \u043d\u0430\u0447\u0430\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Kubernetes \u0432.","og:url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/razvertyvanie-prilozhenij-na-neskolkih-klasterah-kubernetes-s-helm","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:08:26+00:00","article:modified_time":"2019-10-31T19:08:26+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"35955","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:25: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:25: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\/35955","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=35955"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/35955\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=35955"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=35955"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=35955"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}