README ¶
controller-k8s-cronjob
See the Tutorial: Building CronJob - The Kubebuilder Book documentation.
Overview
Develop
Scaffolding Out Our Project
program | version |
---|---|
go | 1.15.1 |
kubebuilder | 2.3.1 |
$ go version
$ kubebuilder version
Result
$ go version
go version go1.15.1 linux/amd64
$ kubebuilder version
Version: version.Version{KubeBuilderVersion:"2.3.1", KubernetesVendor:"1.16.4", GitCommit:"8b53abeb4280186e494b726edf8f54ca7aa64a49", BuildDate:"2020-03-26T16:42:00Z", GoOs:"unknown", GoArch:"unknown"}
$ go mod init github.com/transnano/controller-k8s-cronjob
$ kubebuilder init --domain transnano.net --license apache2 --owner "Transnano"
Result
$ go mod init github.com/transnano/controller-k8s-cronjob
go: creating new go.mod: module github.com/transnano/controller-k8s-cronjob
$ kubebuilder init --domain transnano.net --license apache2 --owner "Transnano"Writing scaffold for you to edit...
Get controller runtime:
$ go get sigs.k8s.io/controller-runtime@v0.5.0
go: downloading sigs.k8s.io/controller-runtime v0.5.0
go: downloading k8s.io/apimachinery v0.17.2
go: downloading k8s.io/client-go v0.17.2
go: downloading golang.org/x/time v0.0.0-20190308202827-9d24e82272b4
go: downloading github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d
go: downloading github.com/evanphx/json-patch v4.5.0+incompatible
go: downloading github.com/pkg/errors v0.8.1
go: downloading github.com/google/gofuzz v1.0.0
go: downloading github.com/json-iterator/go v1.1.8
go: downloading github.com/prometheus/client_golang v1.0.0
go: downloading gopkg.in/inf.v0 v0.9.1
go: downloading github.com/modern-go/reflect2 v1.0.1
go: downloading github.com/prometheus/common v0.4.1
go: downloading sigs.k8s.io/yaml v1.1.0
go: downloading github.com/beorn7/perks v1.0.0
go: downloading github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd
go: downloading gopkg.in/yaml.v2 v2.2.4
go: downloading k8s.io/apiextensions-apiserver v0.17.2
go: downloading k8s.io/utils v0.0.0-20191114184206-e782cd3c129f
go: downloading golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456
go: downloading gopkg.in/fsnotify.v1 v1.4.7
go: downloading github.com/golang/protobuf v1.3.2
go: downloading github.com/google/go-cmp v0.3.0
go: downloading github.com/google/uuid v1.1.1
go: downloading k8s.io/api v0.17.2
go: downloading k8s.io/klog v1.0.0
go: downloading github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90
go: downloading github.com/imdario/mergo v0.3.6
go: downloading github.com/davecgh/go-spew v1.1.1
go: downloading gomodules.xyz/jsonpatch/v2 v2.0.1
go: downloading github.com/hashicorp/golang-lru v0.5.1
go: downloading golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45
go: downloading github.com/matttproud/golang_protobuf_extensions v1.0.1
go: downloading github.com/prometheus/procfs v0.0.2
go: downloading golang.org/x/net v0.0.0-20191004110552-13f9640d40b9
go: downloading github.com/googleapis/gnostic v0.3.1
go: downloading github.com/go-logr/logr v0.1.0
go: downloading golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586
go: downloading github.com/spf13/pflag v1.0.5
go: downloading github.com/golang/groupcache v0.0.0-20180513044358-24b0969c4cb7
go: downloading google.golang.org/appengine v1.5.0
go: downloading k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a
go: downloading golang.org/x/text v0.3.2
Update go.mod:
$ go mod tidy
go: downloading go.uber.org/zap v1.10.0
go: downloading github.com/go-logr/zapr v0.1.0
go: downloading github.com/onsi/ginkgo v1.11.0
go: downloading cloud.google.com/go v0.38.0
go: downloading github.com/stretchr/testify v1.4.0
go: downloading github.com/onsi/gomega v1.8.1
go: downloading gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127
go: downloading github.com/pmezard/go-difflib v1.0.0
go: downloading github.com/kr/pretty v0.1.0
go: downloading golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7
go: downloading github.com/fsnotify/fsnotify v1.4.7
go: downloading go.uber.org/multierr v1.1.0
go: downloading go.uber.org/atomic v1.3.2
go: downloading github.com/hpcloud/tail v1.0.0
go: downloading github.com/kr/text v0.1.0
go: downloading gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7
Running make:
$ make
go: creating new go.mod: module tmp
go: downloading sigs.k8s.io/controller-tools v0.2.5
go: found sigs.k8s.io/controller-tools/cmd/controller-gen in sigs.k8s.io/controller-tools v0.2.5
go: downloading k8s.io/apimachinery v0.17.0
go: downloading github.com/spf13/cobra v0.0.5
go: downloading k8s.io/api v0.17.0
go: downloading k8s.io/apiextensions-apiserver v0.17.0
go: downloading github.com/fatih/color v1.7.0
go: downloading gopkg.in/yaml.v3 v3.0.0-20190905181640-827449938966
go: downloading github.com/gobuffalo/flect v0.2.0
go: downloading golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72
go: downloading github.com/inconshreveable/mousetrap v1.0.0
go: downloading github.com/mattn/go-isatty v0.0.8
go: downloading github.com/mattn/go-colorable v0.1.2
/go/bin/controller-gen object:headerFile="hack/boilerplate.go.txt" paths="./..."
go fmt ./...
go vet ./...
go build -o bin/manager main.go
Next: define a resource with:
$ kubebuilder create api
main.go
でマネージャーを作成しているが、名前空間を指定していないため、すべての名前空間を監視します。
mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{
Scheme: scheme,
MetricsBindAddress: metricsAddr,
Port: 9443,
// Namespace: "",
LeaderElection: enableLeaderElection,
LeaderElectionID: "77aadf3c.transnano.net",
})
Ref: Every journey needs a start, every program a main - The Kubebuilder Book
Result
Adding a new API
$ kubebuilder create api --group batch --version v1alpha1 --kind CronJob
Result
$ kubebuilder create api --group batch --version v1alpha1 --kind CronJob
Create Resource [y/n]
y
Create Controller [y/n]
y
Writing scaffold for you to edit...
api/v1alpha1/cronjob_types.go
controllers/cronjob_controller.go
Running make:
$ make
/go/bin/controller-gen object:headerFile="hack/boilerplate.go.txt" paths="./..."
go fmt ./...
go vet ./...
go build -o bin/manager main.go
Designing an API
$ vim ./api/v1alpha1/cronjob_types.go
Result
Implementing a controller
$ vim ./controllers/cronjob_controller.go
Result
Implementing defaulting/validating webhooks
$ kubebuilder create webhook --group batch --version v1alpha1 --kind CronJob --defaulting --programmatic-validation
Result
$ kubebuilder create webhook --group batch --version v1alpha1 --kind CronJob --defaulting --programmatic-validation
Writing scaffold for you to edit...
api/v1alpha1/cronjob_webhook.go
$ vim ./api/v1alpha1/cronjob_webhook.go
Result
Generate config files
$ make
Result
$ make
/go/bin/controller-gen object:headerFile="hack/boilerplate.go.txt" paths="./..."
go fmt ./...
go vet ./...
go build -o bin/manager main.go
Demo
Run the following command from a location where you can connect to the cluster.
program | version |
---|---|
kubernetes | v1.17.9-gke.1504 |
go | 1.15.2 |
kubectl | v1.19.1 |
kustomize | v3.8.4 |
Running and deploying the controller
Download Kustomize(Binaries)
$ curl -s "https://raw.githubusercontent.com/\
kubernetes-sigs/kustomize/master/hack/install_kustomize.sh" | bash
$ sudo mv kustomize /usr/local/bin/
$ go version
$ kubectl version --short
$ kustomize version
Result
$ go version
go version go1.15.2 linux/amd64
$ kubectl version --short
Client Version: v1.19.1
Server Version: v1.17.9-gke.1504
$ kustomize version
{Version:kustomize/v3.8.4 GitCommit:8285af8cf11c0b202be533e02b88e114ad61c1a9 BuildDate:2020-09-19T15:39:21Z GoOs:linux GoArch:amd64}
$ openssl req -new -newkey rsa:4096 -x509 -sha256 -days 365 -nodes -out tls.crt -keyout tls.key
$ chmod 400 tls.key
$ ls tls.{crt,key}
tls.crt tls.key
$ mkdir -p /tmp/k8s-webhook-server/serving-certs/
$ mv tls.{crt,key} /tmp/k8s-webhook-server/serving-certs/
$ make install
Result
$ openssl req -new -newkey rsa:4096 -x509 -sha256 -days 365 -nodes -out tls.crt -keyout tls.key
Generating a RSA private key
........++++
..............................................................................................................................................................................................................................................................................................................++++
writing new private key to 'tls.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:JP
Locality Name (eg, city) []:Tokyo
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Tokyo Ltd
Organizational Unit Name (eg, section) []:Docs
Common Name (e.g. server FQDN or YOUR name) []:hostname.example.com
Email Address []:admin@example.com
Google Cloud ShellにおけるGoの開発環境の構築
Update go
$ wget -O - https://dl.google.com/go/go1.15.2.linux-amd64.tar.gz | tar zxvf -
$ mv go go_1_15_2
$ export GOROOT=$HOME/go_1_15_2
$ export PATH=$GOROOT/bin:$PATH
$ go version
go version go1.15.2 linux/amd64
make install
$ make install
Result
$ make install
/home/$USER/gopath/bin/controller-gen "crd:trivialVersions=true" rbac:roleName=manager-role webhook paths="./..." output:crd:artifacts:config=config/crd/bases
kustomize build config/crd | kubectl apply -f -
customresourcedefinition.apiextensions.k8s.io/cronjobs.batch.transnano.net created
make run
$ make run
Result
$ make run
/home/$USER/gopath/bin/controller-gen object:headerFile="hack/boilerplate.go.txt" paths="./..."
go fmt ./...
go vet ./...
/home/$USER/gopath/bin/controller-gen "crd:trivialVersions=true" rbac:roleName=manager-role webhook paths="./..." output:crd:artifacts:config=config/crd/bases
go run ./main.go
2020-09-22T07:51:58.235Z INFO controller-runtime.metrics metrics server is starting to listen {"addr": ":8080"}
2020-09-22T07:51:58.235Z INFO controller-runtime.builder Registering a mutating webhook {"GVK": "batch.transnano.net/v1alpha1, Kind=CronJob", "path": "/mutate-batch-transnano-net-v1alpha1-cronjob"}
2020-09-22T07:51:58.235Z INFO controller-runtime.webhook registering webhook {"path": "/mutate-batch-transnano-net-v1alpha1-cronjob"}
2020-09-22T07:51:58.236Z INFO controller-runtime.builder Registering a validating webhook {"GVK": "batch.transnano.net/v1alpha1, Kind=CronJob", "path": "/validate-batch-transnano-net-v1alpha1-cronjob"}
2020-09-22T07:51:58.236Z INFO controller-runtime.webhook registering webhook {"path": "/validate-batch-transnano-net-v1alpha1-cronjob"}
2020-09-22T07:51:58.236Z INFO setup starting manager
2020-09-22T07:51:58.438Z INFO controller-runtime.webhook.webhooks starting webhook server
2020-09-22T07:51:58.438Z INFO controller Starting EventSource {"reconcilerGroup": "batch.transnano.net", "reconcilerKind": "CronJob", "controller": "cronjob", "source": "kind source: /, Kind="}
2020-09-22T07:51:58.438Z INFO controller-runtime.manager starting metrics server {"path": "/metrics"}
2020-09-22T07:51:58.439Z INFO controller-runtime.certwatcher Updated current TLS certificate
2020-09-22T07:51:58.440Z INFO controller-runtime.webhook serving webhook server {"host": "", "port": 9443}
2020-09-22T07:51:58.440Z INFO controller-runtime.certwatcher Starting certificate watcher
2020-09-22T07:51:58.639Z INFO controller Starting EventSource {"reconcilerGroup": "batch.transnano.net", "reconcilerKind": "CronJob", "controller": "cronjob", "source": "kind source: /, Kind="}
2020-09-22T07:51:58.639Z INFO controller Starting Controller {"reconcilerGroup": "batch.transnano.net", "reconcilerKind": "CronJob", "controller": "cronjob"}
2020-09-22T07:51:58.639Z INFO controller Starting workers {"reconcilerGroup": "batch.transnano.net", "reconcilerKind": "CronJob", "controller": "cronjob", "worker count": 1}
2020-09-22T07:51:58.639Z DEBUG controllers.CronJob job count {"cronjob": "default/cronjob-sample", "active jobs": 0, "successful jobs": 0, "failed jobs": 0}
2020-09-22T07:51:59.040Z DEBUG controllers.CronJob created Job for CronJob run {"cronjob": "default/cronjob-sample", "now": "2020-09-22T07:51:58.835Z", "next run": "2020-09-22T07:52:00.000Z", "current run": "2020-09-22T07:51:00.000Z", "job": {"namespace": "default", "name": "cronjob-sample-1600761060"}}
2020-09-22T07:51:59.040Z DEBUG controller Successfully Reconciled {"reconcilerGroup": "batch.transnano.net", "reconcilerKind": "CronJob", "controller": "cronjob", "name": "cronjob-sample", "namespace": "default"}
2020-09-22T07:51:59.040Z DEBUG controllers.CronJob job count {"cronjob": "default/cronjob-sample", "active jobs": 0, "successful jobs": 0, "failed jobs": 0}
2020-09-22T07:51:59.369Z ERROR controllers.CronJob unable to create Job for CronJob {"cronjob": "default/cronjob-sample", "now": "2020-09-22T07:51:59.201Z", "next run": "2020-09-22T07:52:00.000Z", "current run": "2020-09-22T07:51:00.000Z", "job": {"namespace": "default", "name": "cronjob-sample-1600761060"}, "error": "jobs.batch \"cronjob-sample-1600761060\" already exists"}
github.com/go-logr/zapr.(*zapLogger).Error
/home/$USER/gopath/pkg/mod/github.com/go-logr/zapr@v0.1.0/zapr.go:128
github.com/transnano/controller-k8s-cronjob/controllers.(*CronJobReconciler).Reconcile
/home/$USER/controller-k8s-cronjob/controllers/cronjob_controller.go:483
sigs.k8s.io/controller-runtime/pkg/internal/controller.(*Controller).reconcileHandler
/home/$USER/gopath/pkg/mod/sigs.k8s.io/controller-runtime@v0.6.2/pkg/internal/controller/controller.go:235
sigs.k8s.io/controller-runtime/pkg/internal/controller.(*Controller).processNextWorkItem
/home/$USER/gopath/pkg/mod/sigs.k8s.io/controller-runtime@v0.6.2/pkg/internal/controller/controller.go:209
sigs.k8s.io/controller-runtime/pkg/internal/controller.(*Controller).worker
/home/$USER/gopath/pkg/mod/sigs.k8s.io/controller-runtime@v0.6.2/pkg/internal/controller/controller.go:188
k8s.io/apimachinery/pkg/util/wait.BackoffUntil.func1
/home/$USER/gopath/pkg/mod/k8s.io/apimachinery@v0.18.6/pkg/util/wait/wait.go:155
k8s.io/apimachinery/pkg/util/wait.BackoffUntil
/home/$USER/gopath/pkg/mod/k8s.io/apimachinery@v0.18.6/pkg/util/wait/wait.go:156
k8s.io/apimachinery/pkg/util/wait.JitterUntil
/home/$USER/gopath/pkg/mod/k8s.io/apimachinery@v0.18.6/pkg/util/wait/wait.go:133
k8s.io/apimachinery/pkg/util/wait.Until
/home/$USER/gopath/pkg/mod/k8s.io/apimachinery@v0.18.6/pkg/util/wait/wait.go:90
2020-09-22T07:51:59.369Z ERROR controller Reconciler error {"reconcilerGroup": "batch.transnano.net", "reconcilerKind": "CronJob", "controller": "cronjob", "name": "cronjob-sample", "namespace": "default", "error": "jobs.batch \"cronjob-sample-1600761060\" already exists"}
github.com/go-logr/zapr.(*zapLogger).Error
/home/$USER/gopath/pkg/mod/github.com/go-logr/zapr@v0.1.0/zapr.go:128
sigs.k8s.io/controller-runtime/pkg/internal/controller.(*Controller).reconcileHandler
/home/$USER/gopath/pkg/mod/sigs.k8s.io/controller-runtime@v0.6.2/pkg/internal/controller/controller.go:237
sigs.k8s.io/controller-runtime/pkg/internal/controller.(*Controller).processNextWorkItem
/home/$USER/gopath/pkg/mod/sigs.k8s.io/controller-runtime@v0.6.2/pkg/internal/controller/controller.go:209
sigs.k8s.io/controller-runtime/pkg/internal/controller.(*Controller).worker
/home/$USER/gopath/pkg/mod/sigs.k8s.io/controller-runtime@v0.6.2/pkg/internal/controller/controller.go:188
k8s.io/apimachinery/pkg/util/wait.BackoffUntil.func1
/home/$USER/gopath/pkg/mod/k8s.io/apimachinery@v0.18.6/pkg/util/wait/wait.go:155
k8s.io/apimachinery/pkg/util/wait.BackoffUntil
/home/$USER/gopath/pkg/mod/k8s.io/apimachinery@v0.18.6/pkg/util/wait/wait.go:156
k8s.io/apimachinery/pkg/util/wait.JitterUntil
/home/$USER/gopath/pkg/mod/k8s.io/apimachinery@v0.18.6/pkg/util/wait/wait.go:133
k8s.io/apimachinery/pkg/util/wait.Until
/home/$USER/gopath/pkg/mod/k8s.io/apimachinery@v0.18.6/pkg/util/wait/wait.go:90
2020-09-22T07:52:00.370Z DEBUG controllers.CronJob job count {"cronjob": "default/cronjob-sample", "active jobs": 1, "successful jobs": 0, "failed jobs": 0}
2020-09-22T07:52:00.696Z DEBUG controllers.CronJob created Job for CronJob run {"cronjob": "default/cronjob-sample", "now": "2020-09-22T07:52:00.531Z", "next run": "2020-09-22T07:53:00.000Z", "current run": "2020-09-22T07:52:00.000Z", "job": {"namespace": "default", "name": "cronjob-sample-1600761120"}}
2020-09-22T07:52:00.696Z DEBUG controller Successfully Reconciled {"reconcilerGroup": "batch.transnano.net", "reconcilerKind": "CronJob", "controller": "cronjob", "name": "cronjob-sample", "namespace": "default"}
2020-09-22T07:52:00.696Z DEBUG controllers.CronJob job count {"cronjob": "default/cronjob-sample", "active jobs": 2, "successful jobs": 0, "failed jobs": 0}
2020-09-22T07:52:00.860Z DEBUG controllers.CronJob no upcoming scheduled times, sleeping until next {"cronjob": "default/cronjob-sample", "now": "2020-09-22T07:52:00.860Z", "next run": "2020-09-22T07:53:00.000Z"}
2020-09-22T07:52:00.860Z DEBUG controllers.CronJob job count {"cronjob": "default/cronjob-sample", "active jobs": 2, "successful jobs": 0, "failed jobs": 0}
2020-09-22T07:52:01.022Z DEBUG controllers.CronJob no upcoming scheduled times, sleeping until next {"cronjob": "default/cronjob-sample", "now": "2020-09-22T07:52:01.022Z", "next run": "2020-09-22T07:53:00.000Z"}
2020-09-22T07:52:01.022Z DEBUG controllers.CronJob job count {"cronjob": "default/cronjob-sample", "active jobs": 2, "successful jobs": 0, "failed jobs": 0}
2020-09-22T07:52:01.183Z DEBUG controllers.CronJob no upcoming scheduled times, sleeping until next {"cronjob": "default/cronjob-sample", "now": "2020-09-22T07:52:01.183Z", "next run": "2020-09-22T07:53:00.000Z"}
2020-09-22T07:52:01.228Z DEBUG controllers.CronJob job count {"cronjob": "default/cronjob-sample", "active jobs": 1, "successful jobs": 1, "failed jobs": 0}
2020-09-22T07:52:01.389Z DEBUG controllers.CronJob no upcoming scheduled times, sleeping until next {"cronjob": "default/cronjob-sample", "now": "2020-09-22T07:52:01.389Z", "next run": "2020-09-22T07:53:00.000Z"}
2020-09-22T07:52:01.389Z DEBUG controllers.CronJob job count {"cronjob": "default/cronjob-sample", "active jobs": 1, "successful jobs": 1, "failed jobs": 0}
2020-09-22T07:52:01.550Z DEBUG controllers.CronJob no upcoming scheduled times, sleeping until next {"cronjob": "default/cronjob-sample", "now": "2020-09-22T07:52:01.550Z", "next run": "2020-09-22T07:53:00.000Z"}
2020-09-22T07:52:02.167Z DEBUG controllers.CronJob job count {"cronjob": "default/cronjob-sample", "active jobs": 0, "successful jobs": 2, "failed jobs": 0}
2020-09-22T07:52:02.331Z DEBUG controllers.CronJob no upcoming scheduled times, sleeping until next {"cronjob": "default/cronjob-sample", "now": "2020-09-22T07:52:02.331Z", "next run": "2020-09-22T07:53:00.000Z"}
2020-09-22T07:52:02.331Z DEBUG controllers.CronJob job count {"cronjob": "default/cronjob-sample", "active jobs": 0, "successful jobs": 2, "failed jobs": 0}
2020-09-22T07:52:02.492Z DEBUG controllers.CronJob no upcoming scheduled times, sleeping until next {"cronjob": "default/cronjob-sample", "now": "2020-09-22T07:52:02.492Z", "next run": "2020-09-22T07:53:00.000Z"}
2020-09-22T07:53:00.000Z DEBUG controllers.CronJob job count {"cronjob": "default/cronjob-sample", "active jobs": 0, "successful jobs": 2, "failed jobs": 0}
2020-09-22T07:53:00.327Z DEBUG controllers.CronJob created Job for CronJob run {"cronjob": "default/cronjob-sample", "now": "2020-09-22T07:53:00.162Z", "next run": "2020-09-22T07:54:00.000Z", "current run": "2020-09-22T07:53:00.000Z", "job": {"namespace": "default", "name": "cronjob-sample-1600761180"}}
2020-09-22T07:53:00.327Z DEBUG controller Successfully Reconciled {"reconcilerGroup": "batch.transnano.net", "reconcilerKind": "CronJob", "controller": "cronjob", "name": "cronjob-sample", "namespace": "default"}
2020-09-22T07:53:00.327Z DEBUG controllers.CronJob job count {"cronjob": "default/cronjob-sample", "active jobs": 1, "successful jobs": 2, "failed jobs": 0}
2020-09-22T07:53:00.488Z DEBUG controllers.CronJob no upcoming scheduled times, sleeping until next {"cronjob": "default/cronjob-sample", "now": "2020-09-22T07:53:00.488Z", "next run": "2020-09-22T07:54:00.000Z"}
2020-09-22T07:53:00.489Z DEBUG controllers.CronJob job count {"cronjob": "default/cronjob-sample", "active jobs": 1, "successful jobs": 2, "failed jobs": 0}
2020-09-22T07:53:00.651Z DEBUG controllers.CronJob no upcoming scheduled times, sleeping until next {"cronjob": "default/cronjob-sample", "now": "2020-09-22T07:53:00.651Z", "next run": "2020-09-22T07:54:00.000Z"}
2020-09-22T07:53:00.651Z DEBUG controllers.CronJob job count {"cronjob": "default/cronjob-sample", "active jobs": 1, "successful jobs": 2, "failed jobs": 0}
2020-09-22T07:53:00.812Z DEBUG controllers.CronJob no upcoming scheduled times, sleeping until next {"cronjob": "default/cronjob-sample", "now": "2020-09-22T07:53:00.812Z", "next run": "2020-09-22T07:54:00.000Z"}
2020-09-22T07:53:01.523Z DEBUG controllers.CronJob job count {"cronjob": "default/cronjob-sample", "active jobs": 0, "successful jobs": 3, "failed jobs": 0}
2020-09-22T07:53:01.684Z DEBUG controllers.CronJob no upcoming scheduled times, sleeping until next {"cronjob": "default/cronjob-sample", "now": "2020-09-22T07:53:01.684Z", "next run": "2020-09-22T07:54:00.000Z"}
2020-09-22T07:53:01.684Z DEBUG controllers.CronJob job count {"cronjob": "default/cronjob-sample", "active jobs": 0, "successful jobs": 3, "failed jobs": 0}
2020-09-22T07:53:01.845Z DEBUG controllers.CronJob no upcoming scheduled times, sleeping until next {"cronjob": "default/cronjob-sample", "now": "2020-09-22T07:53:01.845Z", "next run": "2020-09-22T07:54:00.000Z"}
2020-09-22T07:54:00.000Z DEBUG controllers.CronJob job count {"cronjob": "default/cronjob-sample", "active jobs": 0, "successful jobs": 3, "failed jobs": 0}
2020-09-22T07:54:00.399Z DEBUG controllers.CronJob created Job for CronJob run {"cronjob": "default/cronjob-sample", "now": "2020-09-22T07:54:00.209Z", "next run": "2020-09-22T07:55:00.000Z", "current run": "2020-09-22T07:54:00.000Z", "job": {"namespace": "default", "name": "cronjob-sample-1600761240"}}
2020-09-22T07:54:00.399Z DEBUG controller Successfully Reconciled {"reconcilerGroup": "batch.transnano.net", "reconcilerKind": "CronJob", "controller": "cronjob", "name": "cronjob-sample", "namespace": "default"}
2020-09-22T07:54:00.400Z DEBUG controllers.CronJob job count {"cronjob": "default/cronjob-sample", "active jobs": 1, "successful jobs": 3, "failed jobs": 0}
2020-09-22T07:54:00.561Z DEBUG controllers.CronJob no upcoming scheduled times, sleeping until next {"cronjob": "default/cronjob-sample", "now": "2020-09-22T07:54:00.561Z", "next run": "2020-09-22T07:55:00.000Z"}
2020-09-22T07:54:00.561Z DEBUG controllers.CronJob job count {"cronjob": "default/cronjob-sample", "active jobs": 1, "successful jobs": 3, "failed jobs": 0}
2020-09-22T07:54:00.721Z DEBUG controllers.CronJob no upcoming scheduled times, sleeping until next {"cronjob": "default/cronjob-sample", "now": "2020-09-22T07:54:00.721Z", "next run": "2020-09-22T07:55:00.000Z"}
2020-09-22T07:54:00.722Z DEBUG controllers.CronJob job count {"cronjob": "default/cronjob-sample", "active jobs": 1, "successful jobs": 3, "failed jobs": 0}
2020-09-22T07:54:00.882Z DEBUG controllers.CronJob no upcoming scheduled times, sleeping until next {"cronjob": "default/cronjob-sample", "now": "2020-09-22T07:54:00.882Z", "next run": "2020-09-22T07:55:00.000Z"}
2020-09-22T07:54:02.121Z DEBUG controllers.CronJob job count {"cronjob": "default/cronjob-sample", "active jobs": 0, "successful jobs": 4, "failed jobs": 0}
2020-09-22T07:54:02.281Z DEBUG controllers.CronJob no upcoming scheduled times, sleeping until next {"cronjob": "default/cronjob-sample", "now": "2020-09-22T07:54:02.281Z", "next run": "2020-09-22T07:55:00.000Z"}
2020-09-22T07:54:02.282Z DEBUG controllers.CronJob job count {"cronjob": "default/cronjob-sample", "active jobs": 0, "successful jobs": 4, "failed jobs": 0}
2020-09-22T07:54:02.443Z DEBUG controllers.CronJob no upcoming scheduled times, sleeping until next {"cronjob": "default/cronjob-sample", "now": "2020-09-22T07:54:02.443Z", "next run": "2020-09-22T07:55:00.000Z"}
2020-09-22T07:55:00.000Z DEBUG controllers.CronJob job count {"cronjob": "default/cronjob-sample", "active jobs": 0, "successful jobs": 4, "failed jobs": 0}
2020-09-22T07:55:00.327Z DEBUG controllers.CronJob created Job for CronJob run {"cronjob": "default/cronjob-sample", "now": "2020-09-22T07:55:00.161Z", "next run": "2020-09-22T07:56:00.000Z", "current run": "2020-09-22T07:55:00.000Z", "job": {"namespace": "default", "name": "cronjob-sample-1600761300"}}
2020-09-22T07:55:00.327Z DEBUG controller Successfully Reconciled {"reconcilerGroup": "batch.transnano.net", "reconcilerKind": "CronJob", "controller": "cronjob", "name": "cronjob-sample", "namespace": "default"}
2020-09-22T07:55:00.328Z DEBUG controllers.CronJob job count {"cronjob": "default/cronjob-sample", "active jobs": 1, "successful jobs": 4, "failed jobs": 0}
2020-09-22T07:55:00.488Z DEBUG controllers.CronJob no upcoming scheduled times, sleeping until next {"cronjob": "default/cronjob-sample", "now": "2020-09-22T07:55:00.488Z", "next run": "2020-09-22T07:56:00.000Z"}
2020-09-22T07:55:00.488Z DEBUG controllers.CronJob job count {"cronjob": "default/cronjob-sample", "active jobs": 1, "successful jobs": 4, "failed jobs": 0}
2020-09-22T07:55:00.649Z DEBUG controllers.CronJob no upcoming scheduled times, sleeping until next {"cronjob": "default/cronjob-sample", "now": "2020-09-22T07:55:00.649Z", "next run": "2020-09-22T07:56:00.000Z"}
2020-09-22T07:55:00.649Z DEBUG controllers.CronJob job count {"cronjob": "default/cronjob-sample", "active jobs": 1, "successful jobs": 4, "failed jobs": 0}
2020-09-22T07:55:00.811Z DEBUG controllers.CronJob no upcoming scheduled times, sleeping until next {"cronjob": "default/cronjob-sample", "now": "2020-09-22T07:55:00.811Z", "next run": "2020-09-22T07:56:00.000Z"}
2020-09-22T07:55:02.335Z DEBUG controllers.CronJob job count {"cronjob": "default/cronjob-sample", "active jobs": 0, "successful jobs": 5, "failed jobs": 0}
2020-09-22T07:55:02.496Z DEBUG controllers.CronJob no upcoming scheduled times, sleeping until next {"cronjob": "default/cronjob-sample", "now": "2020-09-22T07:55:02.496Z", "next run": "2020-09-22T07:56:00.000Z"}
2020-09-22T07:55:02.496Z DEBUG controllers.CronJob job count {"cronjob": "default/cronjob-sample", "active jobs": 0, "successful jobs": 5, "failed jobs": 0}
2020-09-22T07:55:02.657Z DEBUG controllers.CronJob no upcoming scheduled times, sleeping until next {"cronjob": "default/cronjob-sample", "now": "2020-09-22T07:55:02.657Z", "next run": "2020-09-22T07:56:00.000Z"}
2020-09-22T07:56:00.000Z DEBUG controllers.CronJob job count {"cronjob": "default/cronjob-sample", "active jobs": 0, "successful jobs": 5, "failed jobs": 0}
2020-09-22T07:56:00.324Z DEBUG controllers.CronJob created Job for CronJob run {"cronjob": "default/cronjob-sample", "now": "2020-09-22T07:56:00.161Z", "next run": "2020-09-22T07:57:00.000Z", "current run": "2020-09-22T07:56:00.000Z", "job": {"namespace": "default", "name": "cronjob-sample-1600761360"}}
2020-09-22T07:56:00.324Z DEBUG controller Successfully Reconciled {"reconcilerGroup": "batch.transnano.net", "reconcilerKind": "CronJob", "controller": "cronjob", "name": "cronjob-sample", "namespace": "default"}
2020-09-22T07:56:00.325Z DEBUG controllers.CronJob job count {"cronjob": "default/cronjob-sample", "active jobs": 1, "successful jobs": 5, "failed jobs": 0}
2020-09-22T07:56:00.489Z DEBUG controllers.CronJob no upcoming scheduled times, sleeping until next {"cronjob": "default/cronjob-sample", "now": "2020-09-22T07:56:00.489Z", "next run": "2020-09-22T07:57:00.000Z"}
2020-09-22T07:56:00.489Z DEBUG controllers.CronJob job count {"cronjob": "default/cronjob-sample", "active jobs": 1, "successful jobs": 5, "failed jobs": 0}
2020-09-22T07:56:00.651Z DEBUG controllers.CronJob no upcoming scheduled times, sleeping until next {"cronjob": "default/cronjob-sample", "now": "2020-09-22T07:56:00.651Z", "next run": "2020-09-22T07:57:00.000Z"}
2020-09-22T07:56:00.651Z DEBUG controllers.CronJob job count {"cronjob": "default/cronjob-sample", "active jobs": 1, "successful jobs": 5, "failed jobs": 0}
2020-09-22T07:56:00.810Z DEBUG controllers.CronJob no upcoming scheduled times, sleeping until next {"cronjob": "default/cronjob-sample", "now": "2020-09-22T07:56:00.810Z", "next run": "2020-09-22T07:57:00.000Z"}
2020-09-22T07:56:02.012Z DEBUG controllers.CronJob job count {"cronjob": "default/cronjob-sample", "active jobs": 0, "successful jobs": 6, "failed jobs": 0}
2020-09-22T07:56:02.174Z DEBUG controllers.CronJob no upcoming scheduled times, sleeping until next {"cronjob": "default/cronjob-sample", "now": "2020-09-22T07:56:02.174Z", "next run": "2020-09-22T07:57:00.000Z"}
2020-09-22T07:56:02.175Z DEBUG controllers.CronJob job count {"cronjob": "default/cronjob-sample", "active jobs": 0, "successful jobs": 6, "failed jobs": 0}
2020-09-22T07:56:02.335Z DEBUG controllers.CronJob no upcoming scheduled times, sleeping until next {"cronjob": "default/cronjob-sample", "now": "2020-09-22T07:56:02.335Z", "next run": "2020-09-22T07:57:00.000Z"}
2020-09-22T07:57:00.000Z DEBUG controllers.CronJob job count {"cronjob": "default/cronjob-sample", "active jobs": 0, "successful jobs": 6, "failed jobs": 0}
2020-09-22T07:57:00.367Z DEBUG controllers.CronJob created Job for CronJob run {"cronjob": "default/cronjob-sample", "now": "2020-09-22T07:57:00.185Z", "next run": "2020-09-22T07:58:00.000Z", "current run": "2020-09-22T07:57:00.000Z", "job": {"namespace": "default", "name": "cronjob-sample-1600761420"}}
2020-09-22T07:57:00.367Z DEBUG controller Successfully Reconciled {"reconcilerGroup": "batch.transnano.net", "reconcilerKind": "CronJob", "controller": "cronjob", "name": "cronjob-sample", "namespace": "default"}
2020-09-22T07:57:00.368Z DEBUG controllers.CronJob job count {"cronjob": "default/cronjob-sample", "active jobs": 1, "successful jobs": 6, "failed jobs": 0}
2020-09-22T07:57:00.529Z DEBUG controllers.CronJob no upcoming scheduled times, sleeping until next {"cronjob": "default/cronjob-sample", "now": "2020-09-22T07:57:00.529Z", "next run": "2020-09-22T07:58:00.000Z"}
2020-09-22T07:57:00.529Z DEBUG controllers.CronJob job count {"cronjob": "default/cronjob-sample", "active jobs": 1, "successful jobs": 6, "failed jobs": 0}
2020-09-22T07:57:00.689Z DEBUG controllers.CronJob no upcoming scheduled times, sleeping until next {"cronjob": "default/cronjob-sample", "now": "2020-09-22T07:57:00.689Z", "next run": "2020-09-22T07:58:00.000Z"}
2020-09-22T07:57:00.689Z DEBUG controllers.CronJob job count {"cronjob": "default/cronjob-sample", "active jobs": 1, "successful jobs": 6, "failed jobs": 0}
2020-09-22T07:57:00.849Z DEBUG controllers.CronJob no upcoming scheduled times, sleeping until next {"cronjob": "default/cronjob-sample", "now": "2020-09-22T07:57:00.849Z", "next run": "2020-09-22T07:58:00.000Z"}
2020-09-22T07:57:02.578Z DEBUG controllers.CronJob job count {"cronjob": "default/cronjob-sample", "active jobs": 0, "successful jobs": 7, "failed jobs": 0}
2020-09-22T07:57:02.738Z DEBUG controllers.CronJob no upcoming scheduled times, sleeping until next {"cronjob": "default/cronjob-sample", "now": "2020-09-22T07:57:02.738Z", "next run": "2020-09-22T07:58:00.000Z"}
2020-09-22T07:57:02.738Z DEBUG controllers.CronJob job count {"cronjob": "default/cronjob-sample", "active jobs": 0, "successful jobs": 7, "failed jobs": 0}
2020-09-22T07:57:02.898Z DEBUG controllers.CronJob no upcoming scheduled times, sleeping until next {"cronjob": "default/cronjob-sample", "now": "2020-09-22T07:57:02.898Z", "next run": "2020-09-22T07:58:00.000Z"}
Deploy the CronJob
$ kubectl create -f config/samples/batch_v1alpha1_cronjob.yaml
Result
$ kubectl create -f config/samples/batch_v1alpha1_cronjob.yaml
cronjob.batch.transnano.net/cronjob-sample created
get Object
$ kubectl get cronjob.batch.transnano.net -o yaml
$ kubectl get job
Result
$ kubectl get cronjob.batch.transnano.net -o yaml
apiVersion: v1
items:
- apiVersion: batch.transnano.net/v1alpha1
kind: CronJob
metadata:
creationTimestamp: "2020-09-22T07:27:03Z"
generation: 1
name: cronjob-sample
namespace: default
resourceVersion: "4085"
selfLink: /apis/batch.transnano.net/v1alpha1/namespaces/default/cronjobs/cronjob-sample
uid: b52c3d0f-1138-4cb7-be92-cfe961efb524
spec:
concurrencyPolicy: Allow
jobTemplate:
spec:
template:
spec:
containers:
- args:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
image: busybox
name: hello
restartPolicy: OnFailure
schedule: '*/1 * * * *'
startingDeadlineSeconds: 60
kind: List
metadata:
resourceVersion: ""
$ kubectl get job
NAME COMPLETIONS DURATION AGE
cronjob-sample-1600761060 1/1 2s 4m55s
cronjob-sample-1600761120 1/1 2s 4m53s
cronjob-sample-1600761180 1/1 1s 3m53s
cronjob-sample-1600761240 1/1 2s 2m53s
cronjob-sample-1600761300 1/1 2s 113s
cronjob-sample-1600761360 1/1 1s 53s
make deploy
$ make deploy
Result
$ make deploy
/home/$USER/gopath/bin/controller-gen "crd:trivialVersions=true" rbac:roleName=manager-role webhook paths="./..." output:crd:artifacts:config=config/crd/bases
cd config/manager && kustomize edit set image controller=transnano/controller-k8s-cronjob:latest
kustomize build config/default | kubectl apply -f -
namespace/controller-k8s-cronjob-system created
customresourcedefinition.apiextensions.k8s.io/cronjobs.batch.transnano.net configured
role.rbac.authorization.k8s.io/controller-k8s-cronjob-leader-election-role created
clusterrole.rbac.authorization.k8s.io/controller-k8s-cronjob-manager-role created
clusterrole.rbac.authorization.k8s.io/controller-k8s-cronjob-proxy-role created
clusterrole.rbac.authorization.k8s.io/controller-k8s-cronjob-metrics-reader created
rolebinding.rbac.authorization.k8s.io/controller-k8s-cronjob-leader-election-rolebinding created
clusterrolebinding.rbac.authorization.k8s.io/controller-k8s-cronjob-manager-rolebinding created
clusterrolebinding.rbac.authorization.k8s.io/controller-k8s-cronjob-proxy-rolebinding created
service/controller-k8s-cronjob-controller-manager-metrics-service created
deployment.apps/controller-k8s-cronjob-controller-manager created
$
Result
$
$
Result
$
$
Result
$
Extra
$ kubectl api-resources --namespaced=true
$ kubectl api-resources --namespaced=false
$ kubectl get all
Documentation ¶
There is no documentation for this package.
Directories ¶
Path | Synopsis |
---|---|
api
|
|
v1alpha1
Package v1alpha1 contains API Schema definitions for the batch v1alpha1 API group +kubebuilder:object:generate=true +groupName=batch.transnano.net
|
Package v1alpha1 contains API Schema definitions for the batch v1alpha1 API group +kubebuilder:object:generate=true +groupName=batch.transnano.net |
Click to show internal directories.
Click to hide internal directories.