What’s in a basic project?
When scaffolding out a new project, Kubebuilder provides us with a fewbasic pieces of boilerplate.
Build Infrastructure
First up, basic infrastructure for building your project:
go.mod
: A new Go module matching our project, with basic dependencies
module tutorial.kubebuilder.io/project
go 1.12
require (
github.com/go-logr/logr v0.1.0
github.com/gogo/protobuf v1.2.1 // indirect
github.com/json-iterator/go v1.1.6 // indirect
github.com/modern-go/reflect2 v1.0.1 // indirect
github.com/onsi/ginkgo v1.8.0 // indirect
github.com/onsi/gomega v1.5.0 // indirect
github.com/robfig/cron v1.1.0
github.com/spf13/pflag v1.0.3 // indirect
golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09 // indirect
golang.org/x/sys v0.0.0-20190429190828-d89cdac9e872 // indirect
golang.org/x/text v0.3.2 // indirect
gopkg.in/yaml.v2 v2.2.2 // indirect
k8s.io/api v0.0.0-20190409021203-6e4e0e4f393b
k8s.io/apimachinery v0.0.0-20190404173353-6a84e37a896d
k8s.io/client-go v11.0.1-0.20190409021438-1a26190bd76a+incompatible
sigs.k8s.io/controller-runtime v0.2.0-beta.4
)
Makefile
: Make targets for building and deploying your controller
# Image URL to use all building/pushing image targets
IMG ?= controller:latest
# Produce CRDs that work back to Kubernetes 1.11 (no version conversion)
CRD_OPTIONS ?= "crd:trivialVersions=true"
all: manager
# Run tests
test: generate fmt vet manifests
go test ./api/… ./controllers/… -coverprofile cover.out
# Build manager binary
manager: generate fmt vet
go build -o bin/manager main.go
# Run against the configured Kubernetes cluster in ~/.kube/config
run: generate fmt vet
go run ./main.go
# Install CRDs into a cluster
install: manifests
kubectl apply -f config/crd/bases
# Deploy controller in the configured Kubernetes cluster in ~/.kube/config
deploy: manifests
kubectl apply -f config/crd/bases
kustomize build config/default | kubectl apply -f -
# Generate manifests e.g. CRD, RBAC etc.
manifests: controller-gen
$(CONTROLLER_GEN) $(CRD_OPTIONS) rbac:roleName=manager-role webhook paths="./api/…;./controllers/…" output:crd:artifacts:config=config/crd/bases
# Run go fmt against code
fmt:
go fmt ./…
# Run go vet against code
vet:
go vet ./…
# Generate code
generate: controller-gen
$(CONTROLLER_GEN) object:headerFile=./hack/boilerplate.go.txt paths=./api/…
# Build the docker image
docker-build: test
docker build . -t ${IMG}
@echo "updating kustomize image patch file for manager resource"
sed -i'' -e 's@image: .*@image: '"${IMG}"'@' ./config/default/manager_image_patch.yaml
# Push the docker image
docker-push:
docker push ${IMG}
# find or download controller-gen
# download controller-gen if necessary
controller-gen:
ifeq (, $(shell which controller-gen))
go get sigs.k8s.io/controller-tools/cmd/controller-gen@v0.2.0-beta.3
CONTROLLER_GEN=$(shell go env GOPATH)/bin/controller-gen
else
CONTROLLER_GEN=$(shell which controller-gen)
endif
PROJECT
: Kubebuilder metadata for scaffolding new components
version: "2"
domain: tutorial.kubebuilder.io
repo: tutorial.kubebuilder.io/project
Launch Configuration
We also get launch configurations under theconfig/
directory. Right now, it just containsKustomize YAML definitions required tolaunch our controller on a cluster, but once we get started writing ourcontroller, it’ll also hold our CustomResourceDefinitions, RBACconfiguration, and WebhookConfigurations.
config/default
contains a Kustomize base for launchingthe controller in a standard configuration.
Each other directory contains a different piece of configuration,refactored out into its own base:
config/manager
: launch your controllers as pods in theclusterconfig/rbac
: permissions required to run yourcontrollers under their own service account
The Entrypoint
Last, but certainly not least, Kubebuilder scaffolds out the basicentrypoint of our project: main.go
. Let’s take a look at that next…