{"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\/nl\/blog\/nash-opyt-razrabotki-csi-drajvera-v-kubernetes-dlya-yandeks-oblaka","title":{"rendered":"Onze ervaring met het ontwikkelen van een CSI-driver in Kubernetes voor Yandex.Cloud","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Onze ervaring met het ontwikkelen van een CSI-driver in Kubernetes voor Yandex.Cloud\" src=\"\/wp-content\/uploads\/2020\/02\/86adf77b2ee08c426bf79c5b9b2d3d1e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWe zijn blij aan te kondigen dat het bedrijf 'Flant' zijn bijdrage aan Open Source-tools voor Kubernetes vergroot door <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/yandex-csi-driver\">de alfa-versie van de CSI-driver<\/a><\/noindex> (Container Storage Interface) voor Yandex.Cloud uit te brengen.<\/p>\n<p>Maar voordat we ingaan op de details van de implementatie, laten we de vraag beantwoorden waarom dit \u00fcberhaupt nodig is, aangezien Yandex al een dienst heeft <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>Inleiding<\/h2>\n<p><\/p>\n<h3>Waarom is dit?<\/h3>\n<p>\nBinnen ons bedrijf, sinds het begin van de productie van Kubernetes (d.w.z. al enkele jaren), ontwikkelen we een eigen tool (deckhouse), die we trouwens ook van plan zijn binnenkort als Open Source-project beschikbaar te stellen. Hiermee configureren en stellen we al onze clusters uniform in, en op dit moment zijn dat er al meer dan 100, op de meest uiteenlopende hardwareconfiguraties en in alle beschikbare cloudservices.<\/p>\n<p>Clusters die deckhouse gebruiken, bevatten alle benodigde componenten voor werking: load balancers, monitoring met handige grafieken, statistieken en alerts, gebruikersauthenticatie via externe providers voor toegang tot alle dashboards, enzovoort. Zo'n 'uitgebreide' cluster is niet geschikt voor een managed-oplossing, omdat dit vaak ofwel onmogelijk is, of leidt tot het uitschakelen van de helft van de componenten.<\/p>\n<p><i><b>NB<\/b>: Dit is onze ervaring, en die is vrij specifiek. We beweren in geen geval dat iedereen zelf clusters van Kubernetes moet opzetten in plaats van gebruik te maken van kant-en-klare oplossingen. Terzijde, we hebben geen daadwerkelijke ervaring met het gebruik van Kubernetes van Yandex en we zullen in dit artikel geen beoordeling van deze dienst geven.<\/i><\/p>\n<h3>Wat is dit en voor wie?<\/h3>\n<p>\nDus we hebben al gesproken over de moderne benadering van opslag in Kubernetes: <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/424211\/\">hoe CSI werkt<\/a><\/noindex> en <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/465417\/\">hoe de gemeenschap tot<\/a><\/noindex> deze benadering is gekomen.<\/p>\n<p>Veel grote cloudproviders hebben momenteel drivers ontwikkeld voor het gebruik van hun 'cloud'-schijven als Persistent Volume in Kubernetes. Als er echter geen driver van de provider is, maar alle benodigde functies via API worden aangeboden, staat niets een implementatie van de driver met eigen middelen in de weg. Zo hebben wij dat gedaan met Yandex.Cloud.<\/p>\n<p>Als basis voor onze ontwikkeling hebben we <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/digitalocean\/csi-digitalocean\">de CSI-driver voor DigitalOcean<\/a><\/noindex> en een paar idee\u00ebn uit <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kubernetes-sigs\/gcp-compute-persistent-disk-csi-driver\">de driver voor GCP<\/a><\/noindex>, omdat de interactie met de API van deze cloudservices (Google en Yandex) verschillende overeenkomsten vertoont. In het bijzonder, zowel de API van <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.google.com\/compute\/docs\/api\/how-tos\/api-requests-responses#handling_api_responses\">GCP<\/a><\/noindex>, als die van <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.yandex.ru\/docs\/api-design-guide\/concepts\/about-async\">Yandex<\/a><\/noindex> geven een object terug <code>Bewerking<\/code> voor het volgen van de status van langdurige processen (bijvoorbeeld het aanmaken van een nieuwe schijf). Voor interactie met de API van Yandex.Cloud wordt gebruik gemaakt van <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/yandex-cloud\/go-sdk\">Yandex.Cloud Go SDK<\/a><\/noindex>.<\/p>\n<p>Het resultaat van het voltooide werk <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/yandex-csi-driver\">is gepubliceerd op GitHub<\/a><\/noindex> en kan nuttig zijn voor degenen die om een bepaalde reden hun eigen installatie van Kubernetes op virtuele machines in Yandex.Cloud gebruiken (maar niet een kant-en-klaar managed cluster) en graag schijven via CSI willen aanmaken (bestellen).<\/p>\n<h2>Implementatie<\/h2>\n<p><\/p>\n<h3>Belangrijkste mogelijkheden<\/h3>\n<p>\nOp dit moment ondersteunt de driver de volgende functies:<\/p>\n<ul>\n<li> Bestelling van schijven in alle zones van de cluster volgens de topologie van de beschikbare knooppunten in de cluster;<\/li>\n<li> Verwijdering van eerder bestelde schijven;<\/li>\n<li> Offline resizing voor schijven (Yandex.Cloud <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.yandex.ru\/docs\/compute\/operations\/disk-control\/update#change-disk-size\">ondersteunt niet<\/a><\/noindex> het vergroten van schijven die aan een virtuele machine zijn gekoppeld). Hoe de driver verder moest worden aangepast om resizing zo soepel mogelijk te laten verlopen, zie hieronder.<\/li>\n<\/ul>\n<p>\nIn de toekomst is het de bedoeling om ondersteuning voor het aanmaken en verwijderen van snapshots van schijven te implementeren.<\/p>\n<h3>De grootste uitdaging en hoe deze te overwinnen<\/h3>\n<p>\nHet ontbreken van de mogelijkheid om schijven in real-time te vergroten via de Yandex.Cloud API vormt een beperking die de resize-operatie voor PV (Persistent Volume) bemoeilijkt: in dat geval moet de pod van de applicatie die de schijf gebruikt, worden gestopt, wat kan leiden tot een onderbreking van de applicatie.<\/p>\n<p>Volgens <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/container-storage-interface\/spec\">CSI-specificaties<\/a><\/noindex>, als de CSI-controller aangeeft dat deze alleen 'offline' schijven kan resizen (<code>VolumeExpansion.OFFLINE<\/code>), dan moet het proces voor het vergroten van de schijf als volgt verlopen:<\/p>\n<blockquote><p>Als de plugin alleen <code>VolumeExpansion.OFFLINE<\/code> uitbreidingscapaciteit heeft en de volume momenteel op een knooppunt is gepubliceerd of beschikbaar, dan <code>moet ControllerExpandVolume<\/code> WORDEN aangeroepen ALS<\/p>\n<ul>\n<li> De plugin controller <code>PUBLISH_UNPUBLISH_VOLUME<\/code> capaciteit heeft en <code>ControllerUnpublishVolume<\/code> met succes is aangeroepen.<\/li>\n<\/ul>\n<p>\nOF ANDERS<\/p>\n<ul>\n<li> De plugin heeft GEEN controller <code>PUBLISH_UNPUBLISH_VOLUME<\/code> capaciteit, de plugin heeft knooppunt <code>STAGE_UNSTAGE_VOLUME<\/code> capaciteit, en <code>NodeUnstageVolume<\/code> is succesvol voltooid.<\/li>\n<\/ul>\n<p>\nOF ANDERS<\/p>\n<ul>\n<li>De plugin heeft GEEN controller <code>PUBLISH_UNPUBLISH_VOLUME<\/code> capaciteit, noch knooppunt <code>STAGE_UNSTAGE_VOLUME<\/code> capaciteit, en <code>NodeUnpublishVolume<\/code> is met succes voltooid.<\/li>\n<\/ul>\n<\/blockquote>\n<p>\nIn wezen betekent dit dat de schijf van de virtuele machine moet worden losgekoppeld voordat deze kan worden vergroot.<\/p>\n<p>Helaas, <b>implementatie<\/b> de CSI-specificaties via sidecars voldoen niet aan deze vereisten:<\/p>\n<ul>\n<li> In de sidecar container <code>csi-attacher<\/code>, die verantwoordelijk zou moeten zijn voor het waarborgen van de benodigde ruimte tussen montages, is deze functionaliteit eenvoudigweg niet gerealiseerd tijdens offline resizing. Deze discussie is ge\u00efnitieerd. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kubernetes-csi\/external-attacher\/issues\/207\">hier<\/a><\/noindex>.<\/li>\n<li> Wat is een sidecar-container in deze context? De CSI-plugin communiceert niet met de Kubernetes API, maar reageert alleen op gRPC-aanroepen die door sidecar-containers worden verzonden. Laatstgenoemden <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes-csi.github.io\/docs\/sidecar-containers.html\">meer dan tien tools ontwikkeld (schema 1). Hieronder zullen we meer gedetailleerd ingaan op enkele van deze tools: Flow Runner, RePlAce, TritonCTS, OpenSTA.<\/a><\/noindex> door de Kubernetes-gemeenschap.<\/li>\n<\/ul>\n<p>\nIn ons geval (CSI-plugin) ziet de schijfvergroting operatie er als volgt uit:<\/p>\n<ol>\n<li> We ontvangen een gRPC-aanroep <code>moet ControllerExpandVolume<\/code>;<\/li>\n<li> We proberen de schijf te vergroten via de API, maar krijgen een foutmelding over het niet kunnen uitvoeren van de operatie, omdat de schijf is gemonteerd;<\/li>\n<li> We slaan de schijf-ID op in een map met schijven waarvoor de vergrotingsoperatie moet worden uitgevoerd. Voor de duidelijkheid noemen we deze map <code>volumeResizeRequired<\/code>;<\/li>\n<li> Verwijder handmatig de pod die de schijf gebruikt. Kubernetes zal deze opnieuw opstarten. Om te voorkomen dat de schijf snel wordt gemonteerd (<code>ControllerPublishVolume<\/code>) voordat de vergrotingsoperatie is voltooid, controleren we of deze schijf nog steeds in <code>volumeResizeRequired<\/code> en geven een foutmelding terug;<\/li>\n<li> De CSI-driver probeert de resize-operatie opnieuw uit te voeren. Als de operatie succesvol was, verwijderen we de schijf uit <code>volumeResizeRequired<\/code>;<\/li>\n<li> Omdat de schijf-ID afwezig is in <code>volumeResizeRequired<\/code>, <code>ControllerPublishVolume<\/code> verloopt succesvol, de schijf wordt gemonteerd, de pod wordt gestart.<\/li>\n<\/ol>\n<p>\nHet lijkt allemaal vrij eenvoudig, maar zoals altijd zijn er haken en ogen. De vergroting van schijven wordt uitgevoerd door <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes-csi.github.io\/docs\/external-resizer.html\">external-resizer<\/a><\/noindex>, die in geval van een fout bij het uitvoeren van de operatie <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\">een wachtrij gebruikt<\/a><\/noindex> met een exponenti\u00eble toename van de timeout tot 1000 seconden:<\/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. Dit is alleen voor de retry-snelheid en het is alleen de algemene factor (niet per item)\n  &amp;BucketRateLimiter{Limiter: rate.NewLimiter(rate.Limit(10), 100)},\n  )\n}<\/code><\/pre>\n<p>\nDit kan er periodiek toe leiden dat de schijfvergroting meer dan 15 minuten in beslag neemt, met als gevolg dat de bijbehorende pod niet beschikbaar is.<\/p>\n<p>De enige optie die ons voldoende en pijnloos in staat stelde de potenti\u00eble stilstandtijd te verminderen, was het gebruik van onze eigen versie van de external-resizer met een maximale timeout-limiet <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/external-resizer\/blob\/faster-workqueue\/pkg\/controller\/controller.go#L81\">van 5 seconden<\/a><\/noindex>:<\/p>\n<pre><code class=\"go\">workqueue.NewItemExponentialFailureRateLimiter(5*time.Millisecond, 5*time.Second)<\/code><\/pre>\n<p>\nWe vonden het niet nodig om een nooddiscussie te starten en de external-resizer te patchen, omdat offline schijfvergroting een relikwie is dat binnenkort zal verdwijnen bij alle cloudproviders.<\/p>\n<h2>Hoe te beginnen?<\/h2>\n<p>\nDe driver wordt ondersteund in Kubernetes versie 1.15 en hoger. De volgende vereisten moeten worden vervuld om de driver te laten werken:<\/p>\n<ul>\n<li> Vlag <code>--allow-privileged<\/code> is ingesteld op <code>true<\/code> voor de API-server en kubelet;<\/li>\n<li> Ingeschakeld <code>--feature-gates=VolumeSnapshotDataSource=true,KubeletPluginsWatcher=true,CSINodeInfo=true,CSIDriverRegistry=true<\/code> voor de API-server en kubelet;<\/li>\n<li> Montageverspreiding (<noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/concepts\/storage\/volumes\/#mount-propagation\">mount propagation<\/a><\/noindex>) moet ingeschakeld zijn in de cluster. Bij gebruik van Docker moet de daemon zo geconfigureerd zijn dat gedeelde montageobjecten (shared mounts) zijn toegestaan.<\/li>\n<\/ul>\n<p>\nAlle noodzakelijke stappen voor de installatie zelf <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/yandex-csi-driver#installing-driver\">staan beschreven in README<\/a><\/noindex>. De installatie is het cre\u00ebren van objecten in Kubernetes vanuit manifesten.<\/p>\n<p>Voor het functioneren van de driver heeft u het volgende nodig:<\/p>\n<ul>\n<li> Geef in het manifest de map-ID aan (<code>folder-id<\/code>) van Yandex.Cloud (<noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.yandex.ru\/docs\/resource-manager\/operations\/folder\/get-id\">zie de documentatie<\/a><\/noindex>);<\/li>\n<li> Voor interactie met de API van Yandex.Cloud in de CSI-driver wordt een serviceaccount gebruikt. In het Secret manifest moet u doorgeven <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.yandex.com\/docs\/iam\/concepts\/authorization\/key\">geautoriseerde sleutels<\/a><\/noindex> van het serviceaccount. In de documentatie <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.yandex.ru\/docs\/iam\/quickstart-sa\">is beschreven.<\/a><\/noindex>wordt beschreven hoe een serviceaccount wordt aangemaakt en hoe u sleutels kunt verkrijgen.<\/li>\n<\/ul>\n<p>\nIn het algemeen \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/yandex-csi-driver\">probeer het eens<\/a><\/noindex>, en we horen graag feedback en <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/yandex-csi-driver\/issues\">nieuwe issues<\/a><\/noindex>, mocht u tegen problemen aanlopen!<\/p>\n<h2>Verdere ondersteuning<\/h2>\n<p>\nAls conclusie willen we opmerken dat we deze CSI-driver niet uit een groot verlangen om plezier te hebben met het schrijven van applicaties in Go hebben ontwikkeld, maar uit dringende noodzaak binnen het bedrijf. Het lijkt ons niet zinvol om onze eigen implementatie te onderhouden, dus als Yandex interesse toont en besluit de ondersteuning van de driver voort te zetten, zullen we het repository graag aan hen overdragen.<\/p>\n<p>Bovendien heeft Yandex waarschijnlijk zijn eigen implementatie van de CSI-driver in de managed Kubernetes-cluster, die als open source kan worden uitgebracht. Dit ontwikkelingstraject lijkt ons ook gunstig \u2014 de gemeenschap kan gebruikmaken van een beproefde driver van de dienstverlener in plaats van van een extern bedrijf.<\/p>\n<h2>P.S.<\/h2>\n<p>\nLees ook op onze blog:<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/465417\/\">Volume-plugins voor opslag in Kubernetes: van Flexvolume naar CSI<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/424211\/\">Begrijp de Container Storage Interface (in Kubernetes en daarbuiten)<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/455543\/\">Is het eenvoudig en handig om een Kubernetes-cluster op te zetten? We introduceren de addon-operator<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/455543\/\">We breiden Kubernetes uit en vullen het aan (overzicht en video van de presentatie)<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<p>Bron: <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\/nl\/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=\"nl_NL\" \/>\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\/nl\/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\udd47Onze ervaring met de ontwikkeling van de CSI-driver in Kubernetes voor Yandex.Cloud | ProHoster","description":"We zijn blij aan te kondigen dat het bedrijf.","canonical_url":"https:\/\/prohoster.info\/nl\/blog\/nash-opyt-razrabotki-csi-drajvera-v-kubernetes-dlya-yandeks-oblaka","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"nl_NL","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\/nl\/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\/nl\/wp-json\/wp\/v2\/posts\/40721","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/comments?post=40721"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts\/40721\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media\/40722"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media?parent=40721"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/categories?post=40721"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/tags?post=40721"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}