Flant ããªãªãŒã¹ããªãªãŒã¹ããããšã§ãKubernetes çšã®ãªãŒãã³ãœãŒã¹ ããŒã«ãžã®è²¢ç®ãæ¡å€§ããŠããããšãçºè¡šã§ããããšãå¬ããæããŸãã
ãã ããå®è£
ã®è©³çŽ°ã«é²ãåã«ãYandex ã«ã¯ãã§ã«ãµãŒãã¹ãããã®ã«ããªããããå¿
èŠãªã®ããšãã質åã«çããŠã¿ãŸãããã
å°å ¥
ããã¯ãªãã§ããïŒ
åœç€Ÿã§ã¯ãå®çšŒåç°å¢ã§ Kubernetes ã䜿çšãå§ããåœåãã (ã€ãŸãããæ°å¹Ž)ãç¬èªã®ããŒã« (ãããããŠã¹) ãéçºããŠããŸãããã¡ãªã¿ã«ããããéããªããªãŒãã³ãœãŒã¹ ãããžã§ã¯ããšããŠå©çšå¯èœã«ããäºå®ã§ãã ã ãã®å©ããåããŠããã¹ãŠã®ã¯ã©ã¹ã¿ãŒãåäžã«æ§æããŠãããçŸåšãããŸããŸãªããŒããŠã§ã¢æ§æãšå©çšå¯èœãªãã¹ãŠã®ã¯ã©ãŠã ãµãŒãã¹äžã«ããã§ã« 100 ãè¶ ããã¯ã©ã¹ã¿ãŒãååšããŠããŸãã
ãããããŠã¹ã䜿çšããã¯ã©ã¹ã¿ãŒã«ã¯ããã©ã³ãµãŒã䟿å©ãªãã£ãŒãã«ããã¢ãã¿ãªã³ã°ãã¡ããªãã¯ãšã¢ã©ãŒãããã¹ãŠã®ããã·ã¥ããŒãã«ã¢ã¯ã»ã¹ããããã®å€éšãããã€ããŒã«ãããŠãŒã¶ãŒèªèšŒãªã©ãéçšã«å¿ èŠãªãã¹ãŠã®ã³ã³ããŒãã³ããå«ãŸããŠããŸãã ãã®ãããªããã³ãã¢ããããããã¯ã©ã¹ã¿ãŒã管çãœãªã¥ãŒã·ã§ã³ã«ã€ã³ã¹ããŒã«ããããšã¯ãå€ãã®å Žåäžå¯èœã§ããããã³ã³ããŒãã³ãã®ååãç¡å¹ã«ããå¿ èŠããããããæå³ããããŸããã
NB: ããã¯ç§ãã¡ã®çµéšã§ãããéåžžã«å ·äœçã§ãã ç§ãã¡ã¯ã誰ããæ¢è£œã®ãœãªã¥ãŒã·ã§ã³ã䜿çšããã®ã§ã¯ãªããç¬èªã« Kubernetes ã¯ã©ã¹ã¿ãŒããããã€ããå¿ èŠããããšææ¡ããŠããããã§ã¯ãããŸããã ã¡ãªã¿ã«ãç§ãã¡ã«ã¯ Yandex ãã Kubernetes ãéçšããå®éã®çµéšã¯ãªãããã®èšäºã§ã¯ãã®ãµãŒãã¹ã®è©äŸ¡ã¯è¡ããŸããã
ããã¯äœã§ããã誰ã®ããã§ãã?
ãããã£ãŠãKubernetes ã®ã¹ãã¬ãŒãžã«å¯Ÿããææ°ã®ã¢ãããŒãã«ã€ããŠã¯ãã§ã«èª¬æããŸããã
çŸåšãå€ãã®å€§èŠæš¡ã¯ã©ãŠã ãµãŒãã¹ ãããã€ããŒã¯ãã¯ã©ãŠã ãã£ã¹ã¯ã Kubernetes ã®æ°žç¶ããªã¥ãŒã ãšããŠäœ¿çšããããã®ãã©ã€ããŒãéçºããŠããŸãã ãµãã©ã€ã€ãŒããã®ãããªãã©ã€ããŒãæã£ãŠããªãããå¿ èŠãªæ©èœããã¹ãŠ API çµç±ã§æäŸãããŠããå Žåã¯ããã©ã€ããŒãèªåã§å®è£ ããããšã劚ãããã®ã¯ãããŸããã ãããYandex.Cloudã§èµ·ãã£ãããšã§ãã
éçºã®åºç€ãšããŠæ¡çšããŸãã Operation
é·æéå®è¡æäœ (æ°ãããã£ã¹ã¯ã®äœæãªã©) ã®ã¹ããŒã¿ã¹ã远跡ããŸãã Yandex.Cloud API ãšå¯Ÿè©±ããã«ã¯ã次ã䜿çšããŸãã
è¡ãããäœæ¥ã®çµæ
å ·çŸå
äž»ãªæ©èœ
çŸåšããã©ã€ããŒã¯æ¬¡ã®æ©èœããµããŒãããŠããŸãã
- ã¯ã©ã¹ã¿ãŒå ã®ããŒãã®ããããžãŒã«åŸã£ãŠãã¯ã©ã¹ã¿ãŒã®ãã¹ãŠã®ãŸãŒã³å ã®ãã£ã¹ã¯ãé åºä»ãããŸãã
- 以åã«æ³šæãããã£ã¹ã¯ãåé€ããã
- ãã£ã¹ã¯ã®ãªãã©ã€ã³ ãµã€ãºå€æŽ (Yandex.Cloud)
ãµããŒãããŠããŸãã ä»®æ³ãã·ã³ã«ããŠã³ãããããã£ã¹ã¯ãå¢ãããŸã)ã ãµã€ãºå€æŽãã§ããã ãç°¡åã«è¡ãããã«ãã©ã€ããŒãã©ã®ããã«å€æŽããå¿ èŠããããã«ã€ããŠã¯ã以äžãåç §ããŠãã ããã
å°æ¥çã«ã¯ããã£ã¹ã¯ ã¹ãããã·ã§ããã®äœæãšåé€ã®ãµããŒããå®è£ ããäºå®ã§ãã
äž»ãªå°é£ãšãããå æããæ¹æ³
Yandex.Cloud API ã«ã¯ãªã¢ã«ã¿ã€ã ã§ãã£ã¹ã¯ãå¢ããæ©èœããªããããPV (æ°žç¶ããªã¥ãŒã ) ã®ãµã€ãºå€æŽæäœãè€éã«ãªããŸãããã®å Žåããã£ã¹ã¯ã䜿çšããã¢ããªã±ãŒã·ã§ã³ ããããåæ¢ããå¿ èŠããããŸããããã«ãããã¢ããªã±ãŒã·ã§ã³ã®ããŠã³ã¿ã€ã ãçºçããå¯èœæ§ããããŸãã
ã«ãã VolumeExpansion.OFFLINE
)ããã£ã¹ã¯ãå¢ããããã»ã¹ã¯æ¬¡ã®ããã«ãªããŸãã
ãã©ã°ã€ã³ã«ã®ã¿ããå Žå
VolumeExpansion.OFFLINE
æ¡åŒµæ©èœãšããªã¥ãŒã ãçŸåšå ¬éãããŠããããããŒãäžã§å©çšå¯èœã§ããå ŽåControllerExpandVolume
次ã®ããããã®åŸã«ã®ã¿åŒã³åºãå¿ èŠããããŸãã
- ãã©ã°ã€ã³ã«ã¯ã³ã³ãããŒã©ãŒããããŸã
PUBLISH_UNPUBLISH_VOLUME
èœåãšControllerUnpublishVolume
æ£åžžã«åŒã³åºãããŠããŸãããããã¯ãã以å€
- ãã©ã°ã€ã³ã«ã¯ã³ã³ãããŒã©ãŒããããŸãã
PUBLISH_UNPUBLISH_VOLUME
æ©èœããã©ã°ã€ã³ã«ã¯ããŒãããããŸãSTAGE_UNSTAGE_VOLUME
èœåããããŠNodeUnstageVolume
æ£åžžã«å®äºããŸããããããã¯ãã以å€
- ãã©ã°ã€ã³ã«ã¯ã³ã³ãããŒã©ãŒããããŸãã
PUBLISH_UNPUBLISH_VOLUME
èœåãããŒããSTAGE_UNSTAGE_VOLUME
èœåããããŠNodeUnpublishVolume
æ£åžžã«å®äºããŸããã
ããã¯åºæ¬çã«ãä»®æ³ãã·ã³ãæ¡åŒµããåã«ãã£ã¹ã¯ãä»®æ³ãã·ã³ããåãé¢ãå¿ èŠãããããšãæå³ããŸãã
ãã ããæ®å¿µãªãã å®è£ ãµã€ãã«ãŒãä»ãã CSI ä»æ§ã¯ã次ã®èŠä»¶ãæºãããŠããŸããã
- ãµã€ãã«ãŒã³ã³ããå
csi-attacher
ããŠã³ãéã«å¿ èŠãªã®ã£ãããååšããåå ãšãªãã¯ãã§ããããã®æ©èœã¯åã«ãªãã©ã€ã³ ãµã€ãºå€æŽã§ã¯å®è£ ãããŠããŸããã ããã«ã€ããŠã®è°è«ãå§ãŸããŸãããã㧠. - ãã®æèã«ããããµã€ãã«ãŒ ã³ã³ãããšã¯æ£ç¢ºã«ã¯äœã§ãããã? CSI ãã©ã°ã€ã³èªäœã¯ Kubernetes API ãšå¯Ÿè©±ããããµã€ãã«ãŒ ã³ã³ãããŒã«ãã£ãŠéä¿¡ããã gRPC åŒã³åºãã«ã®ã¿å¿çããŸãã ææ°
éçºäžã§ã Kubernetes ã³ãã¥ããã£ã«ããã
ç§ãã¡ã®å Žå (CSI ãã©ã°ã€ã³)ããã£ã¹ã¯ãå¢ããæäœã¯æ¬¡ã®ããã«ãªããŸãã
- gRPC åŒã³åºããåä¿¡ããŸã
ControllerExpandVolume
; - API ã§ãã£ã¹ã¯ãå¢ããããšããŠããŸããããã£ã¹ã¯ãããŠã³ããããŠããããæäœãå®è¡ã§ããªããšãããšã©ãŒã衚瀺ãããŸãã
- å¢å æäœãå®è¡ããå¿
èŠããããã£ã¹ã¯ãå«ããããã«ãã£ã¹ã¯èå¥åãä¿åããŸãã 以äžã§ã¯ãç°¡æœã«ããããã«ããã®ãããã次ã®ããã«åŒã³ãŸãã
volumeResizeRequired
; - ãã£ã¹ã¯ã䜿çšããŠããããããæåã§åé€ããŸãã Kubernetes ãåèµ·åããŸãã ãã£ã¹ã¯ãããŠã³ãããæéããªãããã« (
ControllerPublishVolume
) ããŠã³ãããããšãããšãã«å¢å æäœãå®äºããåã«ãæå®ããããã£ã¹ã¯ããŸã ååšããããšã確èªããŸããvolumeResizeRequired
ãããŠãšã©ãŒãè¿ããŸãã - CSI ãã©ã€ããŒã¯ããµã€ãºå€æŽæäœã®åå®è¡ãè©Šè¡ããŸãã æäœãæåããå Žåã¯ããã£ã¹ã¯ã次ããåãå€ããŸãã
volumeResizeRequired
; - ãªããªããã£ã¹ã¯ ID ããããŸãã
volumeResizeRequired
,ControllerPublishVolume
æåãããšããã£ã¹ã¯ãããŠã³ããããããããéå§ãããŸãã
ãã¹ãŠãéåžžã«åçŽã«èŠããŸããããã€ãã®ããã«èœãšãç©ŽããããŸãã ãã£ã¹ã¯ãæ¡å€§ããŸã
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 å以äžå»¶é·ããã察å¿ãããããã䜿çšã§ããªããªãããšãå®æçã«çºçããå¯èœæ§ããããŸãã
æœåšçãªããŠã³ã¿ã€ã ãéåžžã«ç°¡åãã€èŠçãªãåæžã§ããå¯äžã®ãªãã·ã§ã³ã¯ãæ倧ã¿ã€ã ã¢ãŠãå¶éãåããããŒãžã§ã³ã® external-resizer ã䜿çšããããšã§ããã
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 ã䜿çšããå Žåãå ±æããŠã³ããèš±å¯ããããã«ããŒã¢ã³ãæ§æããå¿ èŠããããŸãã
ã€ã³ã¹ããŒã«èªäœã«å¿
èŠãªãã¹ãŠã®æé
ãã©ã€ããŒãåäœããã«ã¯ã次ã®ãã®ãå¿ èŠã§ãã
- ãããã§ã¹ãã§ãã£ã¬ã¯ããªèå¥åãæå®ããŸã (
folder-id
) Yandex.Cloud (ããã¥ã¡ã³ããåç §ããŠãã ãã ); - Yandex.Cloud API ãšå¯Ÿè©±ããããã«ãCSI ãã©ã€ããŒã¯ãµãŒãã¹ ã¢ã«ãŠã³ãã䜿çšããŸãã ãããã§ã¹ãã§ã¯ Secret ãæž¡ãå¿
èŠããããŸã
èªå¯ãããã㌠ãµãŒãã¹ã¢ã«ãŠã³ãããã ããã¥ã¡ã³ãã§ã¯èª¬æããã ããµãŒãã¹ ã¢ã«ãŠã³ããäœæããŠããŒãååŸããæ¹æ³ã
å
šäœãšã㊠-
ãããªããµããŒã
ãã®çµæããã® CSI ãã©ã€ããŒãå®è£ ããã®ã¯ãGo ã§ã¢ããªã±ãŒã·ã§ã³ã楜ããæžããããšãã匷ãé¡æããã§ã¯ãªãã瀟å ã§ã®ç·æ¥ã®å¿ èŠæ§ããã§ããããšã«æ³šæããŠãã ããã ç§ãã¡ã«ãšã£ãŠãç¬èªã®å®è£ ãç¶æããããšã¯çŸå®çã§ã¯ãªããšæããããããYandex ãé¢å¿ã瀺ãããã©ã€ããŒã®ãµããŒããç¶ç¶ããããšã決å®ããå Žåã¯ãåãã§ãªããžããªã圌ãã«è»¢éããŸãã
ããã«ãYandex ã¯ããããããããŒãžã Kubernetes ã¯ã©ã¹ã¿ãŒã« CSI ãã©ã€ããŒã®ç¬èªã®å®è£ ãæã£ãŠããããªãŒãã³ãœãŒã¹ã§ãªãªãŒã¹ã§ããŸãã ãŸãããã®éçºãªãã·ã§ã³ã¯æå©ã§ãããšèããŠããŸããã³ãã¥ããã£ã¯ããµãŒãããŒãã£äŒæ¥ã§ã¯ãªãããµãŒãã¹ ãããã€ããŒã®å®çžŸã®ãããã©ã€ããŒã䜿çšã§ããããã«ãªããŸãã
PS
ç§ãã¡ã®ããã°ããèªã¿ãã ãã:
- «
Kubernetes ã¹ãã¬ãŒãžã®ããªã¥ãŒã ãã©ã°ã€ã³: Flexvolume ãã CSI ãŸã§ "; - «
ç§ãã¡ã¯ã³ã³ãã ã¹ãã¬ãŒãž ã€ã³ã¿ãŒãã§ã€ã¹ (Kubernetes ã ãã§ãªã) ãç解ããŠããŸãã "; - «
Kubernetes ã¯ã©ã¹ã¿ãŒãæºåããã®ã¯ç°¡åã§äŸ¿å©ã§ãã? ã¢ããªã³ãªãã¬ãŒã¿ãŒã®çºè¡š "; - «
Kubernetes ã®æ¡åŒµãšè£è¶³ (æŠèŠãšãã㪠ã¬ããŒã) 'ã
åºæïŒ habr.com