
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
ã
ã³ã¡ã³ãã§ã¯ããªãã¬ãŒã¿ãŒã®éçºã«ãããããªãã®çµéšã«ã€ããŠèãããšã¯èå³æ·±ãã§ãããã 次ã®ããŒãã§ã¯ããªãã¬ãŒã¿ãŒã®ãã¹ãã«ã€ããŠèª¬æããŸãã