DirectPV Operator - cniackz/public GitHub Wiki

Objective:

To document how I created the DirectPV Operator from scratch!.

Diagrams:

telegram-cloud-photo-size-1-5030769656109050868-y

Documentation:

Steps:

createcluster

Create a new project

cd ~
sudo rm -rf ~/projects/memcached-operator
mkdir -p ~/projects/memcached-operator
cd ~/projects/memcached-operator
operator-sdk init --domain example.com --repo github.com/example/memcached-operator --plugins=go/v4-alpha

Create a new API and Controller

operator-sdk create api --group cache --version v1alpha1 --kind Memcached --resource --controller

Define the API

rm /Users/cniackz/projects/memcached-operator/api/v1alpha1/memcached_types.go
cp /Users/cniackz/minio/operator-tuto/memcached_types.go /Users/cniackz/projects/memcached-operator/api/v1alpha1/memcached_types.go
subl /Users/cniackz/projects/memcached-operator/api/v1alpha1/memcached_types.go
cd /Users/cniackz/projects/memcached-operator
make generate

Generating CRD manifests

cd /Users/cniackz/projects/memcached-operator
make manifests

Implement the Controller

rm /Users/cniackz/projects/memcached-operator/internal/controller/memcached_controller.go
cp /Users/cniackz/minio/operator-tuto/memcached_controller.go /Users/cniackz/projects/memcached-operator/internal/controller/memcached_controller.go
subl /Users/cniackz/projects/memcached-operator/internal/controller/memcached_controller.go 

Setup a Recorder

rm /Users/cniackz/projects/memcached-operator/cmd/main.go
cp /Users/cniackz/minio/operator-tuto/main.go /Users/cniackz/projects/memcached-operator/cmd/main.go
subl /Users/cniackz/projects/memcached-operator/cmd/main.go

Specify permissions and generate RBAC manifests

cd /Users/cniackz/projects/memcached-operator
make manifests

Configure the operator’s image registry

rm /Users/cniackz/projects/memcached-operator/Dockerfile
cp /Users/cniackz/minio/operator-tuto/Dockerfile /Users/cniackz/projects/memcached-operator/Dockerfile
subl /Users/cniackz/projects/memcached-operator/Dockerfile
rm /Users/cniackz/projects/memcached-operator/Makefile
cp /Users/cniackz/minio/operator-tuto/Makefile.mk /Users/cniackz/projects/memcached-operator/Makefile
subl /Users/cniackz/projects/memcached-operator/Makefile
cd /Users/cniackz/projects/memcached-operator
make docker-build docker-push

Run the Operator

2. Run as a Deployment inside the cluster

  • Add MEMCACHED_IMAGE env var to the Deployment so it does not fail:
rm /Users/cniackz/projects/memcached-operator/config/manager/manager.yaml
cp /Users/cniackz/minio/operator-tuto/manager.yaml /Users/cniackz/projects/memcached-operator/config/manager/manager.yaml
subl /Users/cniackz/projects/memcached-operator/config/manager/manager.yaml
make deploy
$ kubectl get deployment -n memcached-operator-system
NAME                                    READY   UP-TO-DATE   AVAILABLE   AGE
memcached-operator-controller-manager   1/1     1            1           102s

Create a Memcached CR

cd /Users/cniackz/minio/operator-tuto
kubectl apply -f cache_v1alpha1_memcached.yaml
$ kubectl get deployment
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
memcached-sample   3/3     3            3           8m17s
$ kubectl get pods
NAME                                READY   STATUS    RESTARTS   AGE
memcached-sample-6989cc5f47-26xm4   1/1     Running   0          8m36s
memcached-sample-6989cc5f47-52v8l   1/1     Running   0          8m36s
memcached-sample-6989cc5f47-p2ggg   1/1     Running   0          8m36s
$ kubectl get memcached/memcached-sample -o yaml
apiVersion: cache.example.com/v1alpha1
kind: Memcached
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"cache.example.com/v1alpha1","kind":"Memcached","metadata":{"annotations":{},"name":"memcached-sample","namespace":"default"},"spec":{"containerPort":11211,"size":3}}
  creationTimestamp: "2023-07-21T16:47:30Z"
  finalizers:
  - cache.example.com/finalizer
  generation: 1
  name: memcached-sample
  namespace: default
  resourceVersion: "798"
  uid: cc85fce2-6ed1-4a8e-a5b5-e3fb88901fed
spec:
  containerPort: 11211
  size: 3
status:
  conditions:
  - lastTransitionTime: "2023-07-21T16:47:30Z"
    message: Deployment for custom resource (memcached-sample) with 3 replicas created
      successfully
    reason: Reconciling
    status: "True"
    type: Available