KubeOps

command module
v0.0.0-...-f0c486d Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 8, 2021 License: MIT Imports: 15 Imported by: 0

README

A simple programmatic Kubernetes Operator template.

Use this to create your own Kubernetes operators with golang.

  • Build with KIND (Kubernetes in Docker).
  • Express custom behaviours in code - no DSL to learn.
  • Generate your CRD's with controller-runtime and import them here.
  • Works with built-in kubernetes resource types and custom resource definitions ( example included ).
  • Works with Kubebuilder to write your own custom resource definitions, install them and operate with them.
  • SlackAlerter is a complete example using this template.

Use this project template

  • Click the Use this template button.
  • Open your new repo...
  • go get -u github.com/ksubedi/gomove ( Remember to have your $GOPATH and bin on the $PATH )
  • NAME=github.com/yourname/project make rename
  • Update the module name in go.mod
  • Voila 💅🏼

Run the example... 🥰

Run builtin examples locally:

  • make up to start a K.I.N.D cluster on Docker.
  • make run-builtin-example

This creates some resource interfaces and subscribes to them with some basic subscriptions ./subscriptions

go run examples/builtin/main.go --kubeconfig=/Users/jonesax/.kube/config
I1111 16:03:11.903734   59945 main.go:51] Starting @ 2020-11-11 16:03:11.903596 +0000 GMT m=+0.008013710
I1111 16:03:11.903757   59945 main.go:52] Got watcher client...
I1111 16:03:11.944279   59945 exampledeploymentoperator.go:26] Deployment coredns has 2 Available replicas
I1111 16:03:11.945451   59945 examplepodoperator.go:29] Incoming pod event from kube-apiserver-kind-control-plane
I1111 16:03:11.946563   59945 exampledeploymentoperator.go:26] Deployment local-path-provisioner has 1 Available replicas
I1111 16:03:11.946968   59945 exampledeploymentoperator.go:26] Deployment chart-1605110531-kubeops has 1 Available replicas
I1111 16:03:11.947272   59945 exampledeploymentoperator.go:26] Deployment chart-1605044953-kubeops has 1 Available replicas
I1111 16:03:11.947625   59945 examplepodoperator.go:29] Incoming pod event from kindnet-dmqg9
I1111 16:03:11.948102   59945 examplepodoperator.go:29] Incoming pod event from kube-proxy-qvqpm
I1111 16:03:11.948603   59945 examplepodoperator.go:29] Incoming pod event from coredns-f9fd979d6-2472d
I1111 16:03:11.948863   59945 examplepodoperator.go:29] Incoming pod event from chart-1605110531-kubeops-6957c9d5df-glhxf
I1111 16:03:11.950408   59945 examplepodoperator.go:29] Incoming pod event from coredns-f9fd979d6-vfcd7
I1111 16:03:11.950854   59945 examplepodoperator.go:29] Incoming pod event from chart-1605044953-kubeops-9645784f5-l6xlc
I1111 16:03:11.951771   59945 examplepodoperator.go:29] Incoming pod event from etcd-kind-control-plane
I1111 16:03:11.952974   59945 examplepodoperator.go:29] Incoming pod event from kube-scheduler-kind-control-plane
I1111 16:03:11.953784   59945 examplepodoperator.go:29] Incoming pod event from kube-controller-manager-kind-control-plane
I1111 16:03:11.954150   59945 examplepodoperator.go:29] Incoming pod event from local-path-provisioner-78776bfc44-skrmb

Resources to watch

  runtime.EventBuffer(ctx, kubeClient, registry,[]watcher.IObject{

    // Buffer events for these built-in types
    kubeClient.CoreV1().Pods(""),
    kubeClient.AppsV1().Deployments(""),
    kubeClient.CoreV1().ConfigMaps(""),
    //Example CRD imported into the runtime-----------------------------------------------------------
    //exampleClient.SamplecontrollerV1alpha1().Foos(""),
    // -----------------------------------------------------------------------------------------------
  })

Subscriptions on the watched resources

  registry := &subscription.Registry{
    Subscriptions: []subscription.ISubscription{
      // Subscribe to these built-in type events
      subscriptions.ExamplePodOperator{},
      subscriptions.ExampleFooCRDOperator{},
      subscriptions.ExampleDeploymentOperator{},
    },
  }

Build docker image and install into cluster locally:

  • make

Please see REQUIREMENTS.md for installation requirements

Please see LICENCE.md for licence enquiries

Development perks

  • A simple golang based implementation of an Operator with the boiler plate done.
  • Has a pre-made helm chart, so you can build an image of this code and push it into a cluster with your changes.
  • Example of using k8s golang API
  • Example of using helm

Commands

make up Creates a kind cluster
make run-builtin-example Runs the ./examples/builtin/main.go
make run-crd-example Runs the ./examples/crd/main.go
make down Deletes the kind cluster
make Builds the project, dockerfile, side loads then installs into the cluster
make delete Deletes all currently installed helm releases

Suggested development workflow

  1. <write some code>

  2. Test with the above steps.

  3. make

  4. View your changes in the cluster

  5. If you like it, push the docker image with the kubeops image and use the helm chart to install it cd helm && helm install . --generate-name

How does it work in a nutshell? 🐣

  • Kubeops uses the go-client for Kubernetes and leverages the watch capability.

  • The value of this project is wrapping those calls in interfaces and creating some utility functionality for cluster connection.

  • More information on how to develop your own operator watchers/subscriptions can be found here.

What about Custom Resource Definitions?

Currently the solution would be to use kubebuilder to generate CRD's and then import them either as a library or subproject into KubeOps template.

Documentation

Overview

Copyright © 2020 alexsimonjones@gmail.com

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Directories

Path Synopsis
examples
crd
lib

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL