Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

165
Vistas
Cree el recurso k8s y espere hasta que termine para continuar con el siguiente

Necesito crear un recurso k8s el cual tomara un tiempo hasta que este disponible, para esto uso lo siguiente

https://pkg.go.dev/sigs.k8s.io/controller-runtime/pkg/controller/controllerutil#example-CreateOrUpdate

 op, err := controllerutil.CreateOrUpdate(context.TODO(), c, deploy, func() error { }) func2()

ahora necesito llamar a func2 justo después de que se haya creado el objeto (puede tomar de 2 a 3 minutos hasta que termine), ¿cómo debo hacerlo bien?

Encontré esto pero no estoy seguro de cómo combinarlos...

https://pkg.go.dev/sigs.k8s.io/controller-runtime/pkg#hdr-Watching_and_EventHandling

estoy usando kubebuilder

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

El enfoque anterior es más para el uso de cli.

Cuando está utilizando kubebuilder o el operador sdk, debe tratarlo en su función de reconciliación.

Por lo general, tiene un recurso personalizado que activa la función de reconciliación de sus controladores. Cuando se crea el recurso personalizado, crea la implementación y, en lugar de devolver un reconcile.Result vacío (que lo marca como hecho), puede devolver el reconcile.Result con el atributo Requeue.

 reconcile.Result{Requeue: true}

Entonces, durante la próxima ejecución, verifica si la implementación está lista. Si no, vuelve a hacer cola. Una vez que esté listo, devuelve una reconciliación vacía. Estructura de resultado.

También tenga en cuenta que la función de conciliación siempre debe ser idempotente, ya que se ejecutará nuevamente para cada recurso personalizado durante un reinicio del controlador y también cada 10 horas de forma predeterminada.

Alternativamente, también podría usar una referencia de propietario en la implementación creada y luego configurar el controlador para conciliar el recurso del propietario (su recurso personalizado) siempre que ocurra una actualización en el recurso de propiedad (la implementación). Con operator sdk esto se puede configurar en la función SetupWithManager, que por defecto solo usa la función de opción For. Aquí debe agregar la función de opción Poseer.

 // SetupWithManager sets up the controller with the Manager. func (r *YourReconciler) SetupWithManager(mgr ctrl.Manager) error { return ctrl.NewControllerManagedBy(mgr). For(&yourapigroup.YourCustomResource{}). Owns(&appv1.Deployment{}). Complete(r) }

Aunque nunca utilicé ese enfoque, por lo tanto, podría ser necesario agregar más código para que esto funcione.

El uso de la referencia del propietario también puede ser útil si no necesita ningún código de finalizador, ya que kubernetes eliminará su recurso propio (la implementación) automáticamente cuando se elimine el recurso personalizado.

over 4 years ago · Santiago Trujillo Denunciar

0

Aquí hay un ejemplo de cómo crear una implementación y verificar si tiene al menos 1 réplica lista. Tal vez sería aún mejor verificar las condiciones en el estado y buscar la condición de tipo Disponible y estado de "Verdadero".

 package main import ( "context" "fmt" v1 "k8s.io/api/apps/v1" podv1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/fields" "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/cache" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/config" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" "time" ) const ( namespace = "default" deploymentName = "nginx" ) func main() { cfg, err := config.GetConfig() if err != nil { panic(err) } clientset, err := kubernetes.NewForConfig(cfg) if err != nil { panic(err) } client, err := client.New(cfg, client.Options{}) if err != nil { panic(err) } d := &v1.Deployment{ ObjectMeta: metav1.ObjectMeta{ Name: deploymentName, Namespace: namespace, }, Spec: v1.DeploymentSpec{ Replicas: toInt32Ptr(2), Selector: &metav1.LabelSelector{ MatchLabels: map[string]string{ "app": "nginx", }, }, Template: podv1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ Labels: map[string]string{ "app": "nginx", }, }, Spec: podv1.PodSpec{ Containers: []podv1.Container{ { Name: "nginx", Image: "nginx", }, }, }, }, }, } fmt.Println("Deploying") _, err = controllerutil.CreateOrUpdate(context.TODO(), client, d, func() error { return nil }) if err != nil { panic(err) } stop := make(chan struct{}) watchList := cache.NewListWatchFromClient(clientset.AppsV1().RESTClient(), "deployments", namespace, fields.Everything()) _, ctrl := cache.NewInformer(watchList, &v1.Deployment{}, time.Second, cache.ResourceEventHandlerFuncs{ UpdateFunc: func(o, n interface{}) { newDeployment := n.(*v1.Deployment) if newDeployment.Name != deploymentName { return } if newDeployment.Status.ReadyReplicas > 0 { close(stop) return } return }, }) ctrl.Run(stop) fmt.Println("Deployment has at least 1 ready replica") } func toInt32Ptr(i int32) *int32 { return &i }
over 4 years ago · Santiago Trujillo Denunciar

0

Este ejemplo, de la documentación de operator-sdk, podría ayudar: https://sdk.operatorframework.io/docs/building-operators/golang/references/client/#example-usage . Se basa en las funciones Create() y Update() , lo que podría conducir a un algoritmo más simple.

Este, de la documentación de kubebuilder, también proporciona una pista interesante, aunque está en desuso: https://book-v1.book.kubebuilder.io/basics/simple_controller.html

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda