Back to Kubebuilder

Quick Start

docs/book/src/quick-start.md

4.13.110.0 KB
Original Source

Quick Start

This Quick Start guide will cover:

Prerequisites

  • go version v1.24.6+
  • docker version 17.03+.
  • kubectl version v1.11.3+.
  • Access to a Kubernetes v1.11.3+ cluster.
<aside class="note"> <h1>Versions Compatibility and Supportability</h1>

Please, ensure that you see the guidance.

</aside>

Installation

Install kubebuilder:

bash
# download kubebuilder and install locally.
curl -L -o kubebuilder "https://go.kubebuilder.io/dl/latest/$(go env GOOS)/$(go env GOARCH)"
chmod +x kubebuilder && sudo mv kubebuilder /usr/local/bin/
<aside class="note"> <h1>Using the Master Branch</h1>

You can work with the master branch by cloning the repository and running make install to generate the binary. Please follow the steps in the section How to Build Kubebuilder Locally from the Contributing Guide.

</aside> <aside class="note"> <h1>Enabling shell autocompletion</h1>

Kubebuilder provides autocompletion support via the command kubebuilder completion <bash|fish|powershell|zsh>, which can save you a lot of typing. For further information see the completion document.

</aside>

Create a Project

Create a directory, and then run the init command inside of it to initialize a new project. Follows an example.

bash
mkdir -p ~/projects/guestbook
cd ~/projects/guestbook
kubebuilder init --domain my.domain --repo my.domain/guestbook
<aside class="note"> <h1>Developing in $GOPATH</h1>

If your project is initialized within GOPATH, the implicitly called go mod init will interpolate the module path for you. Otherwise --repo=<module path> must be set.

Read the Go modules blogpost if unfamiliar with the module system.

</aside>

Create an API

Run the following command to create a new API (group/version) as webapp/v1 and the new Kind(CRD) Guestbook on it:

bash
kubebuilder create api --group webapp --version v1 --kind Guestbook
<aside class="note"> <h1>Press Options</h1>

If you press y for Create Resource [y/n] and for Create Controller [y/n] then this will create the files api/v1/guestbook_types.go where the API is defined and the internal/controller/guestbook_controller.go where the reconciliation business logic is implemented for this Kind(CRD).

</aside>

OPTIONAL: Edit the API definition and the reconciliation business logic. For more info see Designing an API and What's in a Controller.

If you are editing the API definitions, generate the manifests such as Custom Resources (CRs) or Custom Resource Definitions (CRDs) using

bash
make manifests
<details><summary>Click here to see an example. <tt>(api/v1/guestbook_types.go)</tt></summary> <p>
go
// GuestbookSpec defines the desired state of Guestbook
type GuestbookSpec struct {
	// INSERT ADDITIONAL SPEC FIELDS - desired state of cluster
	// Important: Run "make" to regenerate code after modifying this file

	// Quantity of instances
	// +kubebuilder:validation:Minimum=1
	// +kubebuilder:validation:Maximum=10
	Size int32 `json:"size"`

	// Name of the ConfigMap for GuestbookSpec's configuration
	// +kubebuilder:validation:MaxLength=15
	// +kubebuilder:validation:MinLength=1
	ConfigMapName string `json:"configMapName"`

	// +kubebuilder:validation:Enum=Phone;Address;Name
	Type string `json:"type,omitempty"`
}

// GuestbookStatus defines the observed state of Guestbook
type GuestbookStatus struct {
	// INSERT ADDITIONAL STATUS FIELD - define observed state of cluster
	// Important: Run "make" to regenerate code after modifying this file

	// PodName of the active Guestbook node.
	Active string `json:"active"`

	// PodNames of the standby Guestbook nodes.
	Standby []string `json:"standby"`
}

// +kubebuilder:object:root=true
// +kubebuilder:subresource:status
// +kubebuilder:resource:scope=Cluster

// Guestbook is the Schema for the guestbooks API
type Guestbook struct {
	metav1.TypeMeta   `json:",inline"`
	metav1.ObjectMeta `json:"metadata,omitempty"`

	Spec   GuestbookSpec   `json:"spec,omitempty"`
	Status GuestbookStatus `json:"status,omitempty"`
}
</p> </details> <aside class="note"> <h1> `+kubebuilder` markers </h1>

+kubebuilder are markers processed by controller-gen to generate CRDs and RBAC. Kubebuilder also provides scaffolding markers to inject code into existing files and simplify common tasks. See cmd/main.go for examples.

</aside>

Test It Out

You'll need a Kubernetes cluster to run against. You can use KinD to get a local cluster for testing, or run against a remote cluster.

<aside class="note"> <h1>Context Used</h1>

Your controller will automatically use the current context in your kubeconfig file (i.e. whatever cluster kubectl cluster-info shows).

</aside>

Install the CRDs into the cluster:

bash
make install

For quick feedback and code-level debugging, run your controller (this will run in the foreground, so switch to a new terminal if you want to leave it running):

bash
make run

Install Instances of Custom Resources

If you pressed y for Create Resource [y/n] then you created a CR for your CRD in your config/samples/ directory.

Edit config/samples/webapp_v1_guestbook.yaml to contain a valid spec. For example:

yaml
# ...
spec:
  foo: bar

Hint: "foo" is a string field defined in api/v1/guestbook_types.go:

go
// foo is an example field of Guestbook. Edit guestbook_types.go to remove/update
// +optional
Foo *string `json:"foo,omitempty"`
bash
kubectl apply -k config/samples/

You can have a look at your applied resource now:

bash
kubectl get guestbooks.webapp.my.domain guestbook-sample -o yaml

Run It On the Cluster

When your controller is ready to be packaged and tested in other clusters.

Build and push your image to the location specified by IMG:

bash
make docker-build docker-push IMG=<some-registry>/<project-name>:tag

Deploy the controller to the cluster with image specified by IMG:

bash
make deploy IMG=<some-registry>/<project-name>:tag
<aside class="note"> <h1>Registry Permission</h1>

This image ought to be published in the personal registry you specified. And it is required to have access to pull the image from the working environment. Make sure you have the proper permission to the registry if the above commands don't work.

Consider incorporating Kind into your workflow for a faster, more efficient local development and CI experience. Note that, if you're using a Kind cluster, there's no need to push your image to a remote container registry. You can directly load your local image into your specified Kind cluster:

bash
kind load docker-image <your-image-name>:tag --name <your-kind-cluster-name>

It is highly recommended to use Kind for development purposes and CI. To know more, see: Using Kind For Development Purposes and CI

<h1>RBAC errors</h1>

If you encounter RBAC errors, you may need to grant yourself cluster-admin privileges or be logged in as admin. See Prerequisites for using Kubernetes RBAC on GKE cluster v1.11.x and older which may be your case.

</aside>

Uninstall CRDs

To delete your CRDs from the cluster:

bash
make uninstall

Undeploy controller

Undeploy the controller to the cluster:

bash
make undeploy

Using Plugins

Kubebuilder design is based on Plugins and you can use available plugins to add optional features to your project.

<aside class="note"> <h1>References and Examples</h1>

Use the Deploy Image Plugin (deploy-image/v1-alpha) as a reference when creating your project. It follows Kubernetes conventions and recommended good practices. For example:

bash
kubebuilder create api --group webapp --version v1alpha1 --kind Busybox --image=busybox:1.36.1 --plugins="deploy-image/v1-alpha"
</aside> <aside class="note"> <h1> Keeping your project up to date with ecosystem changes </h1>

Use AutoUpdate Plugin to keep your project aligned with the latest ecosystem changes. When a new release is available, it automatically opens an issue with a PR comparison link so you can review and update easily.

bash
kubebuilder edit --plugins="autoupdate/v1-alpha"
</aside>

Next Steps