Наш ΠΎΠΏΡ‹Ρ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ CSI-Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π° Π² Kubernetes для ЯндСкс.Облака

Наш ΠΎΠΏΡ‹Ρ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ CSI-Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π° Π² Kubernetes для ЯндСкс.Облака

Π Π°Π΄Ρ‹ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ компания Β«Π€Π»Π°Π½Ρ‚Β» пополняСт свой Π²ΠΊΠ»Π°Π΄ Π² Open Source-инструмСнты для Kubernetes, выпустив Π°Π»ΡŒΡ„Π°-Π²Π΅Ρ€ΡΠΈΡŽ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π° CSI (Container Storage Interface) для ЯндСкс.Облака.

Но ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ дСталям Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΎΡ‚Π²Π΅Ρ‚ΠΈΠΌ Π½Π° вопрос, Π·Π°Ρ‡Π΅ΠΌ это Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½ΡƒΠΆΠ½ΠΎ, ΠΊΠΎΠ³Π΄Π° Ρƒ ЯндСкса ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ услуга Managed Service for Kubernetes.

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

Π—Π°Ρ‡Π΅ΠΌ это?

Π’Π½ΡƒΡ‚Ρ€ΠΈ нашСй ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ, Π΅Ρ‰Ρ‘ с самого Π½Π°Ρ‡Π°Π»Π° эксплуатации Kubernetes Π² production (Ρ‚.Π΅. ΡƒΠΆΠ΅ нСсколько Π»Π΅Ρ‚), развиваСтся собствСнный инструмСнт (deckhouse), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, кстати, ΠΌΡ‹ Ρ‚ΠΎΠΆΠ΅ ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΠ΅ΠΌ Π² скором Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ доступным ΠΊΠ°ΠΊ Open Source-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. Π‘ Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΡ‹ Π΅Π΄ΠΈΠ½ΠΎΠΎΠ±Ρ€Π°Π·Π½ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΡƒΠ΅ΠΌ ΠΈ настраиваСм всС свои кластСры, Π° Π² настоящий ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΈΡ… ΡƒΠΆΠ΅ Π±ΠΎΠ»Π΅Π΅ 100, ΠΏΡ€ΠΈΡ‡Ρ‘ΠΌ Π½Π° самых Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… конфигурациях ΠΆΠ΅Π»Π΅Π·Π° ΠΈ Π²ΠΎ всСх доступных ΠΎΠ±Π»Π°Ρ‡Π½Ρ‹Ρ… сСрвисах.

ΠšΠ»Π°ΡΡ‚Π΅Ρ€Ρ‹, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ deckhouse, ΠΈΠΌΠ΅ΡŽΡ‚ Π² сСбС всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹: балансировщики, ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ с ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌΠΈ Π³Ρ€Π°Ρ„ΠΈΠΊΠ°ΠΌΠΈ, ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠ°ΠΌΠΈ ΠΈ Π°Π»Π΅Ρ€Ρ‚Π°ΠΌΠΈ, Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Ρ‡Π΅Ρ€Π΅Π· Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€ΠΎΠ² для доступа ΠΊΠΎ всСм dashboard’ам ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅. Π’Π°ΠΊΠΎΠΉ Β«ΠΏΡ€ΠΎΠΊΠ°Ρ‡Π°Π½Π½Ρ‹ΠΉΒ» кластСр Π½Π΅Ρ‚ смысла ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π² managed-Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ это Π»ΠΈΠ±ΠΎ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π»ΠΈΠ±ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Ρ‚ ΠΊ нСобходимости ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρƒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ².

NB: Π­Ρ‚ΠΎ наш ΠΎΠΏΡ‹Ρ‚, ΠΈ ΠΎΠ½ довольно спСцифичСн. ΠœΡ‹ Π½ΠΈ Π² ΠΊΠΎΠ΅ΠΌ случаС Π½Π΅ ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ всСм стоит ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒΡΡ Ρ€Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π½ΠΈΠ΅ΠΌ кластСров Kubernetes вмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΌΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡΠΌΠΈ. К слову, Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΎΠΏΡ‹Ρ‚Π° эксплуатации Kubernetes ΠΎΡ‚ ЯндСкса Ρƒ нас Π½Π΅Ρ‚ ΠΈ Π΄Π°Π²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΡƒΡŽ-Π»ΠΈΠ±ΠΎ ΠΎΡ†Π΅Π½ΠΊΡƒ этому сСрвису Π² настоящСй ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ.

Π§Ρ‚ΠΎ это ΠΈ для ΠΊΠΎΠ³ΠΎ?

Π˜Ρ‚Π°ΠΊ, ΠΌΡ‹ ΡƒΠΆΠ΅ рассказывали ΠΎ соврСмСннСм ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅ ΠΊ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°ΠΌ Π² Kubernetes: ΠΊΠ°ΠΊ устроСн CSI ΠΈ ΠΊΠ°ΠΊ сообщСство ΠΏΡ€ΠΈΡˆΠ»ΠΎ ΠΊ Ρ‚Π°ΠΊΠΎΠΌΡƒ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρƒ.

Π’ настоящСС врСмя ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΊΡ€ΡƒΠΏΠ½Ρ‹Π΅ поставщики ΠΎΠ±Π»Π°Ρ‡Π½Ρ‹Ρ… услуг Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Ρ‹ для использования своих Β«ΠΎΠ±Π»Π°Ρ‡Π½Ρ‹Ρ…Β» дисков Π² качСствС Persistent Volume Π² Kubernetes. Если ΠΆΠ΅ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π° Ρƒ поставщика Π½Π΅Ρ‚, Π½ΠΎ ΠΏΡ€ΠΈ этом всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· API, Ρ‚ΠΎ Π½ΠΈΡ‡Ρ‚ΠΎ Π½Π΅ ΠΌΠ΅ΡˆΠ°Π΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ собствСнными силами. Π’Π°ΠΊ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ Ρƒ нас с ЯндСкс.Облаком.

Π—Π° основу для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΌΡ‹ взяли CSI-Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ для ΠΎΠ±Π»Π°ΠΊΠ° DigitalOcean ΠΈ ΠΏΠ°Ρ€Ρƒ ΠΈΠ΄Π΅ΠΉ ΠΈΠ· Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π° для GCP, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ взаимодСйствиС с API этих ΠΎΠ±Π»Π°ΠΊΠΎΠ² (Google ΠΈ ЯндСкс) ΠΈΠΌΠ΅Π΅Ρ‚ ряд сходств. Π’ частности, API ΠΈ Ρƒ GCP, ΠΈ Ρƒ Yandex Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Operation для отслСТивания статуса Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, создания Π½ΠΎΠ²ΠΎΠ³ΠΎ диска). Для взаимодСйствия с API ЯндСкс.Облака ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Yandex.Cloud Go SDK.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΡ€ΠΎΠ΄Π΅Π»Π°Π½Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½ Π½Π° GitHub ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ³ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Ρ‚Π΅ΠΌ, ΠΊΡ‚ΠΎ ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ ΠΈΠ½ΡΡ‚Π°Π»Π»ΡΡ†ΠΈΡŽ Kubernetes Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠ°ΡˆΠΈΠ½Π°Ρ… ЯндСкс.Облака (Π½ΠΎ Π½Π΅ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ managed-кластСр) ΠΈ Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ (Π·Π°ΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ) диски Ρ‡Π΅Ρ€Π΅Π· CSI.

РСализация

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ возмоТности

На Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

  • Π—Π°ΠΊΠ°Π· дисков Π²ΠΎ всСх Π·ΠΎΠ½Π°Ρ… кластСра согласно Ρ‚ΠΎΠΏΠΎΠ»ΠΎΠ³ΠΈΠΈ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ…ΡΡ Π² кластСрС ΡƒΠ·Π»ΠΎΠ²;
  • Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ Π·Π°ΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… Ρ€Π°Π½Π΅Π΅ дисков;
  • Offline resize для дисков (ЯндСкс.Облако Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ дисков, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠΎΠ½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ ΠΊ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ машинС). О Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π΄ΠΎΡ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€, Ρ‡Ρ‚ΠΎΠ±Ρ‹ максимально Π±Π΅Π·Π±ΠΎΠ»Π΅Π·Π½Π΅Π½Π½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ resize, см. Π½ΠΈΠΆΠ΅.

Π’ Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ планируСтся Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ создания ΠΈ удалСния ΡΠ½Π°ΠΏΡˆΠΎΡ‚ΠΎΠ² дисков.

Главная ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈ Π΅Ρ‘ ΠΏΡ€Π΅ΠΎΠ΄ΠΎΠ»Π΅Π½ΠΈΠ΅

ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΈΠ΅ Π² API ЯндСкс.Облака возмоТности ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ диски Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ β€” ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ услоТняСт ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ resize’а для PV (Persistent Volume): вСдь Π² Ρ‚Π°ΠΊΠΎΠΌ случаС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ pod прилоТСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ диск, Π±Ρ‹Π» остановлСн, Π° это ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ простой прилоТСния.

Богласно спСцификации CSI, Ссли CSI-ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ сообщаСт ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΡƒΠΌΠ΅Π΅Ρ‚ Π΄Π΅Π»Π°Ρ‚ΡŒ resize дисков Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Β«Π² offlineΒ» (VolumeExpansion.OFFLINE), Ρ‚ΠΎ процСсс увСличСния диска Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊ:

If the plugin has only VolumeExpansion.OFFLINE expansion capability and volume is currently published or available on a node then ControllerExpandVolume MUST be called ONLY after either:

  • The plugin has controller PUBLISH_UNPUBLISH_VOLUME capability and ControllerUnpublishVolume has been invoked successfully.

OR ELSE

  • The plugin does NOT have controller PUBLISH_UNPUBLISH_VOLUME capability, the plugin has node STAGE_UNSTAGE_VOLUME capability, and NodeUnstageVolume has been completed successfully.

OR ELSE

  • The plugin does NOT have controller PUBLISH_UNPUBLISH_VOLUME capability, nor node STAGE_UNSTAGE_VOLUME capability, and NodeUnpublishVolume has completed successfully.

По сути это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ ΠΎΡ‚ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ диск ΠΎΡ‚ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ Π΅Π³ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ.

Однако, ΠΊ соТалСнию, рСализация спСцификации CSI Ρ‡Π΅Ρ€Π΅Π· sidecar’ы Π½Π΅ соотвСтствуСт этим трСбованиям:

  • Π’ sidecar-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ csi-attacher, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡ‚Π²Π΅Ρ‡Π°Ρ‚ΡŒ Π·Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΊΠ° ΠΌΠ΅ΠΆΠ΄Ρƒ монтированиями, ΠΏΡ€ΠΈ offline-рСсайзС попросту Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ этот Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π». Π”ΠΈΡΠΊΡƒΡΡΠΈΡŽ ΠΎΠ± этом ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Π»ΠΈ здСсь.
  • Π§Ρ‚ΠΎ Π²ΠΎΠΎΠ±Ρ‰Π΅ Ρ‚Π°ΠΊΠΎΠ΅ sidecar-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Π² Π΄Π°Π½Π½ΠΎΠΌ контСкстС? Π‘Π°ΠΌ CSI-ΠΏΠ»Π°Π³ΠΈΠ½ Π½Π΅ занимаСтся взаимодСйствиСм с Kubernetes API, Π° лишь Ρ€Π΅Π°Π³ΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π° gRPC-Π²Ρ‹Π·ΠΎΠ²Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΡΡ‹Π»Π°ΡŽΡ‚ Π΅ΠΌΡƒ sidecar-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹. ПослСдниС Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ сообщСством Kubernetes.

Π’ нашСм случаС (CSI-ΠΏΠ»Π°Π³ΠΈΠ½) опСрация увСличСния диска выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

  1. ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ gRPC-Π²Ρ‹Π·ΠΎΠ² ControllerExpandVolume;
  2. ΠŸΡ‹Ρ‚Π°Π΅ΠΌΡΡ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ диск Π² API, Π½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΎ нСвозмоТности выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ диск ΠΏΡ€ΠΈΠΌΠΎΠ½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½;
  3. БохраняСм ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ диска Π² map, содСрТащий диски, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ увСличСния. Π”Π°Π»Π΅Π΅ для краткости Π±ΡƒΠ΄Π΅ΠΌ Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒ этот map ΠΊΠ°ΠΊ volumeResizeRequired;
  4. Π’Ρ€ΡƒΡ‡Π½ΡƒΡŽ удаляСм pod, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ диск. Kubernetes ΠΏΡ€ΠΈ этом пСрСзапустит Π΅Π³ΠΎ. Π§Ρ‚ΠΎΠ±Ρ‹ диск Π½Π΅ успСл ΠΏΡ€ΠΈΠΌΠΎΠ½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ (ControllerPublishVolume) Π΄ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ увСличСния ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ монтирования, провСряСм, Ρ‡Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹ΠΉ диск всё Π΅Ρ‰Ρ‘ находится Π² volumeResizeRequired ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ ΠΎΡˆΠΈΠ±ΠΊΡƒ;
  5. CSI-Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ пытаСтся ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ resize’а. Если опСрация ΠΏΡ€ΠΎΡˆΠ»Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ, Ρ‚ΠΎ удаляСм диск ΠΈΠ· volumeResizeRequired;
  6. Π’.ΠΊ. ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ диска отсутствуСт Π² volumeResizeRequired, ControllerPublishVolume ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ, диск монтируСтся, pod запускаСтся.

Всё выглядит достаточно просто, Π½ΠΎ ΠΊΠ°ΠΊ всСгда Π΅ΡΡ‚ΡŒ ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½Ρ‹Π΅ ΠΊΠ°ΠΌΠ½ΠΈ. Π£Π²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ дисков занимаСтся external-resizer, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² случаС ошибки ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ с ΡΠΊΡΠΏΠΎΠ½Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚Π° Π΄ΠΎ 1000 сСкунд:

func DefaultControllerRateLimiter() RateLimiter {
  return NewMaxOfRateLimiter(
  NewItemExponentialFailureRateLimiter(5*time.Millisecond, 1000*time.Second),
  // 10 qps, 100 bucket size.  This is only for retry speed and its only the overall factor (not per item)
  &BucketRateLimiter{Limiter: rate.NewLimiter(rate.Limit(10), 100)},
  )
}

Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ пСриодичСски ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ опСрация увСличСния диска растягиваСтся Π½Π° 15+ ΠΌΠΈΠ½ΡƒΡ‚ ΠΈ, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, нСдоступности ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ pod’а.

ЕдинствСнным Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ достаточно Π»Π΅Π³ΠΊΠΎ ΠΈ Π±Π΅Π·Π±ΠΎΠ»Π΅Π·Π½Π΅Π½Π½ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ» Π½Π°ΠΌ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ врСмя простоя, стало использованиС своСй вСрсии external-resizer с ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚Π° Π² 5 сСкунд:

workqueue.NewItemExponentialFailureRateLimiter(5*time.Millisecond, 5*time.Second)

ΠœΡ‹ Π½Π΅ посчитали Π½ΡƒΠΆΠ½Ρ‹ΠΌ экстрСнно ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΈΡΠΊΡƒΡΡΠΈΡŽ ΠΈ ΠΏΠ°Ρ‚Ρ‡ΠΈΡ‚ΡŒ external-resizer, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ offline resize дисков β€” Π°Ρ‚Π°Π²ΠΈΠ·ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ вскорС ΠΏΡ€ΠΎΠΏΠ°Π΄Ρ‘Ρ‚ Ρƒ всСх ΠΎΠ±Π»Π°Ρ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€ΠΎΠ².

Как Π½Π°Ρ‡Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ?

Π”Ρ€Π°ΠΉΠ²Π΅Ρ€ поддСрТиваСтся Π² Kubernetes вСрсии 1.15 ΠΈ Π²Ρ‹ΡˆΠ΅. Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π° Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ трСбования:

  • Π€Π»Π°Π³ --allow-privileged установлСн Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true для API-сСрвСра ΠΈ kubelet;
  • Π’ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ --feature-gates=VolumeSnapshotDataSource=true,KubeletPluginsWatcher=true,CSINodeInfo=true,CSIDriverRegistry=true для API-сСрвСра ΠΈ kubelet;
  • РаспространСниС монтирования (mount propagation) Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ Π² кластСрС. ΠŸΡ€ΠΈ использовании Docker’а Π΄Π΅ΠΌΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ сконфигурирован Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Π»ΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Ρ‹ совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ монтирования (shared mounts).

ВсС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ шаги ΠΏΠΎ самой установкС описаны Π² README. Π˜Π½ΡΡ‚Π°Π»Π»ΡΡ†ΠΈΡ прСдставляСт собой созданиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² Kubernetes ΠΈΠ· манифСстов.

Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π° Π²Π°ΠΌ понадобится ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

  • Π£ΠΊΠ°Π·Π°Ρ‚ΡŒ Π² манифСстС ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° (folder-id) ЯндСкс.Облака (см. Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ);
  • Для взаимодСйствия с API ЯндСкс.Облака Π² CSI-Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ сСрвисный Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚. Π’ манифСстС Secret Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΊΠ»ΡŽΡ‡ΠΈ ΠΎΡ‚ сСрвисного Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Π°. Π’ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ описано, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ сСрвисный Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΊΠ»ΡŽΡ‡ΠΈ.

Π’ ΠΎΠ±Ρ‰Π΅ΠΌ β€” ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅, Π° ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π°Π΄Ρ‹ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ связи ΠΈ Π½ΠΎΠ²Ρ‹ΠΌ issues, Ссли ΡΡ‚ΠΎΠ»ΠΊΠ½Π΅Ρ‚Π΅ΡΡŒ с ΠΊΠ°ΠΊΠΈΠΌΠΈ-Ρ‚ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ!

Π”Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠ°Ρ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ°

Π’ качСствС ΠΈΡ‚ΠΎΠ³Π° Π½Π°ΠΌ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π±Ρ‹ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ этот CSI-Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ ΠΌΡ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Π»ΠΈ Π½Π΅ ΠΎΡ‚ большого ТСлания Ρ€Π°Π·Π²Π»Π΅Ρ‡ΡŒΡΡ с написаниСм ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° Go, Π° Π²Π²ΠΈΠ΄Ρƒ острой нСобходимости Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ. ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ свою ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π½Π°ΠΌ Π½Π΅ каТСтся цСлСсообразным, поэтому, Ссли ЯндСкс проявит интСрСс ΠΈ Ρ€Π΅ΡˆΠΈΡ‚ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π°, Ρ‚ΠΎ ΠΌΡ‹ с ΡƒΠ΄ΠΎΠ²ΠΎΠ»ΡŒΡΡ‚Π²ΠΈΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΄ΠΈΠΌ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ Π² ΠΈΡ… распоряТСниС.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π½Π°Π²Π΅Ρ€Π½ΠΎΠ΅, Ρƒ ЯндСкса Π² managed-кластСрС Kubernetes Π΅ΡΡ‚ΡŒ собствСнная рСализация CSI-Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π°, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π² Open Source. Π’Π°ΠΊΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ развития для нас Ρ‚Π°ΠΊΠΆΠ΅ видится благоприятным β€” сообщСство смоТСт ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½Π½Ρ‹ΠΌ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠΌ ΠΎΡ‚ поставщика услуг, Π° Π½Π΅ ΠΎΡ‚ стороннСй ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ.

P.S.

Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅ Π² нашСм Π±Π»ΠΎΠ³Π΅:

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ