controller-runtime: sigs.k8s.io/controller-runtime Index | Examples | Files | Directories

package controllerruntime

import "sigs.k8s.io/controller-runtime"

Package controllerruntime alias' common functions and types to improve discoverability and reduce the number of imports for simple Controllers.

This example creates a simple application Controller that is configured for ReplicaSets and Pods.

* Create a new application for ReplicaSets that manages Pods owned by the ReplicaSet and calls into ReplicaSetReconciler.

* Start the application. TODO(pwittrock): Update this example when we have better dependency injection support

Code:

package main

import (
    "context"
    "fmt"
    "os"

    appsv1 "k8s.io/api/apps/v1"
    corev1 "k8s.io/api/core/v1"
    controllers "sigs.k8s.io/controller-runtime"
    "sigs.k8s.io/controller-runtime/pkg/client"
)

// This example creates a simple application Controller that is configured for ReplicaSets and Pods.
//
// * Create a new application for ReplicaSets that manages Pods owned by the ReplicaSet and calls into
// ReplicaSetReconciler.
//
// * Start the application.
// TODO(pwittrock): Update this example when we have better dependency injection support
func main() {
    var log = controllers.Log.WithName("builder-examples")

    manager, err := controllers.NewManager(controllers.GetConfigOrDie(), controllers.Options{})
    if err != nil {
        log.Error(err, "could not create manager")
        os.Exit(1)
    }

    err = controllers.
        NewControllerManagedBy(manager). // Create the Controller
        For(&appsv1.ReplicaSet{}).       // ReplicaSet is the Application API
        Owns(&corev1.Pod{}).             // ReplicaSet owns Pods created by it
        Complete(&ReplicaSetReconciler{Client: manager.GetClient()})
    if err != nil {
        log.Error(err, "could not create controller")
        os.Exit(1)
    }

    if err := manager.Start(controllers.SetupSignalHandler()); err != nil {
        log.Error(err, "could not start manager")
        os.Exit(1)
    }
}

// ReplicaSetReconciler is a simple Controller example implementation.
type ReplicaSetReconciler struct {
    client.Client
}

// Implement the business logic:
// This function will be called when there is a change to a ReplicaSet or a Pod with an OwnerReference
// to a ReplicaSet.
//
// * Read the ReplicaSet
// * Read the Pods
// * Set a Label on the ReplicaSet with the Pod count
func (a *ReplicaSetReconciler) Reconcile(req controllers.Request) (controllers.Result, error) {
    // Read the ReplicaSet
    rs := &appsv1.ReplicaSet{}
    err := a.Get(context.TODO(), req.NamespacedName, rs)
    if err != nil {
        return controllers.Result{}, err
    }

    // List the Pods matching the PodTemplate Labels
    pods := &corev1.PodList{}
    err = a.List(context.TODO(), client.InNamespace(req.Namespace).MatchingLabels(rs.Spec.Template.Labels), pods)
    if err != nil {
        return controllers.Result{}, err
    }

    // Update the ReplicaSet
    rs.Labels["pod-count"] = fmt.Sprintf("%v", len(pods.Items))
    err = a.Update(context.TODO(), rs)
    if err != nil {
        return controllers.Result{}, err
    }

    return controllers.Result{}, nil
}

Index

Examples

Package Files

alias.go

Variables

var (
    // GetConfigOrDie creates a *rest.Config for talking to a Kubernetes apiserver.
    // If --kubeconfig is set, will use the kubeconfig file at that location.  Otherwise will assume running
    // in cluster and use the cluster provided kubeconfig.
    //
    // Will log an error and exit if there is an error creating the rest.Config.
    GetConfigOrDie = config.GetConfigOrDie

    // GetConfig creates a *rest.Config for talking to a Kubernetes apiserver.
    // If --kubeconfig is set, will use the kubeconfig file at that location.  Otherwise will assume running
    // in cluster and use the cluster provided kubeconfig.
    //
    // Config precedence
    //
    // * --kubeconfig flag pointing at a file
    //
    // * KUBECONFIG environment variable pointing at a file
    //
    // * In-cluster config if running in cluster
    //
    // * $HOME/.kube/config if exists
    GetConfig = config.GetConfig

    // NewControllerManagedBy returns a new controller builder that will be started by the provided Manager
    NewControllerManagedBy = builder.ControllerManagedBy

    // NewManager returns a new Manager for creating Controllers.
    NewManager = manager.New

    // CreateOrUpdate creates or updates the given object obj in the Kubernetes
    // cluster. The object's desired state should be reconciled with the existing
    // state using the passed in ReconcileFn. obj must be a struct pointer so that
    // obj can be updated with the content returned by the Server.
    //
    // It returns the executed operation and an error.
    CreateOrUpdate = controllerutil.CreateOrUpdate

    // SetControllerReference sets owner as a Controller OwnerReference on owned.
    // This is used for garbage collection of the owned object and for
    // reconciling the owner object on changes to owned (with a Watch + EnqueueRequestForOwner).
    // Since only one OwnerReference can be a controller, it returns an error if
    // there is another OwnerReference with Controller flag set.
    SetControllerReference = controllerutil.SetControllerReference

    // SetupSignalHandler registered for SIGTERM and SIGINT. A stop channel is returned
    // which is closed on one of these signals. If a second signal is caught, the program
    // is terminated with exit code 1.
    SetupSignalHandler = signals.SetupSignalHandler

    // Log is the base logger used by controller-runtime.  It delegates
    // to another logr.Logger.  You *must* call SetLogger to
    // get any actual logging.
    Log = log.Log

    // SetLogger sets a concrete logging implementation for all deferred Loggers.
    SetLogger = log.SetLogger
)

type Builder Uses

type Builder = builder.Builder

Builder builds an Application ControllerManagedBy (e.g. Operator) and returns a manager.Manager to start it.

type GroupResource Uses

type GroupResource = schema.GroupResource

GroupResource specifies a Group and a Resource, but does not force a version. This is useful for identifying concepts during lookup stages without having partially valid types

type GroupVersion Uses

type GroupVersion = schema.GroupVersion

GroupVersion contains the "group" and the "version", which uniquely identifies the API.

type Manager Uses

type Manager = manager.Manager

Manager initializes shared dependencies such as Caches and Clients, and provides them to Runnables. A Manager is required to create Controllers.

type ObjectMeta Uses

type ObjectMeta = metav1.ObjectMeta

ObjectMeta is metadata that all persisted resources must have, which includes all objects users must create.

type Options Uses

type Options = manager.Options

Options are the arguments for creating a new Manager

type Request Uses

type Request = reconcile.Request

Request contains the information necessary to reconcile a Kubernetes object. This includes the information to uniquely identify the object - its Name and Namespace. It does NOT contain information about any specific Event or the object contents itself.

type Result Uses

type Result = reconcile.Result

Result contains the result of a Reconciler invocation.

type SchemeBuilder Uses

type SchemeBuilder = scheme.Builder

Builder builds a new Scheme for mapping go types to Kubernetes GroupVersionKinds.

type TypeMeta Uses

type TypeMeta = metav1.TypeMeta

TypeMeta describes an individual object in an API response or request with strings representing the type of the object and its API schema version. Structures that are versioned or persisted should inline TypeMeta.

+k8s:deepcopy-gen=false

Directories

PathSynopsis
example
pkgPackage pkg provides libraries for building Controllers.
pkg/builderPackage builder provides wraps other controller-runtime libraries and exposes simple patterns for building common Controllers.
pkg/cache
pkg/cache/informertest
pkg/client
pkg/client/apiutil
pkg/client/configPackage config contains libraries for initializing rest configs for talking to the Kubernetes API
pkg/client/fakePackage fake provides a fake client for testing.
pkg/controllerPackage controller provides types and functions for building Controllers.
pkg/controller/controllertestPackage controllertest contains fake informers for testing controllers
pkg/controller/controllerutilPackage controllerutil contains utility functions for working with and implementing Controllers.
pkg/envtestPackage envtest provides libraries for integration testing by starting a local control plane
pkg/envtest/printer
pkg/eventPackage event contains the definitions for the Event types produced by source.Sources and transformed into reconcile.Requests by handler.EventHandler.
pkg/handlerPackage handler defines EventHandlers that enqueue reconcile.Requests in response to Create, Update, Deletion Events observed from Watching Kubernetes APIs.
pkg/internal/admissionPackage admission provides libraries for creating admission webhooks.
pkg/internal/controller
pkg/leaderelectionPackage leaderelection contains a constructors for a leader election resource lock
pkg/logPackage log contains utilities for fetching a new logger when one is not already available.
pkg/log/zapPackage zap contains helpers for setting up a new logr.Logger instance using the Zap logging framework.
pkg/managerPackage manager is required to create Controllers and provides shared dependencies such as clients, caches, schemes, etc.
pkg/predicatePackage predicate defines Predicates used by Controllers to filter Events before they are provided to EventHandlers.
pkg/reconcilePackage reconcile defines the Reconciler interface to implement Kubernetes APIs.
pkg/reconcile/reconciletest
pkg/recorder
pkg/runtime/injectPackage inject defines interfaces and functions for propagating dependencies from a ControllerManager to the components registered with it.
pkg/runtime/logPackage log contains utilities for fetching a new logger when one is not already available.
pkg/runtime/scheme
pkg/runtime/signalsPackage signals contains libraries for handling signals to shutdown the system.
pkg/sourcePackage source provides event streams provided to Controllers through Controller.Watch.
pkg/source/internal
pkg/webhookPackage webhook provides methods to build and bootstrap a webhook server.
pkg/webhook/admissionPackage admission provides implementation for admission webhook and methods to implement admission webhook handlers.
pkg/webhook/admission/builderPackage builder provides methods to build admission webhooks.
pkg/webhook/admission/types

Package controllerruntime imports 10 packages (graph). Updated 2019-01-17. Refresh now. Tools for package owners.