Yandex.Cloud සඳහා Kubernetes හි CSI ධාවකයක් සංවර්ධනය කිරීමේ අපගේ අත්දැකීම්

Yandex.Cloud සඳහා Kubernetes හි CSI ධාවකයක් සංවර්ධනය කිරීමේ අපගේ අත්දැකීම්

Flant නිකුත් කරමින් Kubernetes සඳහා විවෘත මූලාශ්‍ර මෙවලම් සඳහා එහි දායකත්වය පුළුල් කරන බව අපි සතුටින් ප්‍රකාශ කරමු. CSI ධාවකයේ ඇල්ෆා අනුවාදය Yandex.Cloud සඳහා (බහාලුම් ගබඩා අතුරුමුහුණත).

නමුත් ක්‍රියාත්මක කිරීමේ විස්තර වෙත යාමට පෙර, Yandex දැනටමත් සේවාවක් ඇති විට මෙය කිසිසේත් අවශ්‍ය වන්නේ මන්දැයි යන ප්‍රශ්නයට පිළිතුරු දෙමු. Kubernetes සඳහා කළමනාකරණ සේවාව.

හැඳින්වීම

ඇයි මේ?

අපගේ සමාගම තුළ, නිෂ්පාදනයේදී Kubernetes භාවිතා කිරීමේ ආරම්භයේ සිටම (එනම් දැනට වසර කිහිපයක් තිස්සේ), අපි අපගේම මෙවලමක් (ඩෙක්හවුස්) සංවර්ධනය කරමින් සිටිමු, එය විවෘත මූලාශ්‍ර ව්‍යාපෘතියක් ලෙස ඉක්මනින් ලබා දීමට ද අපි සැලසුම් කරමු. . එහි ආධාරයෙන්, අපි අපගේ සියලුම පොකුරු ඒකාකාරව වින්‍යාස කර වින්‍යාස කරන්නෙමු, දැනට ඒවායින් 100 කට වඩා තිබේ, විවිධ දෘඩාංග වින්‍යාස කිරීම් සහ පවතින සියලුම ක්ලවුඩ් සේවාවන්හි.

ඩෙක්හවුස් භාවිතා කරන පොකුරු වල ක්‍රියාත්මක වීමට අවශ්‍ය සියලුම සංරචක ඇත: සමතුලිත කරන්නන්, පහසු ප්‍රස්ථාර සමඟ අධීක්ෂණය, ප්‍රමිතික සහ ඇඟවීම්, සියලුම උපකරණ පුවරු වෙත ප්‍රවේශය සඳහා බාහිර සැපයුම්කරුවන් හරහා පරිශීලක සත්‍යාපනය, යනාදිය. කළමනාකරණය කළ විසඳුමක එවැනි “පොම්ප කරන ලද” පොකුරක් ස්ථාපනය කිරීමේ තේරුමක් නැත, මන්ද මෙය බොහෝ විට කළ නොහැකි හෝ සංරචක වලින් අඩක් අක්‍රිය කිරීමේ අවශ්‍යතාවයට හේතු වනු ඇත.

NB: මෙය අපගේ අත්දැකීම වන අතර එය ඉතා නිශ්චිතය. සූදානම් කළ විසඳුම් භාවිතා කිරීම වෙනුවට සෑම කෙනෙකුම තනිවම Kubernetes පොකුරු යෙදවිය යුතු යැයි අපි කිසිසේත් යෝජනා නොකරමු. මාර්ගය වන විට, Yandex වෙතින් Kubernetes ක්රියාත්මක කිරීමේදී අපට සැබෑ අත්දැකීමක් නොමැති අතර මෙම ලිපියෙන් අපි මෙම සේවාව පිළිබඳ කිසිදු තක්සේරුවක් ලබා නොදෙමු.

එය කුමක්ද සහ කවුරුන් සඳහාද?

එබැවින්, අපි දැනටමත් Kubernetes හි ගබඩා කිරීම සඳහා නවීන ප්රවේශය ගැන කතා කර ඇත: CSI වැඩ කරන්නේ කෙසේද? и ප්රජාව පැමිණි ආකාරය මෙම ප්රවේශයට.

වර්තමානයේ, බොහෝ විශාල වලාකුළු සේවා සපයන්නන් Kubernetes හි ස්ථිර පරිමාවක් ලෙස ඔවුන්ගේ වලාකුළු තැටි භාවිතා කිරීම සඳහා ධාවක නිපදවා ඇත. සැපයුම්කරුට එවැනි ධාවකයක් නොමැති නම්, නමුත් අවශ්‍ය සියලුම කාර්යයන් API හරහා සපයනු ලැබේ නම්, රියදුරු ඔබම ක්‍රියාත්මක කිරීමෙන් කිසිවක් ඔබව වළක්වන්නේ නැත. Yandex.Cloud සමඟ සිදු වූයේ මෙයයි.

අපි සංවර්ධනයේ පදනම ලෙස ගත්තා DigitalOcean cloud සඳහා CSI ධාවකය සහ අදහස් කිහිපයක් GCP සඳහා රියදුරන්, මෙම වලාකුළු වල API සමඟ අන්තර්ක්‍රියා (Google සහ Yandex) සමානකම් ගණනාවක් ඇති බැවින්. විශේෂයෙන්ම, API සහ ජී.සී.පී., සහ දී Yandex වස්තුවක් ආපසු Operation දිගුකාලීන මෙහෙයුම් වල තත්ත්වය නිරීක්ෂණය කිරීමට (උදාහරණයක් ලෙස, නව තැටියක් නිර්මාණය කිරීම). Yandex.Cloud API සමඟ අන්තර් ක්‍රියා කිරීමට, භාවිතා කරන්න Yandex.Cloud Go SDK.

කරන ලද කාර්යයේ ප්රතිඵලය GitHub හි опубликован සහ යම් හේතුවක් නිසා, Yandex.Cloud අතථ්‍ය යන්ත්‍රවල (නමුත් සූදානම් කළ කළමනාකරණය කළ පොකුරක් නොවේ) ඔවුන්ගේම Kubernetes ස්ථාපනය භාවිතා කරන අයට සහ CSI හරහා (ඇණවුම්) තැටි භාවිතා කිරීමට කැමති අයට ප්‍රයෝජනවත් විය හැක.

Реализация

ප්රධාන ලක්ෂණ

දැනට ධාවකය පහත සඳහන් කාර්යයන් සඳහා සහය දක්වයි:

  • පොකුරේ ඇති නෝඩ් වල ස්ථලකය අනුව පොකුරේ සියලුම කලාපවල තැටි ඇණවුම් කිරීම;
  • කලින් ඇණවුම් කළ තැටි ඉවත් කිරීම;
  • තැටි සඳහා නොබැඳි ප්‍රමාණය වෙනස් කිරීම (Yandex.Cloud සහාය නොදක්වන්න අථත්ය යන්ත්රයට සවි කර ඇති තැටි වැඩි කිරීම). ප්‍රතිප්‍රමාණය වෙනස් කිරීම හැකි තරම් වේදනා රහිත කිරීමට රියදුරු වෙනස් කළ යුතු ආකාරය පිළිබඳ තොරතුරු සඳහා, පහත බලන්න.

අනාගතයේදී, තැටි ස්නැප්ෂොට් සෑදීම සහ මකා දැමීම සඳහා සහය ක්‍රියාත්මක කිරීමට අපි සැලසුම් කරමු.

ප්රධාන දුෂ්කරතාවය සහ එය ජය ගන්නේ කෙසේද

Yandex.Cloud API හි තත්‍ය කාලීනව තැටි වැඩි කිරීමේ හැකියාව නොමැතිකම PV (Persistent Volume) සඳහා ප්‍රමාණය වෙනස් කිරීමේ ක්‍රියාවලිය සංකීර්ණ කරන සීමාවකි: මෙම අවස්ථාවේදී, තැටිය භාවිතා කරන යෙදුම් පොඩ් එක නතර කිරීම අවශ්‍ය වේ, සහ මෙය අක්‍රීය යෙදුම් වලට හේතු විය හැක.

අනුව CSI පිරිවිතර, CSI පාලකය එය "නොබැඳි" පමණක් තැටි ප්රමාණය වෙනස් කළ හැකි බව වාර්තා කරයි නම් (VolumeExpansion.OFFLINE), එවිට තැටිය වැඩි කිරීමේ ක්රියාවලිය පහත පරිදි විය යුතුය:

ප්ලගිනය පමණක් තිබේ නම් VolumeExpansion.OFFLINE ප්‍රසාරණ හැකියාව සහ පරිමාව දැනට ප්‍රකාශනය කර හෝ node එකක් මත පවතී ControllerExpandVolume ඇමතීමට අවශ්‍ය වන්නේ ඉන් පසුව පමණි:

  • ප්ලගිනයට පාලකයක් ඇත PUBLISH_UNPUBLISH_VOLUME හැකියාව සහ ControllerUnpublishVolume සාර්ථකව කැඳවා ඇත.

එසේත් නැතිනම්

  • ප්ලගිනයට පාලකයක් නොමැත PUBLISH_UNPUBLISH_VOLUME හැකියාව, ප්ලගිනයට node එකක් ඇත STAGE_UNSTAGE_VOLUME හැකියාව, සහ NodeUnstageVolume සාර්ථකව නිම කර ඇත.

එසේත් නැතිනම්

  • ප්ලගිනයට පාලකයක් නොමැත PUBLISH_UNPUBLISH_VOLUME හැකියාව, හෝ node STAGE_UNSTAGE_VOLUME හැකියාව, සහ NodeUnpublishVolume සාර්ථකව නිම කර ඇත.

මෙය අත්‍යවශ්‍යයෙන්ම ඔබට එය පුළුල් කිරීමට පෙර අථත්‍ය යන්ත්‍රයෙන් තැටිය ඉවත් කිරීමට අවශ්‍ය වේ.

කෙසේ වෙතත්, අවාසනාවන්ත ලෙස ක්‍රියාත්මක කිරීම පැති කාර් හරහා CSI පිරිවිතර මෙම අවශ්‍යතා සපුරාලන්නේ නැත:

  • සයිඩ්කාර් කන්ටේනරයක csi-attacher, සවි කිරීම් අතර අවශ්‍ය පරතරය තිබීම සඳහා වගකිව යුතු, මෙම ක්‍රියාකාරිත්වය නොබැඳි ප්‍රමාණය වෙනස් කිරීමේදී සරලව ක්‍රියාත්මක නොවේ. මේ පිළිබඳ සාකච්ඡාවක් ආරම්භ විය මෙහි.
  • මෙම සන්දර්භය තුළ සයිඩ්කාර් බහාලුමක් යනු කුමක්ද? CSI ප්ලගිනයම Kubernetes API සමඟ අන්තර් ක්‍රියා නොකරයි, නමුත් සයිඩ්කාර් බහාලුම් මගින් එවන gRPC ඇමතුම් වලට පමණක් ප්‍රතිචාර දක්වයි. නවතම සංවර්ධනය වෙමින් පවතී Kubernetes ප්රජාව විසින්.

අපගේ නඩුවේදී (CSI ප්ලගිනය), තැටිය වැඩි කිරීමේ මෙහෙයුම මේ ආකාරයෙන් පෙනේ:

  1. අපට gRPC ඇමතුමක් ලැබේ ControllerExpandVolume;
  2. අපි API හි තැටිය වැඩි කිරීමට උත්සාහ කරමු, නමුත් තැටිය සවි කර ඇති නිසා මෙහෙයුම සිදු කිරීමේ නොහැකියාව පිළිබඳ දෝෂයක් අපට ලැබේ;
  3. වැඩි කිරීමේ මෙහෙයුම සිදු කළ යුතු තැටි අඩංගු සිතියමක අපි තැටි හඳුනාගැනීම සුරකිමු. පහත, කෙටිකතාව සඳහා, අපි මෙම සිතියම ලෙස හඳුන්වනු ඇත volumeResizeRequired;
  4. තැටිය භාවිතා කරන පොඩ් එක අතින් ඉවත් කරන්න. Kubernetes එය නැවත ආරම්භ කරනු ඇත. තැටිය සවි කිරීමට කාලය නොමැති නිසා (ControllerPublishVolume) සවි කිරීමට උත්සාහ කරන විට වැඩි කිරීමේ මෙහෙයුම සම්පූර්ණ කිරීමට පෙර, දී ඇති තැටිය තවමත් තිබේදැයි අපි පරීක්ෂා කරමු volumeResizeRequired සහ දෝෂයක් ආපසු දෙන්න;
  5. CSI ධාවකය ප්‍රමාණය වෙනස් කිරීමේ මෙහෙයුම නැවත ක්‍රියාත්මක කිරීමට උත්සාහ කරයි. මෙහෙයුම සාර්ථක නම්, තැටිය ඉවත් කරන්න volumeResizeRequired;
  6. නිසා තැටි හැඳුනුම්පත අස්ථානගත වී ඇත volumeResizeRequired, ControllerPublishVolume සාර්ථකව සමත් වේ, තැටිය සවි කර ඇත, පොඩ් ආරම්භ වේ.

සෑම දෙයක්ම ප්රමාණවත් තරම් සරල බව පෙනේ, නමුත් සෑම විටම මෙන් අන්තරායන් ඇත. තැටි විශාල කරයි බාහිර-ප්‍රතිප්‍රමාණකය, මෙහෙයුම අතරතුර දෝෂයක් ඇති වුවහොත් පෝලිමක් භාවිතා කරයි තත්පර 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+ දක්වා දිගු කිරීමට හේතු විය හැකි අතර, ඒ අනුව, අනුරූප පොඩ් එක ලබා ගත නොහැක.

විභව අක්‍රිය කාලය අඩු කිරීමට ඉතා පහසුවෙන් සහ වේදනා රහිතව අපට ඉඩ සලසන එකම විකල්පය වූයේ උපරිම කල් ඉකුත්වීමේ සීමාවක් සහිත අපගේ බාහිර ප්‍රතිප්‍රමාණයේ අනුවාදය භාවිතා කිරීමයි. තත්පර 5 කින්:

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

නොබැඳි තැටි ප්‍රමාණය වෙනස් කිරීම සියලු වලාකුළු සපයන්නන්ගෙන් ඉක්මනින් අතුරුදහන් වන ආපසු හැරීමක් වන බැවින්, හදිසි සාකච්ඡාවක් ආරම්භ කිරීම සහ බාහිර ප්‍රතිප්‍රමාණකරණය පැච් කිරීම අවශ්‍ය යැයි අපි සැලකුවේ නැත.

භාවිතා කිරීම ආරම්භ කරන්නේ කෙසේද?

ධාවකය Kubernetes අනුවාදය 1.15 සහ ඉහළ මත සහය දක්වයි. රියදුරු වැඩ කිරීමට නම්, පහත අවශ්යතා සපුරාලිය යුතුය:

  • ධජය --allow-privileged අගයට සකසා ඇත true API සේවාදායකය සහ kubelet සඳහා;
  • ඇතුළත් --feature-gates=VolumeSnapshotDataSource=true,KubeletPluginsWatcher=true,CSINodeInfo=true,CSIDriverRegistry=true API සේවාදායකය සහ kubelet සඳහා;
  • මවුන්ට් ප්‍රචාරණය (කඳු ප්‍රචාරණය) පොකුරේ සක්රිය කළ යුතුය. Docker භාවිතා කරන විට, බෙදාගත් සවි කිරීම් වලට ඉඩ දීම සඳහා ඩීමන් වින්‍යාස කළ යුතුය.

ස්ථාපනය සඳහාම අවශ්ය සියලු පියවර README හි විස්තර කර ඇත. ස්ථාපනයට මැනිෆෙස්ට් වලින් Kubernetes හි වස්තූන් නිර්මාණය කිරීම ඇතුළත් වේ.

රියදුරු වැඩ කිරීමට ඔබට පහත සඳහන් දෑ අවශ්‍ය වේ:

  • මැනිෆෙස්ටයේ ඩිරෙක්ටරි හැඳුනුම්කාරකය සඳහන් කරන්න (folder-id) Yandex.Cloud (ලේඛන බලන්න);
  • Yandex.Cloud API සමඟ අන්තර් ක්රියා කිරීමට, CSI ධාවකය සේවා ගිණුමක් භාවිතා කරයි. මැනිෆෙස්ටයේ දී, රහස සම්මත කළ යුතුය බලයලත් යතුරු සේවා ගිණුමෙන්. ලේඛනවල විස්තර කර ඇත, සේවා ගිණුමක් සාදා යතුරු ලබා ගන්නේ කෙසේද.

සමස්තයක් වසයෙන් - උත්සාහ කරන්න, සහ ප්‍රතිපෝෂණ ලැබීමට අපි සතුටු වන්නෙමු නව ගැටළුඔබට කිසියම් ගැටළුවක් ඇත්නම්!

තවදුරටත් සහාය

එහි ප්‍රතිඵලයක් වශයෙන්, අපි මෙම CSI ධාවකය ක්‍රියාත්මක කළේ Go හි යෙදුම් ලිවීමට විනෝද වීමට ඇති දැඩි ආශාව නිසා නොව, සමාගම තුළ ඇති හදිසි අවශ්‍යතාවයක් නිසා බව සටහන් කිරීමට කැමැත්තෙමු. අපගේම ක්‍රියාත්මක කිරීම පවත්වා ගැනීම අපට ප්‍රායෝගික නොවන බව පෙනේ, එබැවින් Yandex උනන්දුවක් දක්වන්නේ නම් සහ රියදුරුට දිගටම සහාය වීමට තීරණය කරන්නේ නම්, ගබඩාව ඔවුන්ට පැවරීමට අපි සතුටු වන්නෙමු.

මීට අමතරව, Yandex හට එහි කළමනාකරණය කරන ලද Kubernetes පොකුරේ CSI ධාවකයේ තමන්ගේම ක්‍රියාත්මක කිරීමක් ඇත, එය විවෘත මූලාශ්‍රයෙන් නිකුත් කළ හැකිය. මෙම සංවර්ධන විකල්පය වාසිදායක ලෙස අපි දකිමු - ප්‍රජාවට ඔප්පු කළ ධාවකයක් භාවිතා කිරීමට හැකි වනු ඇත්තේ සේවා සපයන්නෙකුගෙන් මිස තෙවන පාර්ශවීය සමාගමකින් නොවේ.

ප්රාදේශීය සභා

අපගේ බ්ලොග් අඩවියේ ද කියවන්න:

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න