
Radar Technologyã®èšäºã§è¿°ã¹ãããã«ãLamodaã¯ãã€ã¯ããµãŒãã¹ã¢ãŒããã¯ãã£ã«ç©æ¥µçã«ç§»è¡ããŠããŸãã ã»ãšãã©ã®ãµãŒãã¹ã¯Helmã䜿çšããŠããã±ãŒãžåãããKubernetesã«å±éãããŸãã ãã®ã¢ãããŒãã¯ã99ïŒ
ã®ã±ãŒã¹ã§ç§ãã¡ã®ããŒãºãå®å
šã«æºãããŠããŸãã ç¹å®ã®ã€ãã³ãã®ããã¯ã¢ãããŸãã¯ãµãŒãã¹ã®æŽæ°ãæ§æããå¿
èŠãããå Žåãªã©ãæšæºã®Kubernetesæ©èœãååã§ãªãå Žåã1ïŒ
ãæ®ããŸãã ãã®åé¡ã解決ããã«ã¯ãæŒç®åãã¿ãŒã³ã䜿çšããŸãã ãã®ã·ãªãŒãºã®èšäºã§ã¯ãI-Lamodaã®RïŒDããŒã ã®éçºè
ã§ããGrigory Mikhalkinãã Operator Frameworkã䜿çšããŠK8sãªãã¬ãŒã¿ãŒãéçºããçµéšããåŠãã æèšã«ã€ããŠèª¬æããŸã ã
æŒç®åãšã¯äœã§ããïŒ
Kubernetesã®æ©èœãæ¡åŒµãã1ã€ã®æ¹æ³ã¯ãç¬èªã®ã³ã³ãããŒã©ãŒãäœæããããšã§ãã Kubernetesã®äž»ãªæœè±¡åã¯ããªããžã§ã¯ããšã³ã³ãããŒã©ãŒã§ãã ãªããžã§ã¯ãã¯ãã¯ã©ã¹ã¿ãŒã®æãŸããç¶æ
ãèšè¿°ããŸãã ããšãã°ã Podã¯èµ·åããå¿
èŠã®ããã³ã³ãããŒãšèµ·åãã©ã¡ãŒã¿ãŒãèšè¿°ãã ReplicaSetãªããžã§ã¯ãã¯ãã®Podã®ã¬ããªã«ãããã€èµ·åããå¿
èŠããããã瀺ããŸãã ã³ã³ãããŒã©ãŒã¯ãªããžã§ã¯ãã®èª¬æã«åºã¥ããŠã¯ã©ã¹ã¿ãŒã®ç¶æ
ãå¶åŸ¡ããŸããäžèšã®å Žåã ReplicationControllerã¯ReplicaSetã§æå®ãããPodã¬ããªã«ã®æ°ããµããŒãããŸãã æ°ããã³ã³ãããŒã©ãŒã®å©ããåããŠãã€ãã³ãéç¥ã®éä¿¡ãé害ããã®å埩ã ãµãŒãããŒãã£ã®ãªãœãŒã¹ã®ç®¡çãªã©ã®è¿œå ããžãã¯ãå®è£
ã§ããŸãã
ãªãã¬ãŒã¿ãŒã¯ããµãŒãããŒãã£ãªãœãŒã¹ãæäŸãã1ã€ä»¥äžã®ã³ã³ãããŒã©ãŒãå«ãkubernetesã¢ããªã±ãŒã·ã§ã³ã§ãã ãã®ã³ã³ã»ããã¯2016幎ã«CoreOSããŒã ã«ãã£ãŠèæ¡ãããæè¿ã§ã¯ããªãã¬ãŒã¿ãŒã®äººæ°ãæ¥éã«é«ãŸã£ãŠããŸãã OperatorHubã ãã§ãªãã kubedex ïŒæ¢ã«å
¬éãããŠãã100ãè¶
ããæŒç®åãæ¢ã«ãªã¹ããããŠããŸãïŒã®ãªã¹ãã§ãå¿
èŠãªæŒç®åãèŠã€ããããšãã§ããŸãã ãªãã¬ãŒã¿ãŒéçºã«ã¯ã Kubebuilder ã Operator SDK ã Metacontrollerã® 3ã€ã®äžè¬çãªããŒã«ããããŸã ã Lamodaã§ã¯ãOperator SDKã䜿çšãããããåŸã§èª¬æããŸãã
ãªãã¬ãŒã¿ãŒSDK

Operator SDKã¯ãOperator Lifecycle ManagerãšOperator Meteringã®2ã€ã®éèŠãªéšåãå«ãOperator Frameworkã®äžéšã§ãã
- Operator SDKã¯ã ã³ã³ãããŒã©ãŒéçºçšã®äžè¬çãªã©ã€ãã©ãªãŒã§ããcontroller-runtimeã®ã©ãããŒïŒããã¯client-goã®ã©ãããŒã§ãïŒãE2Eãã¹ããèšè¿°ããããã®ã³ãŒããžã§ãã¬ãŒã¿ãŒ+ãã¬ãŒã ã¯ãŒã¯ã§ãã
- Operator Lifecycle Manager-æ¢åã®ãªãã¬ãŒã¿ãŒã管çããããã®ãã¬ãŒã ã¯ãŒã¯ã ãªãã¬ãŒã¿ãŒããŸã³ãã¢ãŒãã«å
¥ãããæ°ããããŒãžã§ã³ãããŒã«ã¢ãŠããããç¶æ³ã解決ããŸãã
- ãªãã¬ãŒã¿ãŒã¡ãŒã¿ãªã³ã° -ååã瀺ãããã«ããªãã¬ãŒã¿ãŒã®äœæ¥ã«é¢ããããŒã¿ãåéãããããã«åºã¥ããŠã¬ããŒããçæããããšãã§ããŸãã
æ°ãããããžã§ã¯ããäœæãã
äŸãšããŠã¯ããªããžããªå
ã®èšå®ã䜿çšããŠãã¡ã€ã«ãç£èŠããæŽæ°ããããšæ°ããèšå®ã䜿çšããŠãµãŒãã¹ã®å±éãåéãããªãã¬ãŒã¿ãŒããããŸãã å®å
šãªãµã³ãã«ã³ãŒãã¯ãã¡ãããå
¥æã§ããŸã ã

æ°ããæŒç®åã䜿çšããŠãããžã§ã¯ããäœæããŸãã
operator-sdk new config-monitor
ã³ãŒããžã§ãã¬ãŒã¿ãŒã¯ãå²ãåœãŠãããåå空éã§äœæ¥ãããªãã¬ãŒã¿ãŒã®ã³ãŒããäœæããŸã ã ãšã©ãŒã®å Žåãåãåå空éå
ã§åé¡ãåé¢ãããããããã®ã¢ãããŒãã¯ã¯ã©ã¹ã¿ãŒå
šäœãžã®ã¢ã¯ã»ã¹ãèš±å¯ãããããæãŸããæ¹æ³ã§ãã --cluster-scopedã远å ãããšã cluster-wideãªãã¬ãŒã¿ãŒãçæã§ããŸãã æ¬¡ã®ãã£ã¬ã¯ããªã¯ãäœæããããããžã§ã¯ãå
ã«é
眮ãããŸãã
- cmd-
Manageråæåããã³èµ·åãããmain packageãå«ãŸããŠããŸãã - deploy-RBACãªãã¬ãŒã¿ãŒã®ã»ããã¢ããã«å¿
èŠãªãªãã¬ãŒã¿ãŒãCRDãããã³ãªããžã§ã¯ãã®ã¹ããŒãã¡ã³ããå«ãŸããŠããŸãã
- pkg-æ°ãããªããžã§ã¯ããšã³ã³ãããŒã©ãŒã®ã¡ã€ã³ã³ãŒãã瀺ããŸãã
cmd/manager/main.goãã¡ã€ã«ã1ã€ãããããŸããã
ã³ãŒãã¹ãããã // Become the leader before proceeding err = leader.Become(ctx, "config-monitor-lock") if err != nil { log.Error(err, "") os.Exit(1) } // Create a new Cmd to provide shared dependencies and start components mgr, err := manager.New(cfg, manager.Options{ Namespace: namespace, MetricsBindAddress: fmt.Sprintf("%s:%d", metricsHost, metricsPort), }) ... // Setup Scheme for all resources if err := apis.AddToScheme(mgr.GetScheme()); err != nil { log.Error(err, "") os.Exit(1) } // Setup all Controllers if err := controller.AddToManager(mgr); err != nil { log.Error(err, "") os.Exit(1) } ... // Start the Cmd if err := mgr.Start(signals.SetupSignalHandler()); err != nil { log.Error(err, "Manager exited non-zero") os.Exit(1) }
1è¡ç®ïŒ err = leader.Become(ctx, "config-monitor-lock") -ãªãŒããŒãéžæãããŠããŸãã ã»ãšãã©ã®ã·ããªãªã§ã¯ãåå空é/ã¯ã©ã¹ã¿ãŒã®ã¹ããŒãã¡ã³ãã®ã¢ã¯ãã£ããªã€ã³ã¹ã¿ã³ã¹ã1ã€ã ãå¿
èŠã§ãã ããã©ã«ãã§ã¯ãOperator SDKã¯ã©ã€ãæŠç¥ã«ãªãŒããŒã䜿çšããŸããæåã«èµ·åããããªãã¬ãŒã¿ãŒã®ã€ã³ã¹ã¿ã³ã¹ã¯ãã¯ã©ã¹ã¿ãŒããåé€ããããŸã§ãªãŒããŒã®ãŸãŸã§ãã
ãã®ãªãã¬ãŒã¿ãŒã€ã³ã¹ã¿ã³ã¹ããªãŒããŒã«æå®ãããåŸãæ°ããManagerãåæåãããŸãmgr, err := manager.New(...) ã 圌ã®è²¬ä»»ã¯æ¬¡ã®ãšããã§ãã
err := apis.AddToScheme(mgr.GetScheme()) -æ°ãããªãœãŒã¹ã¹ããŒã ã®ç»é²ãerr := controller.AddToManager(mgr) -ã³ã³ãããŒã©ãŒã®ç»é²ãerr := mgr.Start(signals.SetupSignalHandler()) -ã³ã³ãããŒã©ãŒãèµ·åããŠå¶åŸ¡ããŸãã
çŸæç¹ã§ã¯ãæ°ãããªãœãŒã¹ãç»é²çšã®ã³ã³ãããŒã©ãŒããããŸããã æ¬¡ã®ã³ãã³ãã䜿çšããŠãæ°ãããªãœãŒã¹ã远å ã§ããŸãã
operator-sdk add api --api-version=services.example.com/v1alpha1 --kind=MonitoredService
ãã®ã³ãã³ãã¯MonitoredServiceãªãœãŒã¹ã¹ããŒãå®çŸ©ãpkg/apisãã£ã¬ã¯ããªãŒã«è¿œå ããyamlãdeploy/crds CRDå®çŸ©ãšãšãã«deploy/crdsãŸãã æåã§çæããããã¹ãŠã®ãã¡ã€ã«ã®ãã¡ã monitoredservice_types.goã®ã¹ããŒãå®çŸ©ã®ã¿ã倿Žããå¿
èŠããããŸãã ã¿ã€ãMonitoredServiceSpecã¯ããªãœãŒã¹ã®æãŸããç¶æ
ãå®çŸ©ããŸãããŠãŒã¶ãŒããªãœãŒã¹ã®å®çŸ©ã§yamlã§æå®ãããã®ã§ãã ãªãã¬ãŒã¿ãŒã®ã³ã³ããã¹ãã§ã¯ã Sizeãã£ãŒã«ãã¯ã¬ããªã«ã®åžææ°ã決å®ãã ConfigRepoã¯çŸåšã®æ§æã®ConfigRepo瀺ããŸãã MonitoredServiceStatusã¯ããªãœãŒã¹ã®MonitoredServiceStatusç¶æ
ãæ±ºå®ããŸããããšãã°ããã®ãªãœãŒã¹ã«å±ãããããã®ååãšçŸåšã®specããããä¿åããŸãã
ã¹ããŒã ãç·šéããåŸãã³ãã³ããå®è¡ããå¿
èŠããããŸãã
operator-sdk generate k8s
deploy/crds CRDå®çŸ©ãæŽæ°ããŸãã
次ã«ããªãã¬ãŒã¿ãŒã®äž»èŠéšåã§ããã³ã³ãããŒã©ãŒãäœæããŸãã
operator-sdk add controller --api-version=services.example.com/v1alpha1 --kind=Monitor
monitor_controller.goãã¡ã€ã«ã¯ãå¿
èŠãªããžãã¯ã远å ããpkg/controller monitor_controller.goã«è¡šç€ºãããŸãã
ã³ã³ãããŒã©ãŒéçº
ã³ã³ãããŒã©ãŒã¯ããªãã¬ãŒã¿ãŒã®äž»èŠãªäœæ¥ãŠãããã§ãã ãã®å Žåã2ã€ã®ã³ã³ãããŒã©ãŒããããŸãã
- ç£èŠã³ã³ãããŒã©ãŒã¯ããµãŒãã¹æ§æã®å€æŽãç£èŠããŸãã
- ã¢ããã°ã¬ãŒãã³ã³ãããŒã©ãŒã¯ãµãŒãã¹ãæŽæ°ããç®çã®ç¶æ
ã«ç¶æããŸãã
æ¬è³ªçã«ãã³ã³ãããŒã©ãŒã¯å¶åŸ¡ã«ãŒãã§ããããµãã¹ã¯ã©ã€ããããŠããã€ãã³ãã䜿çšããŠãã¥ãŒãç£èŠããåŠçããŸãã

æ°ããã³ã³ãããŒã©ãŒãäœæããã addã¡ãœããã§ãããŒãžã£ãŒã«ãã£ãŠç»é²ãããŸãã
c, err := controller.New("monitor-controller", mgr, controller.Options{Reconciler: r})
Watchã¡ãœããã䜿çšããŠãæ°ãããªãœãŒã¹ã®äœæãŸãã¯æ¢åã®MonitoredServiceãªãœãŒã¹ã®SpecæŽæ°ã«é¢ããã€ãã³ãã«ãµãã¹ã¯ã©ã€ãããŸãã
err = c.Watch(&source.Kind{Type: &servicesv1alpha1.MonitoredService{}}, &handler.EnqueueRequestForObject{}, common.CreateOrUpdateSpecPredicate)
ã€ãã³ãã®ã¿ã€ãã¯ã srcãã©ã¡ãŒã¿ãŒãšpredicatesãã©ã¡ãŒã¿ãŒã䜿çšããŠæ§æã§ããŸãã srcã¯Sourceåã®ãªããžã§ã¯ããåãå
¥ããŸãã
Informer -ãã£ã«ã¿ãŒã«äžèŽããã€ãã³ãã«ã€ããŠapiserverã宿çã«ããŒãªã³ã°ãããã®ãããªã€ãã³ããããå Žåãã³ã³ãããŒã©ãŒã®ãã¥ãŒã«å
¥ããŸãã controller-runtimeããã¯client-go SharedIndexInformerã©ãããŒã§ããKindã¯SharedIndexInformerã©ãããŒã§ããããŸããã Informerãšã¯ç°ãªããæž¡ããããã©ã¡ãŒã¿ãŒïŒç£èŠå¯Ÿè±¡ãªãœãŒã¹ã®ã¹ããŒã ïŒã«åºã¥ããŠInformerã€ã³ã¹ã¿ã³ã¹ãåå¥ã«äœæããŸããChannel chan event.GenericEventããã©ã¡ãŒã¿ãŒãšããŠåãå
¥ãããããééããã€ãã³ãã¯ã³ã³ãããŒã©ãŒã®ãã¥ãŒã«é
眮ãããŸãã
redicatesã¯ã Predicateã€ã³ã¿ãŒãã§ãŒã¹ãæºãããªããžã§ã¯ããæåŸ
ããŸãã å®éãããã¯ã€ãã³ãçšã®è¿œå ãã£ã«ã¿ãŒã§ããããšãã°ã UpdateEventããã£ã«ã¿ãŒåŠçããå ŽåããªãœãŒã¹specè¡ããã倿Žãæ£ç¢ºã«ç¢ºèªã§ããŸãã
ã€ãã³ããå°çãããšã EventHandlerã¯ãããåãå
¥ããŸãWatchã¡ãœãããžã®2çªç®ã®åŒæ°ReconcileræåŸ
ããèŠæ±åœ¢åŒã§ã€ãã³ããã©ããããŸãïŒ
EnqueueRequestForObjectã€ãã³ããåŒãèµ·ããããªããžã§ã¯ãã®ååãšåå空éã䜿çšããŠãªã¯ãšã¹ããäœæããŸããEnqueueRequestForOwnerãªããžã§ã¯ãã®èŠªã®ããŒã¿ã䜿çšããŠãªã¯ãšã¹ããäœæããŸãã ããã¯ãããšãã°ããªãœãŒã¹å¶åŸ¡Podåé€ããPodããããã®äº€æãéå§ããå¿
èŠãããå Žåã«å¿
èŠã§ããEnqueueRequestsFromMapFunc ïŒ MapObjectã©ãããããïŒã€ãã³ããåä¿¡ããmap颿°ããã©ã¡ãŒã¿ãŒãšããŠåãåãããªã¯ãšã¹ãã®ãªã¹ããè¿ããŸãã ãã®ãã³ãã©ãå¿
èŠãªå Žåã®äŸ -ã¿ã€ããŒãããããã®ãã£ãã¯ããšã«ãå©çšå¯èœãªãã¹ãŠã®ãµãŒãã¹ã®æ°ããæ§æãåŒãåºãå¿
èŠããããŸãã
èŠæ±ã¯ã³ã³ãããŒã©ãŒãã¥ãŒã«é
眮ãããã¯ãŒââã«ãŒã®1ã€ïŒããã©ã«ãã§ã¯ã³ã³ãããŒã©ãŒã«1ã€ãããŸãïŒããã¥ãŒããã€ãã³ãããã«ãããããReconcileræž¡ããŸãã
Reconcilerã¯ãã€ãã³ãåŠçã®åºæ¬ããžãã¯ãå«ãReconcile 1ã€ã®ã¡ãœããã®ã¿ãå®è£
ããŸãã
èª¿æŽæ¹æ³ func (r *ReconcileMonitor) Reconcile(request reconcile.Request) (reconcile.Result, error) { reqLogger := log.WithValues("Request.Namespace", request.Namespace, "Request.Name", request.Name) reqLogger.Info("Checking updates in repo for MonitoredService") // fetch the Monitor instance instance := &servicesv1alpha1.MonitoredService{} err := r.client.Get(context.Background(), request.NamespacedName, instance) if err != nil { if errors.IsNotFound(err) { // Request object not found, could have been deleted after reconcile request. // Owned objects are automatically garbage collected. For additional cleanup logic use finalizers. // Return and don't requeue return reconcile.Result{}, nil } // Error reading the object - requeue the request. return reconcile.Result{}, err } // check if service's config was updated // if it was, send event to upgrade controller if podSpec, ok := r.isServiceConfigUpdated(instance); ok { // Update instance Spec instance.Status.PodSpec = *podSpec instance.Status.ConfigChanged = true err = r.client.Status().Update(context.Background(), instance) if err != nil { reqLogger.Error(err, "Failed to update service status", "Service.Namespace", instance.Namespace, "Service.Name", instance.Name) return reconcile.Result{}, err } r.eventsChan <- event.GenericEvent{Meta: &servicesv1alpha1.MonitoredService{}, Object: instance} } return reconcile.Result{}, nil }
ãã®ã¡ãœããã¯ã NamespacedNameãã£ãŒã«ããæã€Requestãªããžã§ã¯ããåãå
¥ããŸããããã«ããããªãœãŒã¹ããã£ãã·ã¥ãããã«ã§ããŸãïŒ r.client.Get(context.TODO(), request.NamespacedName, instance) ã ãã®äŸã§ã¯ããªãœãŒã¹æ§æã®ConfigRepoãã£ãŒã«ãã«ãã£ãŠåç
§ããããµãŒãã¹æ§æãå«ããã¡ã€ã«ã«å¯ŸããŠèŠæ±ãè¡ãããŸãã æ§æãæŽæ°ããããšã GenericEventã¿ã€ãã®æ°ããã€ãã³ããGenericEvent ã Upgradeã³ã³ãããŒã©ãŒããªãã¹ã³ãããã£ãã«ã«éä¿¡ãããŸãã
ãªã¯ãšã¹ãã®åŠçåŸã Reconcileã¯ã¿ã€ãResultããã³errorãªããžã§ã¯ããè¿ãerror ã Resultãã£ãŒã«ããRequeue: trueãŸãã¯error != nilå Žåãã³ã³ãããŒã©ãŒã¯queue.AddRateLimitedã¡ãœããã䜿çšããŠãªã¯ãšã¹ãããã¥ãŒã«è¿ããŸãã èŠæ±ã¯ã RateLimiterã«ãã£ãŠæ±ºå®ãããé
å»¶ã§ãã¥ãŒã«è¿ãããŸãã ããã©ã«ãã§ã¯ã ItemExponentialFailureRateLimiter䜿çšãããŸããããã«ãããèŠæ±ãæ»ããã®æ°ã®å¢å ã«äŒŽã£ãŠé
å»¶æéãææ°é¢æ°çã«å¢å ããŸãã Requeueãã£ãŒã«ãRequeueèšå®ãããŠãããããªã¯ãšã¹ãã®åŠçäžã«ãšã©ãŒãçºçããªãã£ãå Žåãã³ã³ãããŒã©ãŒã¯Queue.Forgetã¡ãœãããåŒã³åºããŸããããã«ããã RateLimiterã®ãã£ãã·ã¥ãããªã¯ãšã¹ããåé€ãããŸãïŒããã«ããããªã¿ãŒã³æ°ããªã»ãããããŸãïŒã èŠæ±åŠçã®æåŸã«ãã³ã³ãããŒã©ãŒã¯Queue.Doneã¡ãœããã䜿çšããŠãã¥ãŒãããããåé€ããŸãã
ãªãã¬ãŒã¿ãŒã®èµ·å
ãªãã¬ãŒã¿ãŒã®ã³ã³ããŒãã³ãã¯äžèšã§èª¬æãããŸãããã1ã€ã®çåãæ®ããŸããããããéå§ããæ¹æ³ã§ãã ãŸããå¿
èŠãªãã¹ãŠã®ãªãœãŒã¹ãã€ã³ã¹ããŒã«ãããŠããããšã確èªããå¿
èŠããããŸãïŒããŒã«ã«ãã¹ãã§ã¯ã minikubeãã»ããã¢ããããããšããå§ãããŸã ïŒã
# Setup Service Account kubectl create -f deploy/service_account.yaml # Setup RBAC kubectl create -f deploy/role.yaml kubectl create -f deploy/role_binding.yaml # Setup the CRD kubectl create -f deploy/crds/services_v1alpha1_monitoredservice_crd.yaml # Setup custom resource kubectl create -f deploy/crds/services_v1alpha1_monitoredservice_cr.yaml
åææ¡ä»¶ãæºãããããããã¹ãçšã®ã¹ããŒãã¡ã³ããå®è¡ãã2ã€ã®ç°¡åãªæ¹æ³ããããŸãã æãç°¡åãªæ¹æ³ã¯ã次ã®ã³ãã³ãã䜿çšããŠã¯ã©ã¹ã¿ãŒå€ã§èµ·åããããšã§ãã
operator-sdk up local --namespace=default
2çªç®ã®æ¹æ³ã¯ããªãã¬ãŒã¿ãŒãã¯ã©ã¹ã¿ãŒã«ãããã€ããããšã§ãã ãŸããæŒç®åã䜿çšããŠDockerã€ã¡ãŒãžãæ§ç¯ããå¿
èŠããããŸãã
operator-sdk build config-monitor-operator:latest
deploy/operator.yamlãã¡ã€ã«ã§ã REPLACE_IMAGEãconfig-monitor-operator:latestã«çœ®ãæããŸãã
sed -i "" 's|REPLACE_IMAGE|config-monitor-operator:latest|g' deploy/operator.yaml
ã¹ããŒãã¡ã³ãã䜿çšããŠé
眮ãäœæããŸãã
kubectl create -f deploy/operator.yaml
ããã§ãã¯ã©ã¹ã¿ãŒäžã®Podã®ãªã¹ãã«ããã¹ããµãŒãã¹ä»ãPodã衚瀺ããã2çªç®ã®å Žå-ãªãã¬ãŒã¿ãŒä»ãPodã衚瀺ãããŸãã
çµè«ããã¹ããã©ã¯ãã£ã¹ã®ä»£ããã«
çŸæç¹ã§ã®ãªãã¬ãŒã¿ãŒéçºã®éèŠãªåé¡ã¯ãããŒã«ã®ææžåã®åŒ±ããšç¢ºç«ããããã¹ããã©ã¯ãã£ã¹ã®æ¬ åŠã§ãã æ°ããéçºè
ããªãã¬ãŒã¿ã®éçºãé²ãããšãã圌ã¯ç¹å®ã®èŠä»¶ã®å®è£
äŸãå®éã«èŠãå Žæããªãããããšã©ãŒã¯é¿ããããŸããã 以äžã¯ãç§ãã¡èªèº«ã®ééãããåŠãã ããã€ãã®æèšã§ãã
- é¢é£ããã¢ããªã±ãŒã·ã§ã³ã2ã€ããå Žåã¯ãããããåäžã®æŒç®åãšçµã¿åãããããšãé¿ããŠãã ããã ããã§ãªããã°ãççµåãµãŒãã¹ã®ååã«éåããŸãã
- æžå¿µäºé
ã®åé¢ã«ã€ããŠèŠããŠããå¿
èŠããããŸãã1ã€ã®ã³ã³ãããŒã©ãŒã«ãã¹ãŠã®ããžãã¯ãå®è£
ããããšããªãã§ãã ããã ããšãã°ãæ§æãç£èŠãããªãœãŒã¹ãäœæ/æŽæ°ããæ©èœãåºãã䟡å€ããããŸãã
Reconcileã¡ãœããã§ã¯ãåŒã³åºãã®ãããã¯ã¯é¿ããŠãã ããã ããšãã°ãå€éšãœãŒã¹ããèšå®ããã«ããããšãã§ããŸãããæäœãé·ãå Žåã¯ããã®ããã®ãŽã«ãŒãã³ãäœæãããªã¯ãšã¹ãããã¥ãŒã«è¿éããŠãå¿çRequeue: trueã§ç€ºãRequeue: true ã
ã³ã¡ã³ãã§ã¯ããªãã¬ãŒã¿ãŒã®éçºã«ãããããªãã®çµéšã«ã€ããŠèãããšã¯è峿·±ãã§ãããã æ¬¡ã®ããŒãã§ã¯ããªãã¬ãŒã¿ãŒã®ãã¹ãã«ã€ããŠèª¬æããŸãã