DirectPV Operator - cniackz/public GitHub Wiki
Objective:
To document how I created the DirectPV Operator from scratch!.
Diagrams:
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