Documentation
¶
Overview ¶
The controller package provides libraries for creating controllers.
Example ¶
package main
import (
"flag"
"log"
"github.com/kubernetes-sigs/kubebuilder/pkg/config"
"github.com/kubernetes-sigs/kubebuilder/pkg/controller"
"github.com/kubernetes-sigs/kubebuilder/pkg/inject/run"
corev1 "k8s.io/api/core/v1"
)
func main() {
// Step 1: Register informers to Watch for Pod events
flag.Parse()
informerFactory := config.GetKubernetesInformersOrDie()
if err := controller.AddInformerProvider(&corev1.Pod{}, informerFactory.Core().V1().Pods()); err != nil {
log.Fatalf("Could not set informer %v", err)
}
// Step 2: Create a new Pod controller to reconcile Pods changes using the default
// Reconcile function to print messages on events
podController := &controller.GenericController{}
if err := podController.Watch(&corev1.Pod{}); err != nil {
log.Fatalf("%v", err)
}
controller.AddController(podController)
// Step 3: RunInformersAndControllers all informers and controllers
controller.RunInformersAndControllers(run.CreateRunArguments())
}
Example (Second) ¶
package main
import (
"flag"
"log"
"github.com/kubernetes-sigs/kubebuilder/pkg/config"
"github.com/kubernetes-sigs/kubebuilder/pkg/controller"
"github.com/kubernetes-sigs/kubebuilder/pkg/controller/types"
"github.com/kubernetes-sigs/kubebuilder/pkg/inject/run"
corev1 "k8s.io/api/core/v1"
corev1informer "k8s.io/client-go/informers/core/v1"
corev1lister "k8s.io/client-go/listers/core/v1"
)
func main() {
// Step 1: Register informers to Watch for Pod events
flag.Parse()
informerFactory := config.GetKubernetesInformersOrDie()
if err := controller.AddInformerProvider(&corev1.Pod{}, informerFactory.Core().V1().Pods()); err != nil {
log.Fatalf("Could not set informer %v", err)
}
// Step 2: Create a new Pod controller to reconcile Pods changes using the default
// Reconcile function to print messages on events
podController := &Controller{
podlister: controller.GetInformerProvider(&corev1.Pod{}).(corev1informer.PodInformer).Lister(),
}
genericController := &controller.GenericController{
Name: "PodController",
Reconcile: podController.Reconcile,
}
if err := genericController.Watch(&corev1.Pod{}); err != nil {
log.Fatalf("%v", err)
}
controller.AddController(genericController)
// Step 3: RunInformersAndControllers all informers and controllers
controller.RunInformersAndControllers(run.CreateRunArguments())
}
type Controller struct {
podlister corev1lister.PodLister
}
func (c *Controller) Reconcile(key types.ReconcileKey) error {
pod, err := c.podlister.Pods(key.Namespace).Get(key.Name)
if err != nil {
log.Printf("Failed to reconcile Pod %+v\n", err)
return err
}
log.Printf("Reconcile Pod %+v\n", pod)
return nil
}
Index ¶
- Variables
- func AddController(controller *GenericController)
- func AddInformerProvider(object metav1.Object, informerProvider informers.InformerProvider) error
- func GetInformerProvider(object metav1.Object) informers.InformerProvider
- func RunInformersAndControllers(options run.RunArguments)
- type ControllerManager
- func (m *ControllerManager) AddController(controller *GenericController)
- func (m *ControllerManager) AddInformerProvider(object metav1.Object, informerProvider informers.InformerProvider) error
- func (m *ControllerManager) GetController(name string) *GenericController
- func (m *ControllerManager) GetInformer(object metav1.Object) cache.SharedInformer
- func (m *ControllerManager) GetInformerProvider(object metav1.Object) informers.InformerProvider
- func (m *ControllerManager) RunInformersAndControllers(options run.RunArguments)
- func (m *ControllerManager) String() string
- type GenericController
- func (gc *GenericController) GetMetrics() metrics.Metrics
- func (gc *GenericController) Watch(obj metav1.Object, p ...predicates.Predicate) error
- func (gc *GenericController) WatchChannel(source <-chan string) error
- func (gc *GenericController) WatchControllerOf(obj metav1.Object, path eventhandlers.Path, p ...predicates.Predicate) error
- func (gc *GenericController) WatchEvents(obj metav1.Object, provider types.HandleFnProvider) error
- func (gc *GenericController) WatchTransformationKeyOf(obj metav1.Object, mapFn eventhandlers.ObjToReconcileKey, ...) error
- func (gc *GenericController) WatchTransformationKeysOf(obj metav1.Object, mapFn eventhandlers.ObjToReconcileKeys, ...) error
- func (gc *GenericController) WatchTransformationOf(obj metav1.Object, mapFn eventhandlers.ObjToKey, p ...predicates.Predicate) error
- func (gc *GenericController) WatchTransformationsOf(obj metav1.Object, mapFn eventhandlers.ObjToKeys, p ...predicates.Predicate) error
Examples ¶
- Package
- Package (Second)
- AddController
- AddInformerProvider
- ControllerManager
- GenericController
- GenericController.Watch
- GenericController.WatchChannel
- GenericController.WatchControllerOf
- GenericController.WatchEvents
- GenericController.WatchTransformationKeyOf
- GenericController.WatchTransformationKeysOf
- GenericController.WatchTransformationOf
- GenericController.WatchTransformationsOf
- GetInformerProvider
- RunInformersAndControllers
Constants ¶
This section is empty.
Variables ¶
var (
// DefaultManager is the ControllerManager used by the package functions
DefaultManager = &defaultManager
)
var ( // DefaultReconcileFn is used by GenericController if Reconcile is not set DefaultReconcileFn = func(k types.ReconcileKey) error { log.Printf("No ReconcileFn defined - skipping %+v", k) return nil } )
Functions ¶
func AddController ¶
func AddController(controller *GenericController)
AddController registers a new controller to be run.
Example ¶
package main
import (
"log"
"github.com/kubernetes-sigs/kubebuilder/pkg/controller"
"github.com/kubernetes-sigs/kubebuilder/pkg/controller/types"
"k8s.io/api/core/v1"
)
func main() {
podController := &controller.GenericController{
Reconcile: func(key types.ReconcileKey) error {
log.Printf("Reconciling Pod %v\n", key)
return nil
},
}
if err := podController.Watch(&v1.Pod{}); err != nil {
log.Fatalf("%v", err)
}
controller.AddController(podController)
}
func AddInformerProvider ¶
func AddInformerProvider(object metav1.Object, informerProvider informers.InformerProvider) error
AddInformerProvider registers a new shared SharedIndexInformer under the object type. SharedIndexInformer will be RunInformersAndControllers by calling RunInformersAndControllers on the ControllerManager.
Example ¶
package main
import (
"flag"
"log"
"github.com/kubernetes-sigs/kubebuilder/pkg/config"
"github.com/kubernetes-sigs/kubebuilder/pkg/controller"
corev1 "k8s.io/api/core/v1"
)
func main() {
flag.Parse()
informerFactory := config.GetKubernetesInformersOrDie()
// Register informers to Watch for Pod events
if err := controller.AddInformerProvider(&corev1.Pod{}, informerFactory.Core().V1().Pods()); err != nil {
log.Fatalf("Could not set informer %v", err)
}
}
func GetInformerProvider ¶
func GetInformerProvider(object metav1.Object) informers.InformerProvider
GetInformerProvider returns the InformerProvider for the object type. Use this to get Listers for objects.
Example ¶
package main
import (
"flag"
"log"
"github.com/kubernetes-sigs/kubebuilder/pkg/controller"
corev1 "k8s.io/api/core/v1"
"k8s.io/client-go/informers/core/v1"
)
func main() {
// Get the registered PodInformer
flag.Parse()
provider := controller.GetInformerProvider(&corev1.Pod{})
podinformer, ok := provider.(v1.PodInformer)
if !ok {
log.Fatalf("Expected PodInformer for Pod, got %T", podinformer)
}
lister := podinformer.Lister()
lister.Pods("default").Get("pod-name")
}
func RunInformersAndControllers ¶
func RunInformersAndControllers(options run.RunArguments)
RunInformersAndControllers runs all of the informers and controllers
Example ¶
package main
import (
"github.com/kubernetes-sigs/kubebuilder/pkg/controller"
"github.com/kubernetes-sigs/kubebuilder/pkg/inject/run"
)
func main() {
// RunInformersAndControllers all registered informers and controllers
controller.RunInformersAndControllers(run.CreateRunArguments())
}
Types ¶
type ControllerManager ¶
type ControllerManager struct {
// contains filtered or unexported fields
}
ControllerManager registers shared informers and controllers
Example ¶
package main
import (
"github.com/kubernetes-sigs/kubebuilder/pkg/controller"
)
func main() {
// Create a new empty ControllerManager for managing Informers and Controllers
var _ = &controller.ControllerManager{}
}
func (*ControllerManager) AddController ¶
func (m *ControllerManager) AddController(controller *GenericController)
AddController registers a new controller to be run..
func (*ControllerManager) AddInformerProvider ¶
func (m *ControllerManager) AddInformerProvider(object metav1.Object, informerProvider informers.InformerProvider) error
AddInformerProvider registers a new shared SharedIndexInformer under the object type. SharedIndexInformer will be RunInformersAndControllers by calling RunInformersAndControllers on the ControllerManager.
func (*ControllerManager) GetController ¶
func (m *ControllerManager) GetController(name string) *GenericController
GetController returns a registered controller with the name
func (*ControllerManager) GetInformer ¶
func (m *ControllerManager) GetInformer(object metav1.Object) cache.SharedInformer
GetInformer returns the Informer for an object
func (*ControllerManager) GetInformerProvider ¶
func (m *ControllerManager) GetInformerProvider(object metav1.Object) informers.InformerProvider
GetInformerProvider returns the InformerProvider for the object type
func (*ControllerManager) RunInformersAndControllers ¶
func (m *ControllerManager) RunInformersAndControllers(options run.RunArguments)
RunInformersAndControllers starts the registered informers and controllers. Sets options.Parallelism to 1 if it is lt 1 Creates a new channel for options.Stop if it is nil
func (*ControllerManager) String ¶
func (m *ControllerManager) String() string
String prints the registered shared informers
type GenericController ¶
type GenericController struct {
// Name is the name of the controller
Name string
// Reconcile implements the controller business logic.
Reconcile types.ReconcileFn
// informerProvider contains the registry of shared informers to use.
InformerRegistry informers.InformerGetter
BeforeReconcile func(key types.ReconcileKey)
AfterReconcile func(key types.ReconcileKey, err error)
// contains filtered or unexported fields
}
GenericController watches event sources and invokes a Reconcile function
Example ¶
package main
import (
"flag"
"fmt"
"log"
"github.com/kubernetes-sigs/kubebuilder/pkg/config"
"github.com/kubernetes-sigs/kubebuilder/pkg/controller"
"github.com/kubernetes-sigs/kubebuilder/pkg/controller/eventhandlers"
"github.com/kubernetes-sigs/kubebuilder/pkg/controller/types"
"github.com/kubernetes-sigs/kubebuilder/pkg/inject/run"
appsv1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1"
)
func main() {
// Step 1: Register informers with the ControllerManager to Watch for Pod and ReplicaSet events
flag.Parse()
informerFactory := config.GetKubernetesInformersOrDie()
if err := controller.AddInformerProvider(&corev1.Pod{}, informerFactory.Core().V1().Pods()); err != nil {
log.Fatalf("Could not set informer %v", err)
}
if err := controller.AddInformerProvider(&appsv1.ReplicaSet{}, informerFactory.Apps().V1().ReplicaSets()); err != nil {
log.Fatalf("Could not set informer %v", err)
}
// Step 2.1: Create a new Pod controller to reconcile Pods changes
podController := &controller.GenericController{
Reconcile: func(key types.ReconcileKey) error {
fmt.Printf("Reconciling Pod %v\n", key)
return nil
},
}
if err := podController.Watch(&corev1.Pod{}); err != nil {
log.Fatalf("%v", err)
}
controller.AddController(podController)
// Step 2.2: Create a new ReplicaSet controller to reconcile ReplicaSet changes
rsController := &controller.GenericController{
Reconcile: func(key types.ReconcileKey) error {
fmt.Printf("Reconciling ReplicaSet %v\n", key)
return nil
},
}
fn := func(k types.ReconcileKey) (interface{}, error) {
return informerFactory.Apps().V1().ReplicaSets().Lister().ReplicaSets(k.Namespace).Get(k.Name)
}
if err := rsController.WatchControllerOf(&corev1.Pod{}, eventhandlers.Path{fn}); err != nil {
log.Fatalf("%v", err)
}
if err := rsController.Watch(&appsv1.ReplicaSet{}); err != nil {
log.Fatalf("%v", err)
}
controller.AddController(rsController)
// Step 3: RunInformersAndControllers all informers and controllers
controller.RunInformersAndControllers(run.CreateRunArguments())
}
func (*GenericController) GetMetrics ¶
func (gc *GenericController) GetMetrics() metrics.Metrics
GetMetrics returns metrics about the queue processing
func (*GenericController) Watch ¶
func (gc *GenericController) Watch(obj metav1.Object, p ...predicates.Predicate) error
Watch watches objects matching obj's type and enqueues their keys to be reconcild.
Example ¶
package main
import (
"flag"
"fmt"
"log"
"github.com/kubernetes-sigs/kubebuilder/pkg/config"
"github.com/kubernetes-sigs/kubebuilder/pkg/controller"
"github.com/kubernetes-sigs/kubebuilder/pkg/controller/types"
"github.com/kubernetes-sigs/kubebuilder/pkg/inject/run"
"k8s.io/api/core/v1"
)
func main() {
// One time setup for program
flag.Parse()
informerFactory := config.GetKubernetesInformersOrDie()
if err := controller.AddInformerProvider(&v1.Pod{}, informerFactory.Core().V1().Pods()); err != nil {
log.Fatalf("Could not set informer %v", err)
}
// Per-controller setup
c := &controller.GenericController{
Name: "Foo",
Reconcile: func(key types.ReconcileKey) error {
fmt.Printf("Reconciling Pod %s\n", key)
return nil
},
}
if err := c.Watch(&v1.Pod{}); err != nil {
log.Fatalf("%v", err)
}
controller.AddController(c)
// One time for program
controller.RunInformersAndControllers(run.CreateRunArguments())
}
func (*GenericController) WatchChannel ¶
func (gc *GenericController) WatchChannel(source <-chan string) error
WatchChannel enqueues object keys read from the channel.
Example ¶
package main
import (
"fmt"
"log"
"github.com/kubernetes-sigs/kubebuilder/pkg/controller"
"github.com/kubernetes-sigs/kubebuilder/pkg/controller/types"
"github.com/kubernetes-sigs/kubebuilder/pkg/inject/run"
)
func main() {
podkeys := make(chan string)
c := &controller.GenericController{
Reconcile: func(key types.ReconcileKey) error {
fmt.Printf("Reconciling Pod %s\n", key)
return nil
},
}
if err := c.WatchChannel(podkeys); err != nil {
log.Fatalf("%v", err)
}
controller.AddController(c)
controller.RunInformersAndControllers(run.CreateRunArguments())
podkeys <- "namespace/pod-name"
}
func (*GenericController) WatchControllerOf ¶
func (gc *GenericController) WatchControllerOf(obj metav1.Object, path eventhandlers.Path, p ...predicates.Predicate) error
WatchControllerOf reconciles the controller of the object type being watched. e.g. If the controller created a Pod, watch the Pod for events and invoke the controller reconcile function. Uses path to lookup the ancestors. Will lookup each ancestor in the path until it gets to the root and then reconcile this key.
Example: Deployment controller creates a ReplicaSet. ReplicaSet controller creates a Pod. Deployment controller wants to have its reconcile method called for Pod events for any Pods it created (transitively). - Pod event occurs - find owners references - Lookup the Pod parent ReplicaSet by using the first path element (compare UID to ref) - Lookup the ReplicaSet parent Deployment by using the second path element (compare UID to ref) - Enqueue reconcile for Deployment namespace/name
This could be implemented as: WatchControllerOf(&corev1.Pod, eventhandlers.Path{FnToLookupReplicaSetByNamespaceName, FnToLookupDeploymentByNamespaceName })
Example ¶
package main
import (
"flag"
"fmt"
"log"
"github.com/kubernetes-sigs/kubebuilder/pkg/config"
"github.com/kubernetes-sigs/kubebuilder/pkg/controller"
"github.com/kubernetes-sigs/kubebuilder/pkg/controller/eventhandlers"
"github.com/kubernetes-sigs/kubebuilder/pkg/controller/types"
"github.com/kubernetes-sigs/kubebuilder/pkg/inject/run"
corev1 "k8s.io/api/core/v1"
)
func main() {
// One time setup for program
flag.Parse()
informerFactory := config.GetKubernetesInformersOrDie()
if err := controller.AddInformerProvider(&corev1.Pod{}, informerFactory.Core().V1().Pods()); err != nil {
log.Fatalf("Could not set informer %v", err)
}
// Per-controller setup
c := &controller.GenericController{
Reconcile: func(key types.ReconcileKey) error {
fmt.Printf("Reconciling Pod %s\n", key)
return nil
},
}
fn := func(k types.ReconcileKey) (interface{}, error) {
return informerFactory.Apps().V1().ReplicaSets().Lister().ReplicaSets(k.Namespace).Get(k.Name)
}
err := c.WatchControllerOf(&corev1.Pod{}, eventhandlers.Path{fn})
if err != nil {
log.Fatalf("%v", err)
}
controller.AddController(c)
// One time for program
controller.RunInformersAndControllers(run.CreateRunArguments())
}
func (*GenericController) WatchEvents ¶
func (gc *GenericController) WatchEvents(obj metav1.Object, provider types.HandleFnProvider) error
WatchEvents watches objects matching obj's type and uses the functions from provider to handle events.
Example ¶
package main
import (
"flag"
"fmt"
"log"
"github.com/kubernetes-sigs/kubebuilder/pkg/config"
"github.com/kubernetes-sigs/kubebuilder/pkg/controller"
"github.com/kubernetes-sigs/kubebuilder/pkg/controller/eventhandlers"
"github.com/kubernetes-sigs/kubebuilder/pkg/controller/types"
"github.com/kubernetes-sigs/kubebuilder/pkg/inject/run"
corev1 "k8s.io/api/core/v1"
"k8s.io/client-go/tools/cache"
"k8s.io/client-go/util/workqueue"
)
func main() {
// One time setup for program
flag.Parse()
informerFactory := config.GetKubernetesInformersOrDie()
if err := controller.AddInformerProvider(&corev1.Pod{}, informerFactory.Core().V1().Pods()); err != nil {
log.Fatalf("Could not set informer %v", err)
}
// Per-controller setup
c := &controller.GenericController{
Reconcile: func(key types.ReconcileKey) error {
fmt.Printf("Reconciling Pod %s\n", key)
return nil
},
}
err := c.WatchEvents(&corev1.Pod{},
// This function returns the callbacks that will be invoked for events
func(q workqueue.RateLimitingInterface) cache.ResourceEventHandler {
// This function implements the same functionality as GenericController.Watch
return cache.ResourceEventHandlerFuncs{
AddFunc: func(obj interface{}) { q.AddRateLimited(eventhandlers.MapToSelf(obj)) },
UpdateFunc: func(old, obj interface{}) { q.AddRateLimited(eventhandlers.MapToSelf(obj)) },
DeleteFunc: func(obj interface{}) { q.AddRateLimited(eventhandlers.MapToSelf(obj)) },
}
})
if err != nil {
log.Fatalf("%v", err)
}
controller.AddController(c)
// One time for program
controller.RunInformersAndControllers(run.CreateRunArguments())
}
func (*GenericController) WatchTransformationKeyOf ¶
func (gc *GenericController) WatchTransformationKeyOf(obj metav1.Object, mapFn eventhandlers.ObjToReconcileKey, p ...predicates.Predicate) error
WatchTransformationKeyOf watches objects matching obj's type and enqueues the key returned by mapFn.
Example ¶
package main
import (
"flag"
"fmt"
"log"
"strings"
"github.com/kubernetes-sigs/kubebuilder/pkg/config"
"github.com/kubernetes-sigs/kubebuilder/pkg/controller"
"github.com/kubernetes-sigs/kubebuilder/pkg/controller/types"
"github.com/kubernetes-sigs/kubebuilder/pkg/inject/run"
appsv1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1"
)
func main() {
// One time setup for program
flag.Parse()
informerFactory := config.GetKubernetesInformersOrDie()
if err := controller.AddInformerProvider(&corev1.Pod{}, informerFactory.Core().V1().Pods()); err != nil {
log.Fatalf("Could not set informer %v", err)
}
if err := controller.AddInformerProvider(&appsv1.ReplicaSet{}, informerFactory.Apps().V1().ReplicaSets()); err != nil {
log.Fatalf("Could not set informer %v", err)
}
// Per-controller setup
c := &controller.GenericController{
Reconcile: func(key types.ReconcileKey) error {
fmt.Printf("Reconciling Pod %s\n", key)
return nil
},
}
err := c.Watch(&appsv1.ReplicaSet{})
if err != nil {
log.Fatalf("%v", err)
}
err = c.WatchTransformationKeyOf(&corev1.Pod{},
func(i interface{}) types.ReconcileKey {
p, ok := i.(*corev1.Pod)
if !ok {
return types.ReconcileKey{}
}
// Find multiple parents based off the name
return types.ReconcileKey{p.Namespace, strings.Split(p.Name, "-")[0]}
},
)
if err != nil {
log.Fatalf("%v", err)
}
controller.AddController(c)
// One time for program
controller.RunInformersAndControllers(run.CreateRunArguments())
}
func (*GenericController) WatchTransformationKeysOf ¶
func (gc *GenericController) WatchTransformationKeysOf(obj metav1.Object, mapFn eventhandlers.ObjToReconcileKeys, p ...predicates.Predicate) error
WatchTransformationKeysOf watches objects matching obj's type and enqueues the keys returned by mapFn.
Example ¶
package main
import (
"flag"
"fmt"
"log"
"strings"
"github.com/kubernetes-sigs/kubebuilder/pkg/config"
"github.com/kubernetes-sigs/kubebuilder/pkg/controller"
"github.com/kubernetes-sigs/kubebuilder/pkg/controller/types"
"github.com/kubernetes-sigs/kubebuilder/pkg/inject/run"
appsv1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1"
)
func main() {
// One time setup for program
flag.Parse()
informerFactory := config.GetKubernetesInformersOrDie()
if err := controller.AddInformerProvider(&corev1.Pod{}, informerFactory.Core().V1().Pods()); err != nil {
log.Fatalf("Could not set informer %v", err)
}
if err := controller.AddInformerProvider(&appsv1.ReplicaSet{}, informerFactory.Apps().V1().ReplicaSets()); err != nil {
log.Fatalf("Could not set informer %v", err)
}
// Per-controller setup
c := &controller.GenericController{
Reconcile: func(key types.ReconcileKey) error {
fmt.Printf("Reconciling Pod %s\n", key)
return nil
},
}
err := c.Watch(&appsv1.ReplicaSet{})
if err != nil {
log.Fatalf("%v", err)
}
err = c.WatchTransformationKeysOf(&corev1.Pod{},
func(i interface{}) []types.ReconcileKey {
p, ok := i.(*corev1.Pod)
if !ok {
return []types.ReconcileKey{}
}
// Find multiple parents based off the name
return []types.ReconcileKey{
{p.Namespace, strings.Split(p.Name, "-")[0] + "-parent-1"},
{p.Namespace, strings.Split(p.Name, "-")[0] + "-parent-2"},
}
},
)
if err != nil {
log.Fatalf("%v", err)
}
controller.AddController(c)
// One time for program
controller.RunInformersAndControllers(run.CreateRunArguments())
}
func (*GenericController) WatchTransformationOf ¶
func (gc *GenericController) WatchTransformationOf(obj metav1.Object, mapFn eventhandlers.ObjToKey, p ...predicates.Predicate) error
WatchTransformationOf watches objects matching obj's type and enqueues the key returned by mapFn.
Example ¶
package main
import (
"flag"
"fmt"
"log"
"strings"
"github.com/kubernetes-sigs/kubebuilder/pkg/config"
"github.com/kubernetes-sigs/kubebuilder/pkg/controller"
"github.com/kubernetes-sigs/kubebuilder/pkg/controller/types"
"github.com/kubernetes-sigs/kubebuilder/pkg/inject/run"
appsv1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1"
)
func main() {
// One time setup for program
flag.Parse()
informerFactory := config.GetKubernetesInformersOrDie()
if err := controller.AddInformerProvider(&corev1.Pod{}, informerFactory.Core().V1().Pods()); err != nil {
log.Fatalf("Could not set informer %v", err)
}
if err := controller.AddInformerProvider(&appsv1.ReplicaSet{}, informerFactory.Apps().V1().ReplicaSets()); err != nil {
log.Fatalf("Could not set informer %v", err)
}
// Per-controller setup
c := &controller.GenericController{
Reconcile: func(key types.ReconcileKey) error {
fmt.Printf("Reconciling Pod %s\n", key)
return nil
},
}
err := c.Watch(&appsv1.ReplicaSet{})
if err != nil {
log.Fatalf("%v", err)
}
err = c.WatchTransformationOf(&corev1.Pod{},
func(i interface{}) string {
p, ok := i.(*corev1.Pod)
if !ok {
return ""
}
// Find the parent key based on the name
return p.Namespace + "/" + strings.Split(p.Name, "-")[0]
},
)
if err != nil {
log.Fatalf("%v", err)
}
controller.AddController(c)
// One time for program
controller.RunInformersAndControllers(run.CreateRunArguments())
}
func (*GenericController) WatchTransformationsOf ¶
func (gc *GenericController) WatchTransformationsOf(obj metav1.Object, mapFn eventhandlers.ObjToKeys, p ...predicates.Predicate) error
WatchTransformationsOf watches objects matching obj's type and enqueues the keys returned by mapFn.
Example ¶
package main
import (
"flag"
"fmt"
"log"
"strings"
"github.com/kubernetes-sigs/kubebuilder/pkg/config"
"github.com/kubernetes-sigs/kubebuilder/pkg/controller"
"github.com/kubernetes-sigs/kubebuilder/pkg/controller/types"
"github.com/kubernetes-sigs/kubebuilder/pkg/inject/run"
appsv1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1"
)
func main() {
// One time setup for program
flag.Parse()
informerFactory := config.GetKubernetesInformersOrDie()
if err := controller.AddInformerProvider(&corev1.Pod{}, informerFactory.Core().V1().Pods()); err != nil {
log.Fatalf("Could not set informer %v", err)
}
if err := controller.AddInformerProvider(&appsv1.ReplicaSet{}, informerFactory.Apps().V1().ReplicaSets()); err != nil {
log.Fatalf("Could not set informer %v", err)
}
// Per-controller setup
c := &controller.GenericController{
Reconcile: func(key types.ReconcileKey) error {
fmt.Printf("Reconciling Pod %s\n", key)
return nil
},
}
err := c.Watch(&appsv1.ReplicaSet{})
if err != nil {
log.Fatalf("%v", err)
}
err = c.WatchTransformationsOf(&corev1.Pod{},
func(i interface{}) []string {
p, ok := i.(*corev1.Pod)
if !ok {
return []string{}
}
// Find multiple parents based off the name
return []string{
p.Namespace + "/" + strings.Split(p.Name, "-")[0] + "-parent-1",
p.Namespace + "/" + strings.Split(p.Name, "-")[0] + "-parent-2",
}
},
)
if err != nil {
log.Fatalf("%v", err)
}
controller.AddController(c)
// One time for program
controller.RunInformersAndControllers(run.CreateRunArguments())
}
Directories
¶
| Path | Synopsis |
|---|---|
|
The handlefunctions defines mapping and event handling functions for controllers
|
The handlefunctions defines mapping and event handling functions for controllers |
|
The informers defines a registry for sharing informers
|
The informers defines a registry for sharing informers |
|
The metrics package defines controller runtime metrics
|
The metrics package defines controller runtime metrics |
|
The test package contains fake informers for testing controllers
|
The test package contains fake informers for testing controllers |
|
The types package declares types used by the controller package
|
The types package declares types used by the controller package |