{"id":40721,"date":"2020-02-03T14:41:59","date_gmt":"2020-02-03T11:41:59","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/nash-opyt-razrabotki-csi-drajvera-v-kubernetes-dlya-yandeks-oblaka"},"modified":"2020-02-03T14:41:59","modified_gmt":"2020-02-03T11:41:59","slug":"nash-opyt-razrabotki-csi-drajvera-v-kubernetes-dlya-yandeks-oblaka","status":"publish","type":"post","link":"https:\/\/prohoster.info\/es\/blog\/nash-opyt-razrabotki-csi-drajvera-v-kubernetes-dlya-yandeks-oblaka","title":{"rendered":"Nuestra experiencia en el desarrollo del controlador CSI en Kubernetes para Yandex.Cloud","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Nuestra experiencia en el desarrollo del controlador CSI en Kubernetes para Yandex.Cloud\" src=\"\/wp-content\/uploads\/2020\/02\/86adf77b2ee08c426bf79c5b9b2d3d1e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNos complace anunciar que la empresa \u00abFlant\u00bb est\u00e1 ampliando su contribuci\u00f3n a las herramientas de c\u00f3digo abierto para Kubernetes, lanzando <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/yandex-csi-driver\">la versi\u00f3n alfa del controlador CSI<\/a><\/noindex> (Interfaz de Almacenamiento de Contenedores) para Yandex.Cloud.<\/p>\n<p>Pero antes de entrar en los detalles de implementaci\u00f3n, respondamos la pregunta: \u00bfpor qu\u00e9 es necesario, si Yandex ya tiene el servicio <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.yandex.ru\/docs\/managed-kubernetes\/\">Managed Service for Kubernetes<\/a><\/noindex>.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Introducci\u00f3n<\/h2>\n<p><\/p>\n<h3>\u00bfPor qu\u00e9 es esto?<\/h3>\n<p>\nDentro de nuestra empresa, desde el comienzo de la explotaci\u00f3n de Kubernetes en producci\u00f3n (es decir, ya hace varios a\u00f1os), hemos desarrollado una herramienta propia (deckhouse) que, por cierto, tambi\u00e9n planeamos hacer disponible como un proyecto de c\u00f3digo abierto en el futuro cercano. Con ella, configuramos y ajustamos uniformemente todos nuestros cl\u00fasteres, y en la actualidad ya son m\u00e1s de 100, utilizando diversas configuraciones de hardware y en todos los servicios en la nube disponibles.<\/p>\n<p>Los cl\u00fasteres que utilizan deckhouse tienen todos los componentes necesarios para su funcionamiento: balanceadores de carga, monitoreo con gr\u00e1ficos, m\u00e9tricas y alertas convenientes, autenticaci\u00f3n de usuarios a trav\u00e9s de proveedores externos para acceder a todos los dashboards, entre otros. No tiene sentido configurar un cl\u00faster 'mejorado' en una soluci\u00f3n administrada, ya que a menudo esto es imposible o requerir\u00e1 desactivar la mitad de los componentes.<\/p>\n<p><i><b>NB<\/b>: Esta es nuestra experiencia, y es bastante espec\u00edfica. De ninguna manera afirmamos que todos deban encargarse por su cuenta de implementar cl\u00fasteres de Kubernetes en lugar de utilizar soluciones listas para usar. Por cierto, no tenemos experiencia real en la explotaci\u00f3n de Kubernetes de Yandex y no vamos a emitir ning\u00fan juicio sobre este servicio en el presente art\u00edculo.<\/i><\/p>\n<h3>\u00bfQu\u00e9 es y para qui\u00e9n?<\/h3>\n<p>\nAs\u00ed que ya hemos hablado sobre el enfoque moderno para el almacenamiento en Kubernetes: <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/424211\/\">c\u00f3mo est\u00e1 estructurado el CSI<\/a><\/noindex> y <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/465417\/\">c\u00f3mo lleg\u00f3 la comunidad<\/a><\/noindex> a este enfoque.<\/p>\n<p>Actualmente, muchos grandes proveedores de servicios en la nube han desarrollado controladores para usar sus discos 'en la nube' como Vol\u00famenes Persistentes en Kubernetes. Si un proveedor no tiene dicho controlador, pero ofrece todas las funciones necesarias a trav\u00e9s de API, no hay nada que impida implementar un controlador por cuenta propia. As\u00ed fue como lo hicimos con Yandex.Cloud.<\/p>\n<p>Basamos nuestro desarrollo en <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/digitalocean\/csi-digitalocean\">el controlador CSI para el cloud de DigitalOcean<\/a><\/noindex> y algunas ideas del <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kubernetes-sigs\/gcp-compute-persistent-disk-csi-driver\">controlador para GCP<\/a><\/noindex>, ya que la interacci\u00f3n con la API de estas nubes (Google y Yandex) tiene varias similitudes. En particular, la API tanto de <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.google.com\/compute\/docs\/api\/how-tos\/api-requests-responses#handling_api_responses\">GCP<\/a><\/noindex>, como la de <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.yandex.ru\/docs\/api-design-guide\/concepts\/about-async\">Yandex<\/a><\/noindex> devuelven un objeto <code>Operaci\u00f3n<\/code> para rastrear el estado de operaciones prolongadas (por ejemplo, la creaci\u00f3n de un nuevo disco). Para interactuar con la API de Yandex.Cloud se utiliza <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/yandex-cloud\/go-sdk\">Yandex.Cloud Go SDK<\/a><\/noindex>.<\/p>\n<p>El resultado del trabajo realizado <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/yandex-csi-driver\">se ha publicado en GitHub<\/a><\/noindex> y puede ser \u00fatil para aquellos que, por alguna raz\u00f3n, utilizan una instalaci\u00f3n propia de Kubernetes en m\u00e1quinas virtuales de Yandex.Cloud (pero no un cl\u00faster gestionado listo para usar) y desean utilizar (solicitar) discos a trav\u00e9s de CSI.<\/p>\n<h2>Implementaci\u00f3n<\/h2>\n<p><\/p>\n<h3>Principales caracter\u00edsticas<\/h3>\n<p>\nPor el momento, el controlador admite las siguientes funciones:<\/p>\n<ul>\n<li> Solicitar discos en todas las zonas del cl\u00faster seg\u00fan la topolog\u00eda de los nodos en el cl\u00faster;<\/li>\n<li> Eliminar discos solicitados anteriormente;<\/li>\n<li> Redimensionamiento offline para discos (Yandex.Cloud <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.yandex.ru\/docs\/compute\/operations\/disk-control\/update#change-disk-size\">no admite<\/a><\/noindex> el aumento de los discos que est\u00e1n montados en la m\u00e1quina virtual). Acerca de c\u00f3mo se tuvo que modificar el controlador para realizar el redimensionamiento de la manera menos dolorosa posible, v\u00e9ase a continuaci\u00f3n.<\/li>\n<\/ul>\n<p>\nEn el futuro, se planea implementar el soporte para la creaci\u00f3n y eliminaci\u00f3n de instant\u00e1neas de discos.<\/p>\n<h3>La principal dificultad y su superaci\u00f3n<\/h3>\n<p>\nLa falta de capacidad en la API de Yandex.Cloud para aumentar discos en tiempo real es una limitaci\u00f3n que complica la operaci\u00f3n de redimensionamiento para PV (Persistent Volume): porque en tal caso es necesario que el pod de la aplicaci\u00f3n que utiliza el disco est\u00e9 detenido, lo cual puede causar interrupci\u00f3n en la aplicaci\u00f3n.<\/p>\n<p>Seg\u00fan <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/container-storage-interface\/spec\">especificaci\u00f3n CSI<\/a><\/noindex>, si el controlador CSI informa que solo puede realizar el redimensionamiento de discos 'offline' (<code>VolumeExpansion.OFFLINE<\/code>), el proceso de aumento del disco debe llevarse a cabo de la siguiente manera:<\/p>\n<blockquote><p>Si el plugin solo tiene <code>VolumeExpansion.OFFLINE<\/code> capacidad de expansi\u00f3n y el volumen est\u00e1 actualmente publicado o disponible en un nodo, entonces <code>ControllerExpandVolume<\/code> DEBE ser llamado SOLO despu\u00e9s de que:<\/p>\n<ul>\n<li> El plugin tiene el controlador <code>PUBLISH_UNPUBLISH_VOLUME<\/code> capacidad y <code>ControllerUnpublishVolume<\/code> ha sido invocado con \u00e9xito.<\/li>\n<\/ul>\n<p>\nO BIEN<\/p>\n<ul>\n<li> El plugin NO tiene capacidad de controlador, el plugin tiene capacidad de nodo <code>PUBLISH_UNPUBLISH_VOLUME<\/code> STAGE_UNSTAGE_VOLUME <code>y<\/code> NodeUnstageVolume <code>se ha completado con \u00e9xito.<\/code> capacidad, ni nodo<\/li>\n<\/ul>\n<p>\nO BIEN<\/p>\n<ul>\n<li>El plugin NO tiene capacidad de controlador, el plugin tiene capacidad de nodo <code>PUBLISH_UNPUBLISH_VOLUME<\/code> NodeUnpublishVolume <code>y<\/code> NodeUnstageVolume <code>se ha completado con \u00e9xito.<\/code> En esencia, esto implica la necesidad de desconectar el disco de la m\u00e1quina virtual antes de aumentarlo.<\/li>\n<\/ul>\n<\/blockquote>\n<p>\nSin embargo, desafortunadamente,<\/p>\n<p>la implementaci\u00f3n <b>de la especificaci\u00f3n CSI a trav\u00e9s de sidecars no cumple con estos requisitos:<\/b> En el contenedor sidecar<\/p>\n<ul>\n<li> csi-attacher <code>, que deber\u00eda ser responsable de asegurar el tiempo necesario entre los montajes, este funcionalidad simplemente no est\u00e1 implementada durante el redimensionamiento offline. La discusi\u00f3n sobre esto fue iniciada.<\/code>, que debe encargarse de mantener el intervalo necesario entre los montajes, ya que esta funcionalidad simplemente no est\u00e1 implementada durante el redimensionamiento offline. Se inici\u00f3 una discusi\u00f3n sobre esto <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kubernetes-csi\/external-attacher\/issues\/207\">aqu\u00ed<\/a><\/noindex>.<\/li>\n<li> \u00bfQu\u00e9 es exactamente un contenedor sidecar en este contexto? El plugin CSI en s\u00ed no interact\u00faa con la API de Kubernetes, sino que solo responde a las llamadas gRPC que le env\u00edan los contenedores sidecar. Estos \u00faltimos <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes-csi.github.io\/docs\/sidecar-containers.html\">son desarrollados<\/a><\/noindex> por la comunidad de Kubernetes.<\/li>\n<\/ul>\n<p>\nEn nuestro caso (plugin CSI), la operaci\u00f3n de aumentar el disco se presenta de la siguiente manera:<\/p>\n<ol>\n<li> Recibimos una llamada gRPC <code>ControllerExpandVolume<\/code>;<\/li>\n<li> Intentamos aumentar el disco en la API, pero recibimos un error de que no se puede realizar la operaci\u00f3n, ya que el disco est\u00e1 montado;<\/li>\n<li> Guardamos el identificador del disco en un mapa que contiene los discos para los cuales se debe realizar la operaci\u00f3n de aumento. Para abreviar, llamaremos a este mapa <code>volumeResizeRequired<\/code>;<\/li>\n<li> Eliminamos manualmente el pod que utiliza el disco. Kubernetes lo reiniciar\u00e1. Para que el disco no se monte (<code>ControllerPublishVolume<\/code>) antes de que termine la operaci\u00f3n de aumento durante el intento de montaje, verificamos que dicho disco a\u00fan est\u00e9 en <code>volumeResizeRequired<\/code> y devolvemos un error;<\/li>\n<li> El controlador CSI intenta repetir la operaci\u00f3n de redimensionamiento. Si la operaci\u00f3n fue exitosa, eliminamos el disco de <code>volumeResizeRequired<\/code>;<\/li>\n<li> Dado que el identificador del disco no est\u00e1 presente en <code>volumeResizeRequired<\/code>, <code>ControllerPublishVolume<\/code> la operaci\u00f3n se completa con \u00e9xito, el disco se monta, el pod se inicia.<\/li>\n<\/ol>\n<p>\nTodo parece bastante simple, pero como siempre, hay trampas ocultas. El aumento de discos lo maneja <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes-csi.github.io\/docs\/external-resizer.html\">external-resizer<\/a><\/noindex>, que en caso de error al realizar la operaci\u00f3n <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kubernetes-csi\/external-resizer\/blob\/master\/vendor\/k8s.io\/client-go\/util\/workqueue\/default_rate_limiters.go#L41\">utiliza una cola<\/a><\/noindex> con un aumento exponencial del tiempo de espera hasta 1000 segundos:<\/p>\n<pre><code class=\"go\">func DefaultControllerRateLimiter() RateLimiter {\n  return NewMaxOfRateLimiter(\n  NewItemExponentialFailureRateLimiter(5*time.Millisecond, 1000*time.Second),\n  \\\/\\\/ 10 qps, 100 bucket size.  Esto es solo para la velocidad de reintento y es solo el factor general (no por elemento)\n  &amp;BucketRateLimiter{Limiter: rate.NewLimiter(rate.Limit(10), 100)},\n  )\n}<\/code><\/pre>\n<p>\nEsto puede llevar peri\u00f3dicamente a que la operaci\u00f3n de aumento del disco se prolongue m\u00e1s de 15 minutos, y por lo tanto, a la indisponibilidad del pod correspondiente.<\/p>\n<p>La \u00fanica opci\u00f3n que nos permiti\u00f3 reducir f\u00e1cilmente el tiempo de inactividad potencial fue usar nuestra propia versi\u00f3n de external-resizer con un l\u00edmite m\u00e1ximo de tiempo de espera <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/external-resizer\/blob\/faster-workqueue\/pkg\/controller\/controller.go#L81\">de 5 segundos<\/a><\/noindex>:<\/p>\n<pre><code class=\"go\">workqueue.NewItemExponentialFailureRateLimiter(5*time.Millisecond, 5*time.Second)<\/code><\/pre>\n<p>\nNo consideramos necesario iniciar urgentemente una discusi\u00f3n y parchear external-resizer, porque el redimensionamiento offline de discos es un vestigio que pronto desaparecer\u00e1 en todos los proveedores de la nube.<\/p>\n<h2>\u00bfC\u00f3mo empezar a usarlo?<\/h2>\n<p>\nEl controlador es compatible con Kubernetes versi\u00f3n 1.15 y superior. Para el funcionamiento del controlador se deben cumplir los siguientes requisitos:<\/p>\n<ul>\n<li> El flag <code>--allow-privileged<\/code> configurado en <code>true<\/code> para el servidor API y kubelet;<\/li>\n<li> Activado <code>--feature-gates=VolumeSnapshotDataSource=true,KubeletPluginsWatcher=true,CSINodeInfo=true,CSIDriverRegistry=true<\/code> para el servidor API y kubelet;<\/li>\n<li> La propagaci\u00f3n de montaje (<noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/concepts\/storage\/volumes\/#mount-propagation\">mount propagation<\/a><\/noindex>) debe estar habilitada en el cl\u00faster. Al usar Docker, el demonio debe estar configurado de tal manera que se permitan los montajes compartidos (shared mounts).<\/li>\n<\/ul>\n<p>\nTodos los pasos necesarios para la instalaci\u00f3n <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/yandex-csi-driver#installing-driver\">se describen en README<\/a><\/noindex>. La instalaci\u00f3n implica la creaci\u00f3n de objetos en Kubernetes a partir de manifestos.<\/p>\n<p>Para que el controlador funcione, necesitar\u00e1s lo siguiente:<\/p>\n<ul>\n<li> Especificar en el manifiesto el ID del directorio (<code>folder-id<\/code>) de Yandex.Cloud (<noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.yandex.ru\/docs\/resource-manager\/operations\/folder\/get-id\">ve la documentaci\u00f3n<\/a><\/noindex>);<\/li>\n<li> Para interactuar con la API de Yandex.Cloud en el controlador CSI se utiliza una cuenta de servicio. En el manifiesto Secret se deben proporcionar <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.yandex.com\/docs\/iam\/concepts\/authorization\/key\">claves autorizadas<\/a><\/noindex> de la cuenta de servicio. En la documentaci\u00f3n <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.yandex.ru\/docs\/iam\/quickstart-sa\">descrito<\/a><\/noindex>, c\u00f3mo crear una cuenta de servicio y obtener las claves.<\/li>\n<\/ul>\n<p>\nEn resumen \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/yandex-csi-driver\">prueba<\/a><\/noindex>, y estaremos encantados de recibir tus comentarios y <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/yandex-csi-driver\/issues\">nuevos problemas<\/a><\/noindex>, si te encuentras con alg\u00fan problema!<\/p>\n<h2>Soporte adicional<\/h2>\n<p>\nComo conclusi\u00f3n, nos gustar\u00eda se\u00f1alar que este controlador CSI no fue desarrollado por el deseo de experimentar escribiendo aplicaciones en Go, sino por la necesidad urgente dentro de la compa\u00f1\u00eda. No nos parece razonable mantener nuestra propia implementaci\u00f3n, por lo que, si Yandex muestra inter\u00e9s y decide continuar con el soporte del controlador, estaremos encantados de transferir el repositorio a su disposici\u00f3n.<\/p>\n<p>Adem\u00e1s, probablemente Yandex tenga su propia implementaci\u00f3n del controlador CSI en el cl\u00faster Kubernetes administrado, que se puede liberar como Open Source. Esta opci\u00f3n de desarrollo tambi\u00e9n nos parece favorable: la comunidad podr\u00e1 utilizar un controlador comprobado del proveedor de servicios, y no de una empresa externa.<\/p>\n<h2>P.D.<\/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\/465417\/\">Plugins de volumen para almacenamiento en Kubernetes: de Flexvolume a CSI<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/424211\/\">Entendiendo la Interfaz de Almacenamiento de Contenedores (en Kubernetes y m\u00e1s all\u00e1)<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/455543\/\">\u00bfEs f\u00e1cil y conveniente preparar un cl\u00faster de Kubernetes? Anunciamos el addon-operator<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/455543\/\">Ampliando y complementando Kubernetes (rese\u00f1a y video de la presentaci\u00f3n)<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<p>Fuente: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/486190\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0420\u0430\u0434\u044b \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c, \u0447\u0442\u043e \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f \u00ab\u0424\u043b\u0430\u043d\u0442\u00bb \u043f\u043e\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0441\u0432\u043e\u0439 \u0432\u043a\u043b\u0430\u0434 \u0432 Open Source-\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f Kubernetes, \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u0432 \u0430\u043b\u044c\u0444\u0430-\u0432\u0435\u0440\u0441\u0438\u044e \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 CSI (Container Storage Interface) \u0434\u043b\u044f \u042f\u043d\u0434\u0435\u043a\u0441.\u041e\u0431\u043b\u0430\u043a\u0430. \u041d\u043e \u043f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0434\u0435\u0442\u0430\u043b\u044f\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u043e\u0442\u0432\u0435\u0442\u0438\u043c \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441, \u0437\u0430\u0447\u0435\u043c \u044d\u0442\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0443\u0436\u043d\u043e, \u043a\u043e\u0433\u0434\u0430 \u0443 \u042f\u043d\u0434\u0435\u043a\u0441\u0430 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0443\u0441\u043b\u0443\u0433\u0430 Managed Service for Kubernetes. \u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0417\u0430\u0447\u0435\u043c \u044d\u0442\u043e? \u0412\u043d\u0443\u0442\u0440\u0438 \u043d\u0430\u0448\u0435\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438, \u0435\u0449\u0451 \u0441 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":40722,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-40721","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0420\u0430\u0434\u044b \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c, \u0447\u0442\u043e \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f.\" \/>\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\/nash-opyt-razrabotki-csi-drajvera-v-kubernetes-dlya-yandeks-oblaka\" \/>\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\u041d\u0430\u0448 \u043e\u043f\u044b\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 CSI-\u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0432 Kubernetes \u0434\u043b\u044f \u042f\u043d\u0434\u0435\u043a\u0441.\u041e\u0431\u043b\u0430\u043a\u0430 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0420\u0430\u0434\u044b \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c, \u0447\u0442\u043e \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/es\/blog\/nash-opyt-razrabotki-csi-drajvera-v-kubernetes-dlya-yandeks-oblaka\" \/>\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-02-03T11:41:59+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-03T11:41:59+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\udd47Nuestra experiencia en el desarrollo del controlador CSI en Kubernetes para Yandex.Cloud | ProHoster","description":"Nos complace anunciar que la empresa.","canonical_url":"https:\/\/prohoster.info\/es\/blog\/nash-opyt-razrabotki-csi-drajvera-v-kubernetes-dlya-yandeks-oblaka","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\u041d\u0430\u0448 \u043e\u043f\u044b\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 CSI-\u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0432 Kubernetes \u0434\u043b\u044f \u042f\u043d\u0434\u0435\u043a\u0441.\u041e\u0431\u043b\u0430\u043a\u0430 | ProHoster","og:description":"\u0420\u0430\u0434\u044b \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c, \u0447\u0442\u043e \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f.","og:url":"https:\/\/prohoster.info\/es\/blog\/nash-opyt-razrabotki-csi-drajvera-v-kubernetes-dlya-yandeks-oblaka","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-02-03T11:41:59+00:00","article:modified_time":"2020-02-03T11:41:59+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"40721","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-03-01 00:32:40","updated":"2022-09-30 15:42:14","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\/40721","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=40721"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/40721\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/40722"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=40721"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=40721"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=40721"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}