Giter Site home page Giter Site logo

kubefirst-watcher-operator's Introduction

Overview

This repo is a sample of an operator used to trigger watcher of state of a kubernetes cluster applications, to help to simplify installation flows from kubefirst.

This repo is also a guide on how to create from end-to-end a controller for kubernetes CRDs.

Tools

In order to simplify in a single place all the tools needed to create a controller ready to use, this repo has a Dockerfile that wraps all needed tools for you.

To use it is just run:

#Build Container
docker build . -t kubebuilder

#Use Container
docker run --rm -it \
    --name gitlab-bash \
    -v $HOME/.aws:/root/.aws \
    -w /go/src \
    -v operator-sdk:/go/pkg \
    -v $(pwd):/go/src \
    -v /var/run/docker.sock:/var/run/docker.sock  \
    --privileged \
    kubebuilder

This container has --rm on the run flags, so be aware that everything out of /go/src will removed once you exit the container and you can't recover it. Feel free to map more folders to make easier for your to work with it.

CRD

Starting your CRD

This watcher-operators was created

mkdir watcher

cd watcher/

kubebuilder init --domain kubefirst.io --license apache2 --owner "K-rays" --repo github.com/k1tests/basic-controller

kubebuilder create api --group k1 --version v1beta1 --kind Watcher --controller --resource

make manifests

make install

Working

To run your controller run:

cd watcher/

make run

kubectl get watcher

kubectl get crd 

Argo-cd

In case, the cluster has argocd we can wuse this folowing patch to make it to understand state of this new CRD:

hs = {}
if obj.status ~= nil then
  if obj.status.status ~= nil then
    if obj.status.status == "Satisfied" then
        hs.status = "Healthy"
        hs.message = obj.status.status
        return hs
     end
     if obj.status.status == "Timeout" then
        hs.status = "Degraded"
        hs.message = obj.status.status
        return hs
     end
  end
end
hs.status = "Progressing"
hs.message = "Waiting for Watcher
return hs
kubectl patch configmap/argocd-cm \
  -n argocd \
  --type merge \
  -p '{"data":{"resource.customizations.health.k1.kubefirst.io_Watcher":"hs = {}\nif obj.status ~= nil then\n  if obj.status.status ~= nil then\n    if obj.status.status == \"Satisfied\" then\n        hs.status = \"Healthy\"\n        hs.message = obj.status.status\n        return hs\n     end\n     if obj.status.status == \"Timeout\" then\n        hs.status = \"Degraded\"\n        hs.message = obj.status.status\n        return hs\n     end\n  end\nend\nhs.status = \"Progressing\"\nhs.message = \"Waiting for Watcher\"\nreturn hs"} }'

How to install the watcher on your argo installation

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: k1-watcher
  namespace: argocd
  annotations:
    argocd.argoproj.io/sync-wave: "1"
spec: 
  project: default
  source:
    repoURL: 'https://kubefirst.github.io/charts'
    targetRevision: 0.4.0
    helm:
      values: |-
        image: 6zar/k1-watcher-contoller:latest
    chart: helm-k1-watcher-operator
  destination:
    server: 'https://kubernetes.default.svc'
    namespace: watcher-system
  syncPolicy:
      automated:
        prune: true
        selfHeal: true
      syncOptions:
        - CreateNamespace=true
      retry:
        limit: 5
        backoff:
          duration: 5s
          maxDuration: 5m0s
          factor: 2
---
# Creates the argo annotation for CRD
apiVersion: batch/v1
kind: Job
metadata:
  name: add-kubewatcher-argocd
  namespace: argocd
  annotations:
    argocd.argoproj.io/sync-wave: "0"
spec:
  template:
    spec:
      serviceAccountName: argocd-server
      containers:
      - name: c
        image: portainer/kubectl-shell:latest
        command:
        - /bin/sh
        - -c
        - |
          kubectl patch configmap/argocd-cm \
            -n argocd \
            --type merge \
            -p '{"data":{"resource.customizations.health.k1.kubefirst.io_Watcher":"hs = {}\nif obj.status ~= nil then\n  if obj.status.status ~= nil then\n    if obj.status.status == \"Satisfied\" then\n        hs.status = \"Healthy\"\n        hs.message = obj.status.status\n        return hs\n     end\n     if obj.status.status == \"Timeout\" then\n        hs.status = \"Degraded\"\n        hs.message = obj.status.status\n        return hs\n     end\n  end\nend\nhs.status = \"Progressing\"\nhs.message = \"Waiting for Watcher\"\nreturn hs"} }'
          sleep 10
      restartPolicy: Never
  backoffLimit: 1          

Test this watcher with Kubefirst Local

Use kuebfirst to have all gitops env ready for testing:

./kubefirst local --gitops-branch main --skip-metaphor

Once all is done:

  • Add to your github user repo gitops at /registry/k1-demo.yaml:
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: watcher-sample
spec:
  generators:
  - list:
      elements:
        - cluster: sample
          url: https://kubernetes.default.svc
          env: k1
  template:
    metadata:
      name: 'k1-watcher-demo'
    spec:
      project: default
      source:
        repoURL: https://github.com/6za/k1-watcher-demo.git
        targetRevision: HEAD
        path: watcher
      destination:
        server: '{{url}}'
        namespace: watcher-system
      syncPolicy:
        automated:
          prune: true
          selfHeal: true
        syncOptions:
          - CreateNamespace=true
        retry:
          limit: 5
          backoff:
            duration: 5s
            maxDuration: 5m0s
            factor: 2   

This will unfold a set of applications using the watcher and install the watcher for you.

kubefirst-watcher-operator's People

Contributors

6za avatar fharper avatar

Stargazers

 avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.