{"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\/da\/blog\/nash-opyt-razrabotki-csi-drajvera-v-kubernetes-dlya-yandeks-oblaka","title":{"rendered":"Vores erfaring med at udvikle en CSI-driver i Kubernetes til Yandex.Cloud","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Vores erfaring med at udvikle en CSI-driver i Kubernetes til Yandex.Cloud\" src=\"\/wp-content\/uploads\/2020\/02\/86adf77b2ee08c426bf79c5b9b2d3d1e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVi er glade for at annoncere, at virksomheden \"Flant\" udvider sin indsats inden for Open Source-v\u00e6rkt\u00f8jer til Kubernetes ved at udgive <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/yandex-csi-driver\">alpha-versionen af CSI-driveren<\/a><\/noindex> (Container Storage Interface) til Yandex.Cloud.<\/p>\n<p>Men f\u00f8r vi g\u00e5r videre til detaljer om implementeringen, lad os besvare sp\u00f8rgsm\u00e5let: hvorfor er dette overhovedet n\u00f8dvendigt, n\u00e5r Yandex allerede har tjenesten <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>Introduktion<\/h2>\n<p><\/p>\n<h3>Hvorfor det?<\/h3>\n<p>\nInden for vores virksomhed har vi, siden vi begyndte at bruge Kubernetes i produktion (dvs. i flere \u00e5r), udviklet et eget v\u00e6rkt\u00f8j (deckhouse), som vi ogs\u00e5 planl\u00e6gger at g\u00f8re tilg\u00e6ngeligt som et Open Source-projekt. Ved hj\u00e6lp af dette v\u00e6rkt\u00f8j konfigurerer og indstiller vi ensartet alle vores klynger, og i \u00f8jeblikket har vi allerede over 100, som er p\u00e5 meget forskellige hardwarekonfigurationer og i alle tilg\u00e6ngelige cloud-tjenester.<\/p>\n<p>Klynger, der bruger deckhouse, har alle de n\u00f8dvendige komponenter til drift: load balancere, overv\u00e5gning med brugervenlige grafer, metrikker og alarmer, brugerautentificering gennem eksterne udbydere for adgang til alle dashboards osv. En s\u00e5dan \"opgraderet\" klynge giver ikke mening at s\u00e6tte i en managed-l\u00f8sning, da det ofte enten er umuligt, eller det vil kr\u00e6ve at de fleste komponenter skal deaktiveres.<\/p>\n<p><i><b>NB<\/b>: Dette er vores erfaring, og den er ret speciel. Vi h\u00e6vder p\u00e5 ingen m\u00e5de, at alle skal tage sig af ops\u00e6tningen af Kubernetes-klynger selv i stedet for at bruge f\u00e6rdige l\u00f8sninger. For \u00f8vrigt har vi ikke nogen konkret erfaring med Yandex' Kubernetes-service, og vi vil ikke give nogen vurdering af denne tjeneste i den nuv\u00e6rende artikel.<\/i><\/p>\n<h3>Hvad er dette, og for hvem?<\/h3>\n<p>\nS\u00e5 vi har allerede fortalt om den moderne tilgang til lagring i Kubernetes: <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/424211\/\">hvordan CSI fungerer<\/a><\/noindex> og <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/465417\/\">hvordan f\u00e6llesskabet kom<\/a><\/noindex> til denne tilgang.<\/p>\n<p>I \u00f8jeblikket har mange store cloud-udbydere udviklet drivere til at bruge deres \"cloud\"-diske som Persistent Volume i Kubernetes. Hvis en leverand\u00f8r ikke har en s\u00e5dan driver, men stadig tilbyder alle n\u00f8dvendige funktioner via API, er der intet, der forhindrer at implementere en driver selv. S\u00e5dan lykkedes det os med Yandex.Cloud.<\/p>\n<p>Vi tog udgangspunkt i <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/digitalocean\/csi-digitalocean\">CSI-driveren til DigitalOcean<\/a><\/noindex> og et par ideer fra <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kubernetes-sigs\/gcp-compute-persistent-disk-csi-driver\">driveren til GCP<\/a><\/noindex>, da interaktionen med API'erne fra disse skyer (Google og Yandex) har en r\u00e6kke ligheder. Specifikt, API'et fra <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.google.com\/compute\/docs\/api\/how-tos\/api-requests-responses#handling_api_responses\">GCP<\/a><\/noindex>, og fra <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.yandex.ru\/docs\/api-design-guide\/concepts\/about-async\">Yandex<\/a><\/noindex> returnerer et objekt <code>Operation<\/code> til overv\u00e5gning af status for langvarige operationer (f.eks. oprettelse af en ny disk). For at interagere med Yandex.Cloud API'et bruges <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/yandex-cloud\/go-sdk\">Yandex.Cloud Go SDK<\/a><\/noindex>.<\/p>\n<p>Resultatet af det udf\u00f8rte arbejde <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/yandex-csi-driver\">er offentliggjort p\u00e5 GitHub<\/a><\/noindex> og kan v\u00e6re nyttigt for dem, der af en eller anden grund bruger deres egen installation af Kubernetes p\u00e5 virtuelle maskiner i Yandex.Cloud (men ikke en f\u00e6rdig administreret klynge) og \u00f8nsker at bruge (bestille) diske via CSI.<\/p>\n<h2>Implementering<\/h2>\n<p><\/p>\n<h3>Grundl\u00e6ggende funktioner<\/h3>\n<p>\nP\u00e5 nuv\u00e6rende tidspunkt underst\u00f8tter driveren f\u00f8lgende funktioner:<\/p>\n<ul>\n<li> Bestilling af diske i alle zoner af klyngen i henhold til topologien af de eksisterende noder i klyngen;<\/li>\n<li> Sletning af tidligere bestilte diske;<\/li>\n<li> Offline resize for diske (Yandex.Cloud <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.yandex.ru\/docs\/compute\/operations\/disk-control\/update#change-disk-size\">underst\u00f8tter ikke<\/a><\/noindex> for\u00f8gelse af diske, som er monteret p\u00e5 den virtuelle maskine). Hvordan driveren blev modificeret for at udf\u00f8re resize s\u00e5 smertefrit som muligt, er beskrevet nedenfor.<\/li>\n<\/ul>\n<p>\nI fremtiden planl\u00e6gges det at implementere support til oprettelse og sletning af snapshots af diske.<\/p>\n<h3>Den prim\u00e6re udfordring og dens overvindelse<\/h3>\n<p>\nManglen p\u00e5 muligheden for at \u00f8ge diske i realtid i Yandex.Cloud API'et \u2014 en begr\u00e6nsning, der komplicerer resize-operationen for PV (Persistent Volume): for i s\u00e5 fald er det n\u00f8dvendigt, at pod'en af applikationen, der bruger disken, stopper, hvilket kan for\u00e5rsage nedetid for applikationen.<\/p>\n<p>If\u00f8lge <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/container-storage-interface\/spec\">specifikationen CSI<\/a><\/noindex>, hvis CSI-controlleren rapporterer, at den kun kan udf\u00f8re disk-resize 'offline' (<code>VolumeExpansion.OFFLINE<\/code>), s\u00e5 skal processen for at \u00f8ge disken forl\u00f8be s\u00e5ledes:<\/p>\n<blockquote><p>Hvis pluginnet kun har <code>VolumeExpansion.OFFLINE<\/code> udvidelseskapacitet og volumen i \u00f8jeblikket er publiceret eller tilg\u00e6ngeligt p\u00e5 en node, s\u00e5 <code>ControllerExpandVolume<\/code> SKAL kun kaldes efter enten:<\/p>\n<ul>\n<li> Pluginnet har controller <code>PUBLISH_UNPUBLISH_VOLUME<\/code> kapacitet og <code>ControllerUnpublishVolume<\/code> er blevet invokeret med succes.<\/li>\n<\/ul>\n<p>\nELLER<\/p>\n<ul>\n<li> Pluginnet HAR IKKE controller <code>PUBLISH_UNPUBLISH_VOLUME<\/code> kapacitet, pluginnet har node <code>STAGE_UNSTAGE_VOLUME<\/code> kapacitet, og <code>NodeUnstageVolume<\/code> er blevet gennemf\u00f8rt med succes.<\/li>\n<\/ul>\n<p>\nELLER<\/p>\n<ul>\n<li>Pluginnet HAR IKKE controller <code>PUBLISH_UNPUBLISH_VOLUME<\/code> kapacitet, ej node <code>STAGE_UNSTAGE_VOLUME<\/code> kapacitet, og <code>NodeUnpublishVolume<\/code> er blevet gennemf\u00f8rt med succes.<\/li>\n<\/ul>\n<\/blockquote>\n<p>\nDette betyder i realiteten, at det er n\u00f8dvendigt at afmontere disken fra den virtuelle maskine, f\u00f8r den kan for\u00f8ges.<\/p>\n<p>Desv\u00e6rre <b>en implementering<\/b> , opfylder CSI-specifikationerne ikke disse krav gennem sidek\u00e6der:<\/p>\n<ul>\n<li> I sidecar-containeren <code>csi-attacher<\/code>, som skal sikre tilstedev\u00e6relsen af det n\u00f8dvendige tidsrum mellem monteringer, er denne funktionalitet simpelthen ikke implementeret ved offline-resize. Diskussionen om dette er blevet iv\u00e6rksat. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kubernetes-csi\/external-attacher\/issues\/207\">her<\/a><\/noindex>.<\/li>\n<li> Hvad er en sidecar-container i denne sammenh\u00e6ng? Den specifikke CSI-plugin interagerer ikke med Kubernetes API, men reagerer kun p\u00e5 gRPC-opkald, som sidstn\u00e6vnte sender til sidecar-containere. Sidste <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes-csi.github.io\/docs\/sidecar-containers.html\">udvikles<\/a><\/noindex> Kubernetes-f\u00e6llesskabet.<\/li>\n<\/ul>\n<p>\nI vores tilf\u00e6lde (CSI-plugin) ser processen for udvidelse af disken s\u00e5ledes ud:<\/p>\n<ol>\n<li> Vi modtager et gRPC-opkald <code>ControllerExpandVolume<\/code>;<\/li>\n<li> Vi fors\u00f8ger at udvide disken i API'et, men f\u00e5r en fejl om, at operationen ikke kan udf\u00f8res, da disken er monteret;<\/li>\n<li> Vi gemmer diskens ID i et kort, der indeholder de diske, som vi skal udf\u00f8re udvidelsesoperationen for. Fremover kalder vi dette kort <code>volumeResizeRequired<\/code>;<\/li>\n<li> Vi fjerner manuelt den pod, der bruger disken. Kubernetes genstarter den i mellemtiden. For at sikre, at disken ikke n\u00e5r at blive monteret (<code>ControllerPublishVolume<\/code>) inden udvidelsesoperationen er afsluttet, kontrollerer vi, om denne disk stadig er i <code>volumeResizeRequired<\/code> og returnerer en fejl;<\/li>\n<li> CSI-driveren fors\u00f8ger at udf\u00f8re resize-operationen igen. Hvis operationen lykkes, fjerner vi disken fra <code>volumeResizeRequired<\/code>;<\/li>\n<li> Da diskens ID ikke er til stede i <code>volumeResizeRequired<\/code>, <code>ControllerPublishVolume<\/code> lykkes det, disken monteres, og pod'en startes.<\/li>\n<\/ol>\n<p>\nDet ser ret simpelt ud, men som altid er der faldgruber. Udvidelse af diske h\u00e5ndteres af <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes-csi.github.io\/docs\/external-resizer.html\">external-resizer<\/a><\/noindex>, som i tilf\u00e6lde af en fejl under udf\u00f8relsen af operationen <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\">bruger en k\u00f8<\/a><\/noindex> med eksponentiel for\u00f8gelse af timeout'ens tid op til 1000 sekunder:<\/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.  Dette er kun for retry hastighed og det er kun den samlede faktor (ikke per element)\n  &amp;BucketRateLimiter{Limiter: rate.NewLimiter(rate.Limit(10), 100)},\n  )\n}<\/code><\/pre>\n<p>\nDette kan periodisk betyde, at udvidelsen af disken str\u00e6kker sig over 15+ minutter og dermed for\u00e5rsager, at den tilsvarende pod er utilg\u00e6ngelig.<\/p>\n<p>Den eneste mulighed, der har givet os mulighed for at reducere potentiel nedetid p\u00e5 en forholdsvis nem og smertefri m\u00e5de, er at anvende vores egen version af external-resizer med en maksimal timeout-gr\u00e6nse <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/external-resizer\/blob\/faster-workqueue\/pkg\/controller\/controller.go#L81\">p\u00e5 5 sekunder<\/a><\/noindex>:<\/p>\n<pre><code class=\"go\">workqueue.NewItemExponentialFailureRateLimiter(5*time.Millisecond, 5*time.Second)<\/code><\/pre>\n<p>\nVi mente ikke, det var n\u00f8dvendigt at iv\u00e6rks\u00e6tte en hastediskussion og patchere external-resizer, fordi offline resize af diske er et levn, som snart vil forsvinde hos alle cloud-udbydere.<\/p>\n<h2>Hvordan kommer man i gang?<\/h2>\n<p>\nDriveren underst\u00f8ttes i Kubernetes version 1.15 og nyere. For at driveren kan fungere, skal f\u00f8lgende betingelser v\u00e6re opfyldt:<\/p>\n<ul>\n<li> Flaget <code>--allow-privileged<\/code> indstillet til <code>true<\/code> for API-serveren og kubelet;<\/li>\n<li> Aktiveret <code>--feature-gates=VolumeSnapshotDataSource=true,KubeletPluginsWatcher=true,CSINodeInfo=true,CSIDriverRegistry=true<\/code> for API-serveren og kubelet;<\/li>\n<li> Monteringsfordeling (<noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/concepts\/storage\/volumes\/#mount-propagation\">mount propagation<\/a><\/noindex>) skal v\u00e6re aktiveret i klyngen. N\u00e5r du bruger Docker, skal d\u00e6monen konfigureres til at tillade delte monteringsobjekter (shared mounts).<\/li>\n<\/ul>\n<p>\nAlle n\u00f8dvendige trin til selve installationen <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/yandex-csi-driver#installing-driver\">er beskrevet i README<\/a><\/noindex>. Installationen indeb\u00e6rer oprettelse af objekter i Kubernetes fra manifester.<\/p>\n<p>For at k\u00f8re driveren skal du have f\u00f8lgende:<\/p>\n<ul>\n<li> Angive katalog-id i manifestet (<code>folder-id<\/code>) fra Yandex.Cloud (<noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.yandex.ru\/docs\/resource-manager\/operations\/folder\/get-id\">se dokumentationen<\/a><\/noindex>);<\/li>\n<li> For at interagere med Yandex.Cloud API i CSI-driveren bruges en servicekonto. I manifestet Secret skal de <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.yandex.com\/docs\/iam\/concepts\/authorization\/key\">autoriserede n\u00f8gler<\/a><\/noindex> fra servicekontoen overf\u00f8res. I dokumentationen <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.yandex.ru\/docs\/iam\/quickstart-sa\">beskrevet<\/a><\/noindex>, hvordan man opretter en servicekonto og f\u00e5r n\u00f8gler.<\/li>\n<\/ul>\n<p>\nGenerelt \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/yandex-csi-driver\">pr\u00f8v<\/a><\/noindex>, og vi ser frem til feedback og <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/yandex-csi-driver\/issues\">nye issues<\/a><\/noindex>, hvis du st\u00f8der p\u00e5 nogle problemer!<\/p>\n<h2>Yderligere support<\/h2>\n<p>\nSom konklusion vil vi gerne n\u00e6vne, at denne CSI-driver ikke blev udviklet ud af et stort \u00f8nske om at have det sjovt med at skrive applikationer i Go, men p\u00e5 grund af et akut behov internt i virksomheden. At vedligeholde vores egen implementering virker ikke hensigtsm\u00e6ssigt, s\u00e5 hvis Yandex viser interesse og beslutter at forts\u00e6tte med at st\u00f8tte driveren, vil vi med gl\u00e6de overdrage repositoryet til deres disposition.<\/p>\n<p>Derudover har Yandex formentlig deres egen implementering af CSI-driveren i det administrerede Kubernetes-klynge, som kan frigives som Open Source. S\u00e5dan et udviklingsscenarie ser vi ogs\u00e5 som gavnligt \u2014 f\u00e6llesskabet vil kunne bruge en verificeret driver fra en serviceudbyder, i stedet for fra et tredjepartsfirma.<\/p>\n<h2>P.S.<\/h2>\n<p>\nL\u00e6s ogs\u00e5 p\u00e5 vores blog:<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/465417\/\">Volume plugins til lagringsl\u00f8sninger i Kubernetes: fra Flexvolume til CSI<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/424211\/\">Understanding the Container Storage Interface (in Kubernetes and beyond)<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/455543\/\">Er det enkelt og bekvemt at forberede et Kubernetes-kluster? Vi annoncerer addon-operator.<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/455543\/\">Udvikler Kubernetes (oversigt og videopr\u00e6sentation)<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<p>Kilde: <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\/da\/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=\"da_DK\" \/>\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\/da\/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\udd47Vores erfaring med at udvikle CSI-driveren i Kubernetes for Yandex.Cloud | ProHoster","description":"Vi er glade for at annoncere, at virksomheden.","canonical_url":"https:\/\/prohoster.info\/da\/blog\/nash-opyt-razrabotki-csi-drajvera-v-kubernetes-dlya-yandeks-oblaka","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/40721","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=40721"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/40721\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media\/40722"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=40721"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=40721"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=40721"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}