Lyftã¯ãèªååãæäŸããã¡ãªããã掻çšããããã«ããµãŒããŒã€ã³ãã©ã¹ãã©ã¯ãã£ãåæ£ã³ã³ãããªãŒã±ã¹ãã¬ãŒã·ã§ã³ã·ã¹ãã ã§ããKubernetesã«ç§»åããããšã決å®ããŸããã圌ãã¯ããããªãéçºã®åºç€ãšãªãã ãã§ãªããå¹çãé«ããªããå šäœçãªã³ã¹ããåæžã§ãããå ç¢ã§ä¿¡é Œæ§ã®é«ããã©ãããã©ãŒã ãæãã§ããŸããã
åæ£ã·ã¹ãã ã¯ç解ãšåæãé£ããå ŽåããããKubernetesãäŸå€ã§ã¯ãããŸãããå€ãã®å©ç¹ãããã«ãããããããã¹ã±ãžã¥ãŒã«ã«åŸã£ãŠå埩çãªã¿ã¹ã¯ãå®è¡ããããã«Kubernetesã«çµã¿èŸŒãŸããŠããã·ã¹ãã ã§ããCronJobã«ç§»è¡ãããšãã«ãããã€ãã®ããã«ããã¯ãç¹å®ããŸããããã®2éšæ§æã®ã·ãªãŒãºã§ã¯ã倧èŠæš¡ãªãããžã§ã¯ãã§äœ¿çšããå Žåã®Kubernetes CronJobã®æè¡çããã³éçšäžã®æ¬ ç¹ã«ã€ããŠèª¬æããããããå æããçµéšãå ±æããŸãã
ãŸããLyftã§äœ¿çšãããšãã«ééããKubernetesCronJobsã®æ¬ ç¹ã«ã€ããŠèª¬æããŸãã次ã«ïŒç¬¬2éšïŒ-Kubernetesã¹ã¿ãã¯ã®ãããã®æ¬ ç¹ã解æ¶ãã䜿ãããããåäžãããä¿¡é Œæ§ãåäžãããæ¹æ³ã説æããŸãã
ããŒã1ãã¯ããã«
ãããã®èšäºãã誰ãæ©æµãåããŸããïŒ
- KubernetesCronJobãŠãŒã¶ãŒã
- , Kubernetes.
- , Kubernetes .
- , Kubernetes , .
- Contributor' Kubernetes.
?
- , Kubernetes ( , CronJob) .
- , Kubernetes Lyft , .
:
- cron'.
- , CronJob, â , CronJob, Job' Pod', . CronJob Unix cron' .
- sidecar- , . Lyft sidecar- , runtime- Envoy, statsd .., sidecar-, , .
- ronjobcontroller â Kubernetes, CronJob'.
- , cron , ( ).
- Lyft Engineering , ( «», « », « ») â Lyft ( «», « », «» «»). , , «-» .
CronJob' Lyft
çŸåšããã«ãããã³ãã®å®çšŒåç°å¢ã«ã¯ã1æéã«1500å以äžåŒã³åºããã500è¿ãã®cronãžã§ãããããŸãã
å®æçãªã¹ã±ãžã¥ãŒã«ãããã¿ã¹ã¯ã¯ãLyftã«ãã£ãŠããŸããŸãªç®çã§åºã䜿çšãããŠããŸãã Kubernetesã«ç§»è¡ããåã¯ãéåžžã®Unixcronã䜿çšããŠLinuxãã·ã³ã§çŽæ¥å®è¡ããŠããŸãããéçºããŒã ã¯ã
crontab
å®çŸ©ãèšè¿°ããInfrastructure As CodeïŒIaCïŒãã€ãã©ã€ã³ã䜿çšããŠããããå®è¡ããã€ã³ã¹ã¿ã³ã¹ãããããžã§ãã³ã°ãã責任ããããã€ã³ãã©ã¹ãã©ã¯ãã£ããŒã ã¯ããããç¶æãã責任ããããŸããã
ã¯ãŒã¯ããŒããã³ã³ããåããŠç¬èªã®Kubernetesãã©ãããã©ãŒã ã«ç§»è¡ããããã®ãã倧ããªåãçµã¿ã®äžç°ãšããŠãCronJob *ã«ç§»è¡ããåŸæ¥ã®Unixcronã察å¿ããKubernetesã«çœ®ãæããããšã«ããŸãããä»ã®å€ãã®äººãšåæ§ã«ãKubernetesã¯ããªãœãŒã¹ã®å¹ççãªäœ¿çšãªã©ãïŒå°ãªããšãçè«çã«ã¯ïŒãã®å€§ããªå©ç¹ã®ããã«éžæãããŸããã
é±ã«1å15åéå®è¡ãããcronã¿ã¹ã¯ãæ³åããŠã¿ãŠãã ãããå€ãç°å¢ã§ã¯ããã®ã¿ã¹ã¯å°çšã®ãã·ã³ã¯99.85ïŒ ã®æéã¢ã€ãã«ç¶æ ã«ãªããŸãã Kubernetesã®å Žåãèšç®ãªãœãŒã¹ïŒCPUãã¡ã¢ãªïŒã¯é話äžã«ã®ã¿äœ¿çšãããŸããæ®ãã®æéã¯ãæªäœ¿çšã®å®¹éã䜿çšããŠä»ã®CronJobãèµ·åããããåã«ã¹ã±ãŒã«ããŠã³ãããã§ããŸããéãŸãã cronãžã§ããå®è¡ããéå»ã®æ¹æ³ãèãããšããžã§ããäžæçãªã¢ãã«ã«ç§»è¡ããããšã§å€ãã®ã¡ãªãããåŸãããŸãã
Lyftã¹ã¿ãã¯å ã®éçºè ãšãã©ãããã©ãŒã ãšã³ãžãã¢ã®è²¬ä»»å¢ç
Kubernetesãã©ãããã©ãŒã ã«ç§»è¡ããåŸãéçºããŒã ã¯ç¬èªã®ã³ã³ãã¥ãŒãã£ã³ã°ã€ã³ã¹ã¿ã³ã¹ã®å²ãåœãŠãšéçšãåæ¢ããŸããããã©ãããã©ãŒã ããŒã ã¯çŸåšãKubernetesã¹ã¿ãã¯ã®èšç®ãªãœãŒã¹ãšã©ã³ã¿ã€ã äŸåé¢ä¿ã®ç¶æãšéçšãæ åœããŠããŸããããã«ã圌女ã¯CronJobãªããžã§ã¯ãèªäœãäœæãã責任ããããŸããéçºè ã¯ãã¿ã¹ã¯ã¹ã±ãžã¥ãŒã«ãšã¢ããªã±ãŒã·ã§ã³ã³ãŒããæ§æããã ãã§æžã¿ãŸãã
ããããããã¯ãã¹ãŠçŽã®äžã§ããèŠããŸããå®éã«ã¯ãååã«ç 究ãããåŸæ¥ã®Unix cronç°å¢ãããKubernetesã®åæ£åã®äžæçãªCronJobç°å¢ã«ç§»è¡ããéã«ãããã€ãã®ããã«ããã¯ãç¹å®ããŸããã
* CronJobã¯ïŒKubernetes v1.18ã®æç¹ã§ïŒããŒã¿çã®ã¹ããŒã¿ã¹ã§ããããåœæã®ããŒãºãååã«æºãããä»ã®Kubernetesã€ã³ãã©ã¹ãã©ã¯ãã£ããŒã«ããããšãå®å šã«é©åããŠããããšãããããŸããã ..ã
KubernetesCronJobã¯Unixcronãšã©ã®ããã«ç°ãªããŸããïŒ
KubernetesCronJobã®äœæ¥ã«é¢é£ããã€ãã³ããšK8sãœãããŠã§ã¢ã³ã³ããŒãã³ãã®ç°¡ç¥åãããã·ãŒã±ã³ã¹
å®çšŒåç°å¢ã§ã®KubernetesCronJobã®æäœãç¹å®ã®åé¡ã«é¢é£ããçç±ããããã説æããããã«ããŸããããããåŸæ¥ã®ãã®ãšã©ã®ããã«ç°ãªãããå®çŸ©ããŸããããCronJobã¯ãLinuxãŸãã¯Unixã®cronãžã§ããšåãããã«æ©èœããã¯ãã§ãããã ããå®éã«ã¯ãåäœã«ã¯å°ãªããšã2ã€ã®å€§ããªéãããããŸããèµ·åé床ãšã¯ã©ãã·ã¥åŠçã§ãã
èµ·åé床
é 延éå§ ïŒéå§é 延ïŒã¯ãã¹ã±ãžã¥ãŒã«ãããéå§cronããã¢ããªã±ãŒã·ã§ã³ã³ãŒãã®å®éã®éå§ãŸã§ã®çµéæéãšããŠå®çŸ©ãããŸããã€ãŸããcronã00:00:00ã«éå§ããããã«ã¹ã±ãžã¥ãŒã«ãããŠããŠãã¢ããªã±ãŒã·ã§ã³ã00:00:22ã«å®è¡ãéå§ããå Žåããã®ç¹å®ã®cronã®éå§ã®é 延ã¯22ç§ã«ãªããŸãã
åŸæ¥ã®Unixcronã®å Žåãèµ·åé 延ã¯æå°éã§ããã¿ã€ãã³ã°ãåãã°ããããã®ã³ãã³ãã¯åçŽã«å®è¡ãããŸãã次ã®äŸã§ããã確èªããŸãããã
# date
0 0 * * * date >> date-cron.log
ãã®ãããªcronæ§æã§ã¯ã次ã®åºåãåŸãããå¯èœæ§ããããŸã
date-cron.log
ã
Mon Jun 22 00:00:00 PDT 2020
Tue Jun 23 00:00:00 PDT 2020
âŠ
äžæ¹ãKubernetes CronJobã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã®åã«ããã€ãã®ã€ãã³ããçºçãããããèµ·åãå€§å¹ ã«é ããå¯èœæ§ããããŸãããããã®ããã€ãã次ã«ç€ºããŸãã
-
cronjobcontroller
åŠçããCronJobãåŒã³åºãããšã決å®ããŸãã -
cronjobcontroller
CronJobãžã§ãä»æ§ã«åºã¥ããŠãžã§ããäœæããŸãã -
jobcontroller
æ°ãããžã§ãã«æ°ã¥ããããããäœæããŸãã - Admission Controllerã¯ããµã€ãã«ãŒã³ã³ããããŒã¿ããããä»æ§ã«æ¿å ¥ããŸã*;
-
kube-scheduler
kubeletã§ããããèšç»ããã -
kubelet
Podãèµ·åããŸãïŒãã¹ãŠã®ã³ã³ããã€ã¡ãŒãžããã§ããããŸãïŒã -
kubelet
ãã¹ãŠã®ãµã€ãã«ãŒã³ã³ãããéå§ããŸã*; -
kubelet
ã¢ããªã±ãŒã·ã§ã³ã³ã³ãããèµ·åããŸã*ã
*ãããã®ã¹ããŒãžã¯ãLyftKubernetesã¹ã¿ãã¯ã«åºæã®ãã®ã§ãã
Kubernetesç°å¢ã§CronJobã®ç¹å®ã®ã¹ã±ãŒã«ã«éãããšãé ç®1ã5ãããã³7ãé 延ã«æã倧ããå¯äžããããšãããããŸããã
ä»äºã«ããé
ã cronjobcontroller'
é 延ãã©ãããæ¥ãã®ããããããç解ããããã«ãã€ã³ã©ã€ã³ãœãŒã¹ã³ãŒãã調ã¹ãŠã¿ãŸããã
cronjobcontroller'
ãKubernetes 1.18ã§ã¯ã10ç§ããšã«cronjobcontroller
ãã¹ãŠã®CronJobããã§ãã¯ããããããã«å¯ŸããŠããã€ãã®ããžãã¯ãå®è¡ããŸãã
å®è£
ã¯ãCronJobããšã«å°ãªããšã1ã€ã®è¿œå ã®APIåŒã³åºããè¡ãããšã«ããããããåæçã«å®è¡ããŸããCronJobã®æ°ãç¹å®ã®æ°ãè¶
ãããšããããã®APIåŒã³åºãã¯ã¯ã©ã€ã¢ã³ãåŽã®å¶çŽãåãå§ããŸãã
10ç§ã®ããŒãªã³ã°ãµã€ã¯ã«ãšã¯ã©ã€ã¢ã³ãåŽã®APIåŒã³åºãã«ãããCronJobã®èµ·åé
延ã倧å¹
ã«å¢å ããŸãã
cronjobcontroller'
cronã䜿çšãããããã®ã¹ã±ãžã¥ãŒãªã³ã°
cronã¹ã±ãžã¥ãŒã«ã®æ§è³ªäžããããã®ã»ãšãã©ã¯åã®å§ãã«å®è¡ãããŸãïŒXXïŒYYïŒ00ïŒãããšãã°ã
@hourly
ïŒæ¯æïŒcronã¯01ïŒ00ïŒ00ã02ïŒ00ïŒ00ãªã©ã«å®è¡ãããŸãã 1æéããšã15åããšã5åããšãªã©ãå€æ°ã®cronãå®è¡ãããŠãããã«ãããã³ãcronãã©ãããã©ãŒã ã®å Žåãè€æ°ã®cronãéå§ããããšããã«ãã㯠ïŒãããã¹ãããïŒãçºçããŸããåæã«ã Lyftã®ç§ãã¡ã¯ããã®ãããªå Žæã®1ã€ãæéã®å§ãŸãïŒXXïŒ00ïŒ00ïŒã§ããããšã«æ°ã¥ããŸããããããã®ãããã¹ãããã¯ã次ã®ãããªcronãžã§ãã®å®è¡ã«é¢ããå¶åŸ¡å±€ã®ã³ã³ããŒãã³ãã§èŠæ±ã®é »åºŠãå¶éããè¿œå ã®è² è·ãéãäœækube-scheduler
ããã³kube-apiserver
ãã¹ã¿ãŒãã¢ããé
延ã®é¡èãªå¢å ã«ã€ãªãããã
ããã«ãããŒã¯è² è·ã®åŠçèœåãããããžã§ãã³ã°ããïŒããã³/ãŸãã¯ã¯ã©ãŠããµãŒãã¹ã®ã³ã³ãã¥ãŒãã£ã³ã°ã€ã³ã¹ã¿ã³ã¹ã䜿çšïŒã代ããã«ã¯ã©ã¹ã¿ãŒèªåã¹ã±ãŒãªã³ã°ã¡ã«ããºã ã䜿çšããŠããŒããåçã«ã¹ã±ãŒãªã³ã°ããå ŽåãããŒãã®èµ·åã«ãããæéã¯èµ·ååŸ ã¡æéã«ããã«å¯äžããŸãããããCronJobã
ãããã®èµ·åïŒãã«ããŒã³ã³ãã
CronJobããããæ£åžžã«ã¹ã±ãžã¥ãŒã«ããã
kubelet
ãšãåŸè
ã¯ãã¹ãŠã®ãµã€ãã«ãŒãšã¢ããªã±ãŒã·ã§ã³èªäœã®ã³ã³ããã€ã¡ãŒãžããã§ããããŠå®è¡ããå¿
èŠããããŸããLyftã§ã®ã³ã³ããã®èµ·åã®è©³çŽ°ïŒãµã€ãã«ãŒã³ã³ããã¯ã¢ããªã±ãŒã·ã§ã³ã³ã³ããã®åã«èµ·åããŸãïŒã«ããããµã€ãã«ãŒã®èµ·åã®é
延ã¯å¿
ç¶çã«çµæã«åœ±é¿ãäžããã¿ã¹ã¯ã®éå§ãããã«é
延ããŸãã
ãããã£ãŠãå¿ èŠãªã¢ããªã±ãŒã·ã§ã³ã³ãŒããå®è¡ããåã®èµ·åæã®é 延ã¯ããã«ãããã³ãç°å¢ã§ã®å€æ°ã®CronJobãšçžãŸã£ãŠãç®ç«ã£ãŠäºæž¬ã§ããªãèµ·åé 延ã«ã€ãªãããŸããå°ãåŸã§èª¬æããŸãããå®éã«ã¯ããã®ãããªé 延ã¯CronJobã®åäœã«æªåœ±é¿ãåãŒããèµ·åãéãæãããããŸãã
ã³ã³ããã®ã¯ã©ãã·ã¥åŠç
äžè¬ã«ãcronã®åäœã«æ³šæãæãããšããå§ãããŸãã Unixã·ã¹ãã ã®å Žåãããã¯ããªãç°¡åã§ãã Unixã¯ããŒã³ã¯ãæå®ãããã·ã§ã«ã䜿çšããŠæå®ãããã³ãã³ãã解éã
$SHELL
ãã³ãã³ããçµäºããåŸïŒæåãããã©ããã«é¢ä¿ãªãïŒããã®ç¹å®ã®åŒã³åºãã¯å®äºãããšèŠãªãããŸãã次ã®ãããªç°¡åãªã¹ã¯ãªããã䜿çšããŠãUnixã§ã®cronã®å®è¡ã远跡ã§ããŸãã
#!/bin/sh
my-cron-command
exitcode=$?
if [[ $exitcode -ne 0 ]]; then
# stat-and-log is pseudocode for emitting metrics and logs
stat-and-log "failure"
else
stat-and-log "success"
fi
exit $exitcode
Unixã®å Žåãcron
stat-and-log
ã¯ã$exitcode
ãã«é¢ä¿ãªããcronåŒã³åºãããšã«1åã ãå®è¡ãããŸãããããã£ãŠããããã®ã¡ããªãã¯ã䜿çšããŠã倱æããåŒã³åºãã«é¢ããæãåçŽãªéç¥ãæŽçã§ããŸãã
倱æã«å¯Ÿããåè©Šè¡ãããã©ã«ãã§å®çŸ©ãããŠããã倱æèªäœãããŸããŸãªçç±ïŒãžã§ãã®å€±æãŸãã¯ã³ã³ãããŒã®å€±æïŒã«ãã£ãŠåŒãèµ·ããããå¯èœæ§ãããCronJob Kubernetesã®å Žåãç£èŠã¯ããã»ã©åçŽã§åçŽã§ã¯ãããŸããã
倱ææã«åèµ·åããããã«æ§æãããããšãå°éãããŸã§ã¢ããªã±ãŒã·ã§ã³ã³ã³ããã«ãããžã§ããšåæ§ã®ã¹ã¯ãªããã䜿çšãããšãcronãžã§ãã¯ãããã»ã¹ã§ã®ã¡ããªãã¯ãšãã°ãçæãã倱æãããšãã«ã¿ã¹ã¯ãå®è¡ããããšBackoffLimitãïŒæ倧åè©Šè¡åæ°ïŒããããã£ãŠãåé¡ã®åå ãç¹å®ããããšããéçºè ã¯ãå€ãã®äžèŠãªããŽãããæŽçããå¿ èŠããããŸããããã«ãæåã®å€±æã«å¿çããã·ã§ã«ã¹ã¯ãªããããã®ã¢ã©ãŒãã¯ãã¢ããªã±ãŒã·ã§ã³ã³ã³ãããããèªäœã§ã¿ã¹ã¯ãå埩ããŠæ£åžžã«å®äºããããšãã§ããããããã以äžã®ã¢ã¯ã·ã§ã³ã«åºã¥ãããšãã§ããªãéåžžã®ãã€ãºã§ããå¯èœæ§ããããŸãã
ã¢ã©ãŒãã¯ãã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¬ãã«ã§ã¯ãªãããžã§ãã¬ãã«ã§å®è£ ã§ããŸãããã®ããã«ã
kube_job_status_failed
ãããªã©ããžã§ãã®å€±æã«é¢ããAPIã¬ãã«ã®ã¡ããªãã¯ã䜿çšã§ããŸãkube-state-metrics
ããã®ã¢ãããŒãã®æ¬ ç¹ã¯ããžã§ãããæçµçãªé害段éãã«éããŠå¶éBackoffLimit
ã«éããåŸã«ã®ã¿ãåœçŽã®ãšã³ãžãã¢ãåé¡ã«æ°ä»ããšããããšã§ããããã¯ãã¢ããªã±ãŒã·ã§ã³ã³ã³ããã®æåã®é害ãããã¯ããã«é
ãçºçããå¯èœæ§ããããŸãã
CronJob'
å€§å¹ ãªéå§é 延ãšåèµ·åãµã€ã¯ã«ã«ãããè¿œå ã®é 延ãçºçããKubernetesCronJobã®åå®è¡ã劚ããããå¯èœæ§ããããŸããé »ç¹ã«åŒã³åºãããCronJobã®å ŽåããŸãã¯å®è¡æéãã¢ã€ãã«æéãããå€§å¹ ã«é·ãCronJobã®å Žåããã®è¿œå ã®é 延ã«ããã次ã«ã¹ã±ãžã¥ãŒã«ãããåŒã³åºãã§åé¡ãçºçããå¯èœæ§ããããŸãã CronJobã«åæå®è¡
ConcurrencyPolicy: Forbid
ãçŠæ¢ããããªã·ãŒãããå Žåãé
延ã«ãããå°æ¥ã®åŒã³åºããæéã©ããã«å®äºãããé
延ããŸãã
ç¹å®ã®1æéããšã®CronJobã§startingDeadlineSecondsãè¶ ããã¿ã€ã ã©ã€ã³ã®äŸïŒcronjobcontrollerã®èŠ³ç¹ããïŒïŒã¹ã±ãžã¥ãŒã«ãããéå§ãã¹ããããã次ã®ã¹ã±ãžã¥ãŒã«ãããæéãŸã§åŒã³åºãããŸãã
CronJobãåŒã³åºããå®å šã«ã¹ãããã§ãããããããäžå¿«ãªã·ããªãªããããŸãïŒLyftã§çºçããŸããïŒ
startingDeadlineSeconds
ãããã¯ãCronJobãã€ã³ã¹ããŒã«ãããŠããå Žåã§ãããã®ã·ããªãªã§ã¯ãèµ·åé
延ããè¶
ããstartingDeadlineSeconds
ãšãCronJobã¯å®å
šã«èµ·åãã¹ãããããŸãã
ããã«ã
ConcurrencyPolicy
CronJobãã«èšå®ãããŠããå ŽåForbid
ãåã®åŒã³åºãã®restart-on-failure-cycleã次ã®CronJobåŒã³åºãã«å¹²æžããå¯èœæ§ããããŸãã
å®äžçã®æ¡ä»¶ã§KubernetesCronJobãæäœããéã®åé¡
ç¹°ãè¿ãã®ã«ã¬ã³ããŒã¿ã¹ã¯ãKubernetesã«ç§»è¡ãå§ããŠä»¥æ¥ãCronJobã¡ã«ããºã ãå€æŽããã«äœ¿çšãããšãéçºè ã®èŠ³ç¹ããããã©ãããã©ãŒã ããŒã ã®èŠ³ç¹ããããäžå¿«ãªç¬éãçºçããããšãããã£ãŠããŸããæ®å¿µãªããã圌ãã¯ç§ãã¡ãæåã«KubernetesCronJobãéžãã å©ç¹ãšå©ç¹ãåŠå®ãå§ããŸãããéçºè ããã©ãããã©ãŒã ããŒã ããCronJobã掻çšããè€éãªã©ã€ããµã€ã¯ã«ãç解ããããã«å¿ èŠãªããŒã«ãèªç±ã«äœ¿çšã§ããªãããšã«ããã«æ°ä»ããŸããã
éçºè ã¯CronJobãå©çšããŠæ§æããããšããŸãããããã®çµæã次ã®ãããªå€ãã®èŠæ ã質åãå¯ããããŸããã
- cronãæ©èœããªãã®ã¯ãªãã§ããïŒ
- cronãæ©èœããªããªã£ãããã§ããå®éã«å®è¡ãããŠããããšãã©ã®ããã«ç¢ºèªã§ããŸããïŒ
- cronãæ©èœããŠããªãããšãç¥ããªãã£ãã®ã§ããã¹ãŠåé¡ãªããšæããŸããã
- æ¬ èœããŠããcronããä¿®æ£ãããã«ã¯ã©ãããã°ããã§ããïŒSSHãã°ã€ã³ã ãã§ã³ãã³ããèªåã§å®è¡ããããšã¯ã§ããŸããã
- ãã®cronãXããYãŸã§ã®è€æ°ã®å®è¡ãèŠéããããã«èŠããçç±ãæããŠãã ããã
- XïŒå€æ°ïŒã®cronããããããããã«ç¬èªã®éç¥ããããããããã¹ãŠãç¶æããã®ã¯ããªãé¢åã§å°é£ã«ãªããŸãã
- ãããããžã§ãããµã€ãã«ãŒ-ããã¯ã©ã®ãããªãã³ã»ã³ã¹ã§ããïŒ
ãã©ãããã©ãŒã ããŒã ãšããŠã次ã®ãããªè³ªåã«çããããšãã§ããŸããã§ããã
- Kubernetes cronãã©ãããã©ãŒã ã®ããã©ãŒãã³ã¹ãå®éåããæ¹æ³ã¯ïŒ
- è¿œå ã®CronJobãæå¹ã«ãããšãKubernetesç°å¢ã«ã©ã®ãããªåœ±é¿ããããŸããïŒ
- Kubernetes CronJob' ( multi-tenant) single-tenant cron' Unix?
- Service-Level-Objectives (SLOs â ) ?
- , , , ?
CronJobã®ã¯ã©ãã·ã¥ã®ãããã°ã¯ç°¡åãªäœæ¥ã§ã¯ãããŸãããé害ãçºçããå ŽæãšèšŒæ ãæ¢ãå Žæãç解ããã«ã¯ãå€ãã®å ŽåãçŽæãå¿ èŠã§ãããããã®æããããååŸããã®ãéåžžã«é£ããå ŽåããããŸããããšãã°ã
cronjobcontroller'
é«ã¬ãã«ã®è©³çŽ°ãæå¹ã«ãªã£ãŠããå Žåã«ã®ã¿èšé²ããããã°ãªã©ã§ããããã«ããã¬ãŒã¹ã¯äžå®æéåŸã«åçŽã«æ¶ããããšããããŸããããã«ããããããã°ã¯ã²ãŒã ãKick a molãïŒããã«ã€ããŠ-çŽTranslãïŒãšåæ§ã«ãªããŸããããšãã°ãCronJob'ovãJob'ovãPod'ovã®Kubernetesã€ãã³ãããã©ã«ãã§ã¯1æéã ãä¿æãããŸãããããã®æ¹æ³ã¯ã©ãã䜿ããããããã©ãããã©ãŒã äžã®CronJobã®æ°ãå¢ããã«ã€ããŠããµããŒãã®é¢ã§ããŸãæ¡åŒµã§ãããã®ã¯ãããŸããã
ãŸããæã Kubernetesã ãå®è¡ãéããåæ°ãå€ããããšãCronJobã®å®è¡ãåæ¢ããŸãããã®å Žåãæåã§åèµ·åããå¿ èŠããããŸããã§ã¯å®éã®ç掻ãããã¯ãã¯ããã«é »ç¹ã«ããªããæ³åãããããããªãããçºçããæåã§åé¡ãæ¯åä¿®æ£ããå¿ èŠæ§ãéåžžã«èŠãããªããŸãã
ããã§ãå¿ãããããžã§ã¯ãã§KubernetesCronJobã䜿çšãããšãã«çºçããæè¡çããã³éçšäžã®åé¡ã«ã€ããŠè©³ãã説æããŸããã第2éšã§ã¯ãã¹ã¿ãã¯å ã®Kubernetesãæé€ãã䜿ãããããåäžãããCronJobã®ä¿¡é Œæ§ãåäžãããæ¹æ³ã«ã€ããŠèª¬æããŸãã
ããŒã2ãã¯ããã«
Kubernetes CronJobã¯ãå€æŽãããŠããªãã®ã§ãUnixã®å¯Ÿå¿ãããã®ã®åçŽã§äŸ¿å©ãªä»£æ¿åã«ã¯ãªãåŸãªãããšãæããã«ãªããŸããããã¹ãŠã®ã¯ããŒã³ãèªä¿¡ãæã£ãŠKubernetesã«è»¢éããã«ã¯ãCronJobã®æè¡çãªæ¬ ç¹ãåãé€ãã ãã§ãªãããããã®äœ¿ãããããåäžãããå¿ èŠããããŸãããããªãã¡ïŒ
1ãéçºè ã®è©±ãèããŠã圌ããæãå¿é ããŠããã¯ããŒã³ã«ã€ããŠã®è³ªåã«å¯Ÿããçããç解ããŸããäŸïŒç§ã®cronã¯éå§ãããŸãããïŒã¢ããªã±ãŒã·ã§ã³ã³ãŒãã¯å®è¡ãããŸãããïŒèµ·åã¯æåããŸãããïŒ cronã¯ã©ã®ãããå®è¡ãããŸãããïŒ ïŒã¢ããªã±ãŒã·ã§ã³ã³ãŒãã«ã¯ã©ã®ãããæéãããããŸãããïŒïŒ 2ãCronJobãããç解ããããããã©ã€ããµã€ã¯ã«ãããééçã«ãããã©ãããã©ãŒã ãšã¢ããªã±ãŒã·ã§ã³ã®å¢çãæ確ã«ããããšã§ã
ãã©ãããã©ãŒã ã®ã¡ã³ããã³ã¹ãç°¡çŽ åããŸãã
3.ãã©ãããã©ãŒã ã«æšæºã®ã¡ããªãã¯ãšã¢ã©ãŒããè¿œå ããŠãã«ã¹ã¿ã ã¢ã©ãŒãæ§æã®éãæžãããéçºè ãäœæããã³ç¶æããå¿ èŠã®ããéè€ããcronãã€ã³ãã£ã³ã°ã®æ°ãæžãããŸãã
4.ç°¡åãªã¯ã©ãã·ã¥ãªã«ããªãšæ°ããCronJobæ§æã®ãã¹ãã®ããã®ããŒã«ãéçºããŸãã
5.ä¿®æ£ããããã«æåã®ä»å ¥ãå¿ èŠãšãã1ã€ã®é倧ãªé害ã·ããªãªïŒstartingDeadlineSecondsãèšå®ãããŠããªãå ŽåïŒã§ã¯ã©ãã·ã¥ãåŒãèµ·ããTooManyMissedStartsãã°ãªã©ãKubernetesã®é·å¹Žã®æè¡çåé¡ãä¿®æ£ããŸãã
決å®
ããããã¹ãŠã®åé¡ã次ã®ããã«è§£æ±ºããŸããã
- (observability). CronJob', (Service Level Objectives, SLOs) .
- CronJob' « » Kubernetes.
- Kubernetes.
CronJob'
ç¹å®ã®cronãžã§ãç£èŠããããã®ãã©ãããã©ãŒã ã«ãã£ãŠçæãããããã·ã¥ããŒãã®äŸ
ïŒç§ãã¡ã¯Kubernetesã¹ã¿ãã¯ã«æ¬¡ã®ã¡ããªãã¯ãè¿œå ãããïŒåœŒãã¯Lyftå ã®ãã¹ãŠã®cronãžã§ãã®ããã«å®çŸ©ãããŠããïŒ
1
started.count
-ãã®ã«ãŠã³ã¿ã¯ããcronãžã§ããåŒã³åºããããšãã«ã¢ããªã±ãŒã·ã§ã³ã³ã³ãããæåã«èµ·åãããšãã«ã€ã³ã¯ãªã¡ã³ãã ãã¢ããªã±ãŒã·ã§ã³ã³ãŒãã¯å®è¡ãããŸãããïŒããšãã質åã«çããã®ã«åœ¹ç«ã¡ãŸãã "ã
2.
{success, failure}.count
-ãããã®ã«ãŠã³ã¿ããããŠããç¹å®ã®cronãžã§ãã³ãŒã«ãå°éãããšãã«ã€ã³ã¯ãªã¡ã³ãã端æ«ã®ç¶æ
ãïŒã§ããããšãä»äºããã®ä»äºããŠãçµäºããjobcontroller
ããšãå®è¡ããããã«ããã¯ãè©Šè¡ãïŒã圌ãã¯è³ªåã«çããŸãããæã¡äžãã¯æåããŸãããïŒ "ã
3.-
scheduling-decision.{invoke, skip}.count
ãããã®ã«ãŠã³ã¿ãŒcronjobcontroller
CronJobãåŒã³åºããšãã«è¡ããã決å®ã«ã€ããŠç¥ãããšãã§ããŸããç¹ã«ã次skip.count
ã®è³ªåã«çããã®ã«åœ¹ç«ã¡ãŸããããªãç§ã®cronãæ©èœããªãã®ã§ããïŒ"ã次ã®ã©ãã«ã¯ãã®ãã©ã¡ãŒã¿ãšããŠæ©èœããŸãreason
ã
-
reason = concurrencyPolicy
-cronjobcontroller
ãã以å€ã®å Žåã¯ããããç Žããããcronãžã§ããžã®åŒã³åºããéããŸããConcurrencyPolicy
ã -
reason = missedDeadline
-cronjobcontroller
æå®ãããåŒã³åºããŠã£ã³ããŠãèŠéãããããCronJobã®åŒã³åºããæåŠããŸãã.spec.startingDeadlineSeconds
ã -
reason = error
CronJobãåŒã³åºãããšãããšãã«çºçããä»ã®ãã¹ãŠã®ãšã©ãŒã«å ±éã®ãã©ã¡ãŒã¿ãŒã§ãã
4.-
app-container-duration.seconds
ãã®ã¿ã€ããŒã¯ãã¢ããªã±ãŒã·ã§ã³ã³ã³ããã®å¯¿åœã枬å®ããŸããããã¯ã次ã®è³ªåã«çããã®ã«åœ¹ç«ã¡ãŸãããã¢ããªã±ãŒã·ã§ã³ã³ãŒãã¯ã©ã®ãããå®è¡ãããŸãããïŒ "ããã®ã¿ã€ããŒã§ã¯ããããã®ã¹ã±ãžã¥ãŒãªã³ã°ããµã€ãã«ãŒã³ã³ããã®èµ·åãªã©ã«å¿
èŠãªæéã¯ããã©ãããã©ãŒã ããŒã ã®è²¬ä»»ã§ãããèµ·åé
延ã«å«ãŸããŠãããããæå³çã«å«ããŠããŸããã
5.-
start-delay.seconds
ãã®ã¿ã€ããŒã¯éå§é
延ã枬å®ããŸãããã®ã¡ããªãã¯ããã©ãããã©ãŒã å
šäœã§éèšãããšããããç¶æãããšã³ãžãã¢ã¯ããã©ãããã©ãŒã ã®ããã©ãŒãã³ã¹ãè©äŸ¡ãç£èŠã調æŽããã ãã§ãªããèµ·åé
延ãæ倧cronã¹ã±ãžã¥ãŒã«é »åºŠãªã©ã®ãã©ã¡ãŒã¿ãŒã®SLOã決å®ããããã®åºç€ãšããŠãæ©èœããŸãã
ãããã®ææšã«åºã¥ããŠãããã©ã«ãã®ã¢ã©ãŒããäœæããŸããã次ã®å Žåã«éçºè ã«éç¥ããŸãã
- 圌ãã®CronJobã¯ã¹ã±ãžã¥ãŒã«ã©ããã«éå§ãããŸããã§ããïŒ
rate(scheduling-decision.skip.count) > 0
ïŒ; - 圌ãã®CronJobã¯å€±æããŸããïŒ
rate(failure.count) > 0
ïŒã
éçºè ã¯ãKubernetesã®ã¯ããŒã³ã«å¯ŸããŠç¬èªã®ã¢ã©ãŒããšã¡ããªãã¯ãå®çŸ©ããå¿ èŠããªããªããŸããããã©ãããã©ãŒã ã¯æ¢è£œã®å¯Ÿå¿ç©ãæäŸããŸãã
å¿ èŠã«å¿ããŠcronãå®è¡ãã
kubectl create job test-job --from=cronjob/<your-cronjob>
å
éšCLIããŒã«ã«
é©åãããŸãããLyftã®ãšã³ãžãã¢ã¯ãããã䜿çšããŠKubernetesã®ãµãŒãã¹ãšå¯Ÿè©±ããå¿
èŠã«å¿ããŠCronJobãåŒã³åºããŸãã
- æç¶çãªCronJobã¯ã©ãã·ã¥ããã®å埩ã
- runtime- , 3:00 ( , CronJob', Job' Pod' ), â , ;
- runtime- CronJob' Unix cron', , .
TooManyMissedStarts
TooManyMissedStartsã®ãã° ãä¿®æ£ãã 100åé£ç¶ããŠéå§ãéããåŸã«CronJobãããã³ã°ãããªãããã«ããŸããããã®ãããã䜿çšãããšãæåã§ä»å ¥ããå¿ èŠããªããªãã ãã§ãªããæéãè¶ ãããšãã«å®éã«è¿œè·¡ããããšãã§ããŸãããããVallery Lanceyèšèšããã®ããããæ§ç¯ããããã®ãã Wanielistaã¢ã«ãŽãªãºã ã®èšèšãæ¯æŽããããã«ããã®ããããã¡ã€ã³ã®Kubernetesãã©ã³ãã«æäŸããããã«PRãéå§ããŸããïŒãã ããæ¡çšãããããšã¯ãªããéã¢ã¯ãã£ãã®ããã«çµäºããŸãã-çŽTranslãïŒã
startingDeadlineSeconds
cronã¢ãã¿ãªã³ã°ã®å®è£
Kubernetes CronJobã®ã©ã€ããµã€ã¯ã«ã®ã©ã®æ®µéã§ãã¡ããªãã¯ããšã¯ã¹ããŒãããããã®ã¡ã«ããºã ãè¿œå ããŸãã
cronã¹ã±ãžã¥ãŒã«ã«äŸåããªãã¢ã©ãŒã
éããcronåŒã³åºãéç¥ãå®è£ ããäžã§æãé£ããéšåã¯ãã¹ã±ãžã¥ãŒã«ãåŠçããããšã§ãïŒcrontab.guruã¯ãããã解èªããã®ã«åœ¹ç«ã¡ãŸããïŒãããšãã°ã次ã®ã¹ã±ãžã¥ãŒã«ã«ã€ããŠèããŠã¿ãŸãã
# 5
*/5 * * * *
ãã®cronã®ã«ãŠã³ã¿ãŒã¯ãçµäºãããã³ã«ã€ã³ã¯ãªã¡ã³ãã§ããŸãïŒãŸãã¯cronãã€ã³ãã£ã³ã°ã䜿çšããŸãïŒã次ã«ãéç¥ã·ã¹ãã ã§ããéå»60åéãèŠãŠãã«ãŠã³ã¿ãŒã®å¢å ã12æªæºãã©ãããç¥ãããŠãã ããããšãã圢åŒã®æ¡ä»¶åŒãèšè¿°ã§ããŸããåé¡ã¯è§£æ±ºããŸããããïŒ
ããããã¹ã±ãžã¥ãŒã«ã次ã®ããã«ãªã£ãŠããå Žåã¯ã©ããªããŸããã
# 9 17
# .
# , (9-17, -)
0 9â17 * * 1â5
ãã®å Žåãæ¡ä»¶ãããããåãå¿ èŠããããŸãïŒãã ããã·ã¹ãã ã«å¶æ¥æéã®ã¿ã®éç¥æ©èœãããå ŽåããããŸããïŒïŒããšã¯ããããããã®äŸã¯ãéç¥ãcronã¹ã±ãžã¥ãŒã«ã«ãã€ã³ãããããšã«ã¯ããã€ãã®æ¬ ç¹ãããããšã瀺ããŠããŸãã
- ã¹ã±ãžã¥ãŒã«ãå€æŽããå Žåã¯ãéç¥ããžãã¯ãå€æŽããå¿ èŠããããŸãã
- äžéšã®cronã¹ã±ãžã¥ãŒã«ã§ã¯ãæç³»åã䜿çšããŠè€è£œããããã«éåžžã«è€éãªã¯ãšãªãå¿ èŠã§ãã
- 誀æ€ç¥ãæå°éã«æããããã«ãæ£ç¢ºã«æéå ã«äœæ¥ãéå§ããªãã¯ããŒã³ã«ã¯ãããçš®ã®ãåŸ æ©æéããå¿ èŠã§ãã
ã¹ããã2ã ãã§ã¯ããã©ãããã©ãŒã äžã®ãã¹ãŠã®ã¯ããŒã³ã«å¯ŸããŠããã©ã«ãã§éç¥ãçæããããšã¯éåžžã«å°é£ãªã¿ã¹ã¯ã«ãªããŸããã¹ããã3ã¯ãèµ·åé 延ãéèŠãªèŠçŽ ã§ããKubernetesCronJobã®ãããªåæ£ãã©ãããã©ãŒã ã«ç¹ã«é¢ä¿ããããŸããããã«ããããããã³ã¹ã€ãããã䜿çšãããœãªã¥ãŒã·ã§ã³ããããŸããããã«ãããéç¥ãcronã®ã¹ã±ãžã¥ãŒã«ã«ãã€ã³ãããå¿ èŠããããŸãããŸããç°åžžæ€åºã¢ã«ãŽãªãºã ã§ã¯ããã¬ãŒãã³ã°ãå¿ èŠã§ãæ°ããCronJobããã®å€æŽã«å¯ŸããŠããã«ã¯æ©èœããŸãããã¿ã€ã ããŒãã«ã
åé¡ã調ã¹ãå¥ã®æ¹æ³ã¯ãèªåèªèº«ã«åããããããšã§ããcronãéå§ãããã¹ãã ã£ãã®ã«ãéå§ãããªãã£ããšã¯ã©ãããæå³ã§ããïŒ
Kubernetesã§ã¯ããã°ãå¿ããå Žå
cronjobcontroller'
ãŸãã¯ãã³ã³ãããŒã«ãã¬ãŒã³èªäœã®èœäžã®å¯èœæ§ïŒãã ããã¯ã©ã¹ã¿ãŒã®ç¶æ
ãæ£ãã远跡ãããšããã«ç¢ºèªã§ããŸãïŒ-ããã¯cronjobcontroller
ãCronJobãïŒcronã®ã¹ã±ãžã¥ãŒã«ã«åŸã£ãŠïŒåŒã³åºãå¿
èŠãããããšãè©äŸ¡ããã³æ±ºå®ããããšãæå³ããŸãããäœããã®çç±ã§æ
æã«ããªãããšã«ããçç±ã§ã
ããªãã¿ã®ããã«èãããŸããïŒããã¯ãŸãã«ç§ãã¡ã®ã¡ããªãã¯ãè¡ãããš
scheduling-decision.skip.count
ã§ãïŒããã§ãå€æŽã远跡ãrate(scheduling-decision.skip.count)
ãŠãCronJobãããªã¬ãŒãããã¹ãã§ããããšããŠãŒã¶ãŒã«éç¥ããå¿
èŠããããŸãããããªã¬ãŒãããŸããã§ããã
ãã®ãœãªã¥ãŒã·ã§ã³ã¯ãcronã¹ã±ãžã¥ãŒã«ãéç¥èªäœããåãé¢ããããã€ãã®å©ç¹ãæäŸããŸãã
- ããã§ãã¹ã±ãžã¥ãŒã«ãå€æŽãããšãã«ã¢ã©ãŒããåæ§æããå¿ èŠããªããªããŸããã
- è€éãªæéã®èŠæ±ãæ¡ä»¶ã¯å¿ èŠãããŸããã
- ãã©ãããã©ãŒã äžã®ãã¹ãŠã®CronJobã®ããã©ã«ãã¢ã©ãŒããç°¡åã«çæã§ããŸãã
ããããåè¿°ã®ä»ã®æç³»åããã³ã¢ã©ãŒããšçµã¿åããããšãCronJobã®ç¶æ ã®ããå®å šã§ç解ããããå³ãäœæããã®ã«åœ¹ç«ã¡ãŸãã
éå§é 延ã¿ã€ããŒã®å®è£
CronJobã®ã©ã€ããµã€ã¯ã«ã¯è€éã§ããããããã®ã¡ããªãã¯ã確å®ãã€æ£ç¢ºã«æž¬å®ããã«ã¯ãã¹ã¿ãã¯äžã®ããŒã«ãããã®é 眮ã®ç¹å®ã®ãã€ã³ããæ éã«æ€èšããå¿ èŠããããŸããããã®çµæããã¹ãŠã¯2ã€ã®æç¹ãä¿®æ£ããããšã«ãªããŸããã
- T1ïŒcronããã€éå§ããå¿ èŠããããïŒã¹ã±ãžã¥ãŒã«ã«åŸã£ãŠïŒã
- T2ïŒã¢ããªã±ãŒã·ã§ã³ã³ãŒããå®éã«å®è¡ãéå§ãããšãã
ãã®å Žå
start delay
ïŒéå§é
延ïŒ= 2 â 1
ãç¬éT1ãä¿®æ£ããããã«ãã®cronåŒã³åºãããžãã¯ã«ã³ãŒããå«ããŸããcronjobcontroller'
ãCronJobãåŒã³åºããããšã.metadata.Annotation
ã«cronjobcontroller
äœæããJobãªããžã§ã¯ãã®ããã«ãäºæ³ãããéå§æéãèšé²ããŸããéåžžã®ãªã¯ãšã¹ãã䜿çšããŠãä»»æã®APIã¯ã©ã€ã¢ã³ãã䜿çšããŠååŸã§ããããã«ãªããŸããGET Job
ã
T2ã§ã¯ãã¹ãŠãããè€éã§ããããšãå€æããŸãããå€ãã§ããã ãå®éã«è¿ã¥ããå¿ èŠããããããT2ã¯ãã¢ããªã±ãŒã·ã§ã³ãå«ãã³ã³ãããŒãåããŠèµ·åãããç¬éãšäžèŽããå¿ èŠããããŸããããããã§T2ãæã£ãå Žåã³ã³ããã®èµ·åæïŒåèµ·åãå«ãïŒããã®å Žåã®èµ·åã®é 延ã«ã¯ãã¢ããªã±ãŒã·ã§ã³èªäœã®å®è¡æéãå«ãŸããŸãããããã£ãŠã
.metadata.Annotation
ç¹å®ã®ãžã§ãã®ã¢ããªã±ãŒã·ã§ã³ã³ã³ãããæåã«ã¹ããŒã¿ã¹ãåãåã£ãããšãããã£ããšãã¯ãã€ã§ããå¥ã®ãžã§ããªããžã§ã¯ããå²ãåœãŠãããšã«ããŸããRunning
ããããã£ãŠãæ¬è³ªçã«ãåæ£ããã¯ãäœæããããã®ãžã§ãã®ã¢ããªã±ãŒã·ã§ã³ã³ã³ããã®å°æ¥ã®éå§ã¯ç¡èŠãããŸããïŒæåã®éå§ã®ç¬éã®ã¿ãä¿åãããŸããïŒã
çµæ
æ°ããæ©èœãå±éããŠãã°ãä¿®æ£ããåŸãéçºè ããå€ãã®è¯å®çãªãã£ãŒãããã¯ãåãåããŸãããçŸåšãéçºè ã¯KubernetesCronJobãã©ãããã©ãŒã ã䜿çšããŠããŸãã
- ç¬èªã®ç£èŠããŒã«ãã¢ã©ãŒãã«ã€ããŠå°æããå¿ èŠããªããªããŸããã
- , CronJob' , .. alert' , ;
- CronJob' , CronJob' « »;
- (
app-container-duration.seconds
).
ããã«ããã©ãããã©ãŒã ã¡ã³ããã³ã¹ãšã³ãžãã¢ã¯ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãšãã©ãããã©ãŒã ããã©ãŒãã³ã¹ã枬å®ããããã®æ°ãããã©ã¡ãŒã¿ïŒéå§é 延ïŒãå©çšã§ããããã«ãªããŸããã
æåŸã«ïŒãããŠããããç§ãã¡ã®æ倧ã®åå©ïŒãCronJobïŒããã³ãã®ç¶æ ïŒãããééçã§è¿œè·¡å¯èœã«ããããšã§ãéçºè ãšãã©ãããã©ãŒã ãšã³ãžãã¢ã®ãããã°ããã»ã¹ãå€§å¹ ã«ç°¡çŽ åããŸãããåãããŒã¿ã䜿çšããŠäžç·ã«ãããã°ã§ããããã«ãªã£ããããéçºè ãèªåã§åé¡ãèŠã€ãããã©ãããã©ãŒã ãæäŸããããŒã«ã䜿çšããŠåé¡ã解決ããããšããããããŸãã
çµè«
åæ£ãããã¹ã±ãžã¥ãŒã«ãããã¿ã¹ã¯ã®èª¿æŽã¯ç°¡åã§ã¯ãããŸãããCronJob Kubernetesã¯ããããæŽçãã1ã€ã®æ¹æ³ã«ãããŸãããCronJobã¯çæ³ããã¯ã»ã©é ããã®ã®ãã°ããŒãã«ãããžã§ã¯ãã§äœæ¥ããèœåã¯ååã«ãããŸãããã¡ããã芳å¯å¯èœæ§ã®åäžãé害ã®åå ãšè©³çŽ°ã®ç解ã䜿ãããããåäžãããããŒã«ã®è¿œå ãªã©ãæéãšåŽåããããŠæ¹åããæºåãã§ããŠããå Žåã§ãã
泚ïŒCronJobã®æ¬ ç¹ãä¿®æ£ããæŽæ°ãããããŒãžã§ã³ãGAã«å€æããããã®ãªãŒãã³ãªKubernetesæ¡åŒµææ¡ïŒKEPïŒããããŸãããã®äžé£ã®èšäºã®ã¬ãã¥ãŒã«ååããŠ
ãããRithuJohnãScott LauãScarlett PerryãJulien SillandãTomWanielistaã«æè¬ããŸãã
翻蚳è ããã®PS
ç§ãã¡ã®ããã°ãèªãã§ãã ããïŒ