{"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\/pt\/blog\/nash-opyt-razrabotki-csi-drajvera-v-kubernetes-dlya-yandeks-oblaka","title":{"rendered":"Nossa experi\u00eancia de desenvolvimento de um driver CSI no Kubernetes para Yandex.Cloud","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Nossa experi\u00eancia de desenvolvimento de um driver CSI no Kubernetes para Yandex.Cloud\" src=\"\/wp-content\/uploads\/2020\/02\/86adf77b2ee08c426bf79c5b9b2d3d1e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEstamos felizes em anunciar que a empresa \"Flant\" est\u00e1 expandindo sua contribui\u00e7\u00e3o para ferramentas de Open Source para Kubernetes, lan\u00e7ando <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/yandex-csi-driver\">a vers\u00e3o alfa do driver CSI<\/a><\/noindex> (Container Storage Interface) para Yandex.Cloud.<\/p>\n<p>Mas antes de entrarmos nos detalhes da implementa\u00e7\u00e3o, vamos responder \u00e0 pergunta, por que isso \u00e9 necess\u00e1rio, quando o Yandex j\u00e1 possui o servi\u00e7o <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>Introdu\u00e7\u00e3o<\/h2>\n<p><\/p>\n<h3>Por que isso?<\/h3>\n<p>\nDentro da nossa empresa, desde o in\u00edcio da opera\u00e7\u00e3o do Kubernetes em produ\u00e7\u00e3o (ou seja, h\u00e1 v\u00e1rios anos), desenvolvemos uma ferramenta pr\u00f3pria (deckhouse), que, por sinal, tamb\u00e9m planejamos tornar dispon\u00edvel em breve como um projeto Open Source. Com ela, configuramos e ajustamos uniformemente todos os nossos clusters, e atualmente j\u00e1 s\u00e3o mais de 100, em diferentes configura\u00e7\u00f5es de hardware e em todos os servi\u00e7os de nuvem dispon\u00edveis.<\/p>\n<p>Os clusters que utilizam o deckhouse possuem todos os componentes necess\u00e1rios para funcionar: balanceadores, monitoramento com gr\u00e1ficos e m\u00e9tricas amig\u00e1veis, alertas, autentica\u00e7\u00e3o de usu\u00e1rios atrav\u00e9s de provedores externos para acesso a todos os dashboards, e assim por diante. Um cluster \"potente\" como esse n\u00e3o faz sentido ser colocado em uma solu\u00e7\u00e3o gerenciada, pois muitas vezes isso \u00e9 imposs\u00edvel, ou levar\u00e1 \u00e0 necessidade de desativar metade dos componentes.<\/p>\n<p><i><b>NB<\/b>: Esta \u00e9 a nossa experi\u00eancia, e ela \u00e9 bastante espec\u00edfica. De forma alguma afirmamos que todos devem lidar com a configura\u00e7\u00e3o de clusters Kubernetes em vez de utilizar solu\u00e7\u00f5es prontas. Vale ressaltar que n\u00e3o temos experi\u00eancia real no uso do Kubernetes da parte do Yandex e n\u00e3o faremos uma avalia\u00e7\u00e3o deste servi\u00e7o neste artigo.<\/i><\/p>\n<h3>O que \u00e9 isso e para quem?<\/h3>\n<p>\nAssim, j\u00e1 falamos sobre a abordagem moderna para armazenamento em Kubernetes: <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/424211\/\">como funciona o CSI<\/a><\/noindex> e <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/465417\/\">como a comunidade chegou<\/a><\/noindex> a essa abordagem.<\/p>\n<p>Atualmente, muitos grandes provedores de servi\u00e7os em nuvem desenvolveram drivers para utilizar seus \"discos de nuvem\" como Persistent Volume no Kubernetes. Se o provedor n\u00e3o tiver tal driver, mas todas as fun\u00e7\u00f5es necess\u00e1rias forem oferecidas atrav\u00e9s de API, nada impede a implementa\u00e7\u00e3o de um driver por conta pr\u00f3pria. Assim, foi como conseguimos com o Yandex.Cloud.<\/p>\n<p>Tomamos como base para o desenvolvimento <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/digitalocean\/csi-digitalocean\">o driver CSI para a nuvem DigitalOcean<\/a><\/noindex> e algumas ideias do <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kubernetes-sigs\/gcp-compute-persistent-disk-csi-driver\">driver para GCP,<\/a><\/noindex>j\u00e1 que a intera\u00e7\u00e3o com as APIs dessas nuvens (Google e Yandex) possui v\u00e1rias semelhan\u00e7as. Em particular, as APIs de ambos <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.google.com\/compute\/docs\/api\/how-tos\/api-requests-responses#handling_api_responses\">GCP<\/a><\/noindex>e <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.yandex.ru\/docs\/api-design-guide\/concepts\/about-async\">Yandex<\/a><\/noindex> retorna um objeto <code>Opera\u00e7\u00e3o<\/code> para monitorar o status de opera\u00e7\u00f5es longas (por exemplo, a cria\u00e7\u00e3o de um novo disco). Para interagir com a API do Yandex.Cloud, utiliza-se <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/yandex-cloud\/go-sdk\">Yandex.Cloud Go SDK<\/a><\/noindex>.<\/p>\n<p>O resultado do trabalho realizado <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/yandex-csi-driver\">est\u00e1 publicado no GitHub<\/a><\/noindex> e pode ser \u00fatil para aqueles que, por algum motivo, usam sua pr\u00f3pria instala\u00e7\u00e3o do Kubernetes em m\u00e1quinas virtuais do Yandex.Cloud (mas n\u00e3o um cluster gerenciado pronto) e gostariam de usar (encomendar) discos atrav\u00e9s do CSI.<\/p>\n<h2>Implementa\u00e7\u00e3o<\/h2>\n<p><\/p>\n<h3>Principais funcionalidades<\/h3>\n<p>\nAtualmente, o driver suporta as seguintes fun\u00e7\u00f5es:<\/p>\n<ul>\n<li> Encomenda de discos em todas as zonas do cluster de acordo com a topologia dos n\u00f3s dispon\u00edveis no cluster;<\/li>\n<li> Remo\u00e7\u00e3o de discos encomendados anteriormente;<\/li>\n<li> Redimensionamento offline para discos (Yandex.Cloud <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.yandex.ru\/docs\/compute\/operations\/disk-control\/update#change-disk-size\">n\u00e3o suporta<\/a><\/noindex> aumentando discos que est\u00e3o montados na m\u00e1quina virtual). Sobre como foi necess\u00e1rio melhorar o driver para realizar o redimensionamento da forma mais indolor poss\u00edvel, veja abaixo.<\/li>\n<\/ul>\n<p>\nFuturamente, est\u00e1 previsto implementar o suporte \u00e0 cria\u00e7\u00e3o e remo\u00e7\u00e3o de snapshots de discos.<\/p>\n<h3>A principal dificuldade e sua supera\u00e7\u00e3o<\/h3>\n<p>\nA aus\u00eancia na API do Yandex.Cloud da possibilidade de aumentar discos em tempo real \u00e9 uma limita\u00e7\u00e3o que complica a opera\u00e7\u00e3o de redimensionamento para PV (Volume Persistente): neste caso, \u00e9 necess\u00e1rio que o pod da aplica\u00e7\u00e3o que utiliza o disco esteja parado, o que pode causar a inatividade da aplica\u00e7\u00e3o.<\/p>\n<p>De acordo com <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/container-storage-interface\/spec\">a especifica\u00e7\u00e3o CSI<\/a><\/noindex>, se o controlador CSI informa que s\u00f3 consegue fazer resize de discos \u00aboffline\u00bb (<code>VolumeExpansion.OFFLINE<\/code>), ent\u00e3o o processo de aumento do disco deve ocorrer da seguinte forma:<\/p>\n<blockquote><p>Se o plugin tem apenas <code>VolumeExpansion.OFFLINE<\/code> capacidade de expans\u00e3o e o volume est\u00e1 atualmente publicado ou dispon\u00edvel em um n\u00f3, ent\u00e3o <code>ControllerExpandVolume<\/code> DEVE ser chamado SOMENTE ap\u00f3s uma das seguintes condi\u00e7\u00f5es:<\/p>\n<ul>\n<li> O plugin tem capacidade de controlador <code>PUBLISH_UNPUBLISH_VOLUME<\/code> e <code>ControllerUnpublishVolume<\/code> foi invocado com sucesso.<\/li>\n<\/ul>\n<p>\nOU<\/p>\n<ul>\n<li> O plugin N\u00c3O possui capacidade de controlador, o plugin tem <code>PUBLISH_UNPUBLISH_VOLUME<\/code> capacidade de n\u00f3 <code>STAGE_UNSTAGE_VOLUME<\/code> e <code>NodeUnstageVolume<\/code> foi conclu\u00eddo com sucesso.<\/li>\n<\/ul>\n<p>\nOU<\/p>\n<ul>\n<li>O plugin N\u00c3O possui capacidade de controlador, o plugin tem <code>PUBLISH_UNPUBLISH_VOLUME<\/code> capacidade, nem n\u00f3 <code>STAGE_UNSTAGE_VOLUME<\/code> e <code>NodeUnpublishVolume<\/code> foi conclu\u00eddo com sucesso.<\/li>\n<\/ul>\n<\/blockquote>\n<p>\nIsso essencialmente significa que \u00e9 necess\u00e1rio desconectar o disco da m\u00e1quina virtual antes de aument\u00e1-lo.<\/p>\n<p>No entanto, infelizmente, <b>implementa\u00e7\u00e3o<\/b> as especifica\u00e7\u00f5es do CSI atrav\u00e9s dos sidecars n\u00e3o atendem a esses requisitos:<\/p>\n<ul>\n<li> No container sidecar <code>csi-attacher<\/code>, que deve ser respons\u00e1vel por garantir o espa\u00e7o adequado entre as montagens, esse funcionalidade n\u00e3o foi implementada no redimensionamento offline. A discuss\u00e3o sobre isso foi iniciada <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kubernetes-csi\/external-attacher\/issues\/207\">aqui<\/a><\/noindex>.<\/li>\n<li> O que \u00e9, afinal, um cont\u00eainer sidecar nesse contexto? O pr\u00f3prio plugin CSI n\u00e3o interage com a API do Kubernetes, apenas reage a chamadas gRPC que s\u00e3o enviadas a ele pelos cont\u00eaineres sidecar. Os \u00faltimos <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes-csi.github.io\/docs\/sidecar-containers.html\">s\u00e3o desenvolvidos<\/a><\/noindex> s\u00e3o da comunidade Kubernetes.<\/li>\n<\/ul>\n<p>\nNo nosso caso (plugin CSI), a opera\u00e7\u00e3o de aumento de disco parece da seguinte maneira:<\/p>\n<ol>\n<li> Recebemos uma chamada gRPC <code>ControllerExpandVolume<\/code>;<\/li>\n<li> Tentamos aumentar o disco na API, mas recebemos um erro de opera\u00e7\u00e3o n\u00e3o permitida, pois o disco est\u00e1 montado;<\/li>\n<li> Salvamos o identificador do disco em um mapa que cont\u00e9m discos para os quais \u00e9 necess\u00e1ria a opera\u00e7\u00e3o de aumento. Daqui em diante, para abreviar, chamaremos esse mapa de <code>volumeResizeRequired<\/code>;<\/li>\n<li> Removemos manualmente o pod que est\u00e1 utilizando o disco. O Kubernetes o reiniciar\u00e1. Para que o disco n\u00e3o seja montado (<code>ControllerPublishVolume<\/code>) antes da conclus\u00e3o da opera\u00e7\u00e3o de aumento durante a tentativa de montagem, verificamos se este disco ainda est\u00e1 em <code>volumeResizeRequired<\/code> e retornamos um erro;<\/li>\n<li> O driver CSI tenta repetir a opera\u00e7\u00e3o de resize. Se a opera\u00e7\u00e3o for bem-sucedida, removemos o disco de <code>volumeResizeRequired<\/code>;<\/li>\n<li> Como o identificador do disco n\u00e3o est\u00e1 presente em <code>volumeResizeRequired<\/code>, <code>ControllerPublishVolume<\/code> a opera\u00e7\u00e3o \u00e9 bem-sucedida, o disco \u00e9 montado e o pod \u00e9 iniciado.<\/li>\n<\/ol>\n<p>\nTudo parece bastante simples, mas como sempre h\u00e1 armadilhas. O aumento dos discos \u00e9 feito por <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes-csi.github.io\/docs\/external-resizer.html\">external-resizer<\/a><\/noindex>, que em caso de erro ao realizar a opera\u00e7\u00e3o <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\">usa uma fila<\/a><\/noindex> com aumento exponencial do tempo de tempo limite at\u00e9 1000 segundos:<\/p>\n<pre><code class=\"go\">func DefaultControllerRateLimiter() RateLimiter {\n  return NewMaxOfRateLimiter(\n  NewItemExponentialFailureRateLimiter(5*time.Millisecond, 1000*time.Second),\n  \t\/\/ 10 qps, 100 bucket size.  Isso \u00e9 apenas para velocidade de repeti\u00e7\u00e3o e \u00e9 apenas o fator geral (n\u00e3o por item)\n  &amp;BucketRateLimiter{Limiter: rate.NewLimiter(rate.Limit(10), 100)},\n  )\n}<\/code><\/pre>\n<p>\nIsso pode ocasionalmente fazer com que a opera\u00e7\u00e3o de aumento de disco se prolongue por mais de 15 minutos, resultando assim na indisponibilidade do pod correspondente.<\/p>\n<p>A \u00fanica op\u00e7\u00e3o que nos permitiu reduzir o tempo potencial de inatividade de forma relativamente f\u00e1cil foi usar nossa pr\u00f3pria vers\u00e3o do external-resizer com um limite m\u00e1ximo de tempo limite <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>\nN\u00e3o achamos necess\u00e1rio iniciar uma discuss\u00e3o urgente e corrigir o external-resizer, pois o resize offline de discos \u00e9 um atavismo que em breve desaparecer\u00e1 de todos os provedores de nuvem.<\/p>\n<h2>Como come\u00e7ar a usar?<\/h2>\n<p>\nO driver \u00e9 suportado nas vers\u00f5es do Kubernetes 1.15 e superiores. Para que o driver funcione, os seguintes requisitos devem ser atendidos:<\/p>\n<ul>\n<li> A bandeira <code>--allow-privileged<\/code> definido como <code>verdadeiro<\/code> para o API server e kubelet;<\/li>\n<li> Ativado <code>--feature-gates=VolumeSnapshotDataSource=true,KubeletPluginsWatcher=true,CSINodeInfo=true,CSIDriverRegistry=true<\/code> para o API server e kubelet;<\/li>\n<li> A propaga\u00e7\u00e3o de montagem (<noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/concepts\/storage\/volumes\/#mount-propagation\">propaga\u00e7\u00e3o de montagem<\/a><\/noindex>) deve ser habilitada no cluster. Ao usar o Docker, o daemon deve ser configurado para permitir montagens compartilhadas.<\/li>\n<\/ul>\n<p>\nTodos os passos necess\u00e1rios para a instala\u00e7\u00e3o <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/yandex-csi-driver#installing-driver\">est\u00e3o descritos no README<\/a><\/noindex>. A instala\u00e7\u00e3o envolve a cria\u00e7\u00e3o de objetos no Kubernetes a partir de manifestos.<\/p>\n<p>Para o funcionamento do driver, voc\u00ea precisar\u00e1 do seguinte:<\/p>\n<ul>\n<li> especificar no manifesto o identificador do diret\u00f3rio (<code>folder-id<\/code>) do Yandex.Cloud (<noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.yandex.ru\/docs\/resource-manager\/operations\/folder\/get-id\">veja a documenta\u00e7\u00e3o<\/a><\/noindex>);<\/li>\n<li> . Para interagir com a API do Yandex.Cloud no driver CSI, \u00e9 utilizado uma conta de servi\u00e7o. No manifesto Secret, \u00e9 necess\u00e1rio fornecer <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.yandex.com\/docs\/iam\/concepts\/authorization\/key\">chaves autorizadas<\/a><\/noindex> da conta de servi\u00e7o. Na documenta\u00e7\u00e3o <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.yandex.ru\/docs\/iam\/quickstart-sa\">est\u00e1 descrito<\/a><\/noindex>, como criar uma conta de servi\u00e7o e obter as chaves.<\/li>\n<\/ul>\n<p>\nEm geral \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/yandex-csi-driver\">tente<\/a><\/noindex>, e ficaremos felizes com seu feedback e <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/yandex-csi-driver\/issues\">novos problemas<\/a><\/noindex>, caso encontre alguma dificuldade!<\/p>\n<h2>Suporte adicional<\/h2>\n<p>\nPor fim, gostar\u00edamos de destacar que este driver CSI foi desenvolvido n\u00e3o por um grande desejo de nos divertir escrevendo aplicativos em Go, mas por uma necessidade urgente dentro da empresa. Consideramos que manter nossa pr\u00f3pria implementa\u00e7\u00e3o n\u00e3o \u00e9 vi\u00e1vel, portanto, se o Yandex demonstrar interesse e decidir continuar o suporte ao driver, ficaremos felizes em transferir o reposit\u00f3rio para eles.<\/p>\n<p>Al\u00e9m disso, provavelmente o Yandex tem sua pr\u00f3pria implementa\u00e7\u00e3o do driver CSI no cluster Kubernetes gerenciado, que pode ser lan\u00e7ado como Open Source. Essa op\u00e7\u00e3o de desenvolvimento tamb\u00e9m nos parece favor\u00e1vel \u2014 a comunidade poder\u00e1 usar um driver testado do provedor de servi\u00e7os, em vez de uma empresa externa.<\/p>\n<h2>P.S.<\/h2>\n<p>\nConfira tamb\u00e9m em nosso blog:<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/465417\/\">Plugins de volume para armazenamento no 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\/\">Entendendo a Interface de Armazenamento de Cont\u00eaineres (no Kubernetes e al\u00e9m)<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/455543\/\">\u00c9 f\u00e1cil e pr\u00e1tico configurar um cluster Kubernetes? Apresentamos o addon-operator<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/455543\/\">Expandindo e complementando o Kubernetes (vis\u00e3o geral e v\u00eddeo da apresenta\u00e7\u00e3o)<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<p>Fonte: <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.3 - 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\/pt\/blog\/nash-opyt-razrabotki-csi-drajvera-v-kubernetes-dlya-yandeks-oblaka\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\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\/pt\/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\udd47Nossa experi\u00eancia no desenvolvimento do driver CSI no Kubernetes para o Yandex.Cloud | ProHoster","description":"Ficamos felizes em anunciar que a empresa.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/nash-opyt-razrabotki-csi-drajvera-v-kubernetes-dlya-yandeks-oblaka","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","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\/pt\/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\/pt\/wp-json\/wp\/v2\/posts\/40721","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=40721"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/40721\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/40722"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=40721"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=40721"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=40721"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}