{"id":22442478,"url":"https://github.com/nevercase/k8s-controller-custom-resource","last_synced_at":"2025-10-23T02:35:04.600Z","repository":{"id":45213856,"uuid":"241845014","full_name":"neverCase/k8s-controller-custom-resource","owner":"neverCase","description":"k8s-api \u0026 Redis-operator \u0026 Mysql-operator","archived":false,"fork":false,"pushed_at":"2021-12-31T07:12:03.000Z","size":2060,"stargazers_count":5,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-11-19T03:13:24.294Z","etag":null,"topics":["dockerfile","k8s","k8s-api","k8s-crd","mysql-operator","operator","redis-operator"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/neverCase.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-02-20T09:35:46.000Z","updated_at":"2024-10-27T08:53:58.000Z","dependencies_parsed_at":"2022-09-02T12:30:29.067Z","dependency_job_id":null,"html_url":"https://github.com/neverCase/k8s-controller-custom-resource","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/neverCase%2Fk8s-controller-custom-resource","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/neverCase%2Fk8s-controller-custom-resource/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/neverCase%2Fk8s-controller-custom-resource/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/neverCase%2Fk8s-controller-custom-resource/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/neverCase","download_url":"https://codeload.github.com/neverCase/k8s-controller-custom-resource/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":228398008,"owners_count":17913564,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dockerfile","k8s","k8s-api","k8s-crd","mysql-operator","operator","redis-operator"],"created_at":"2024-12-06T02:19:16.718Z","updated_at":"2025-10-23T02:34:59.571Z","avatar_url":"https://github.com/neverCase.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# k8s-controller-custom-resource\n\n## Features\n- k8s-api: supports watching and listing default resources (such as Service, Pod, Configmap) and another custom resources definition\n- redis-operator: including a simple master-slave mode which was main based on the resources of **k8s.StatefulSet** and **k8s.Service**\n- mysql-operator: the same with the redis-operator\n\n## Operators to do\n- core/v1/interfaces would add the storage plugins(e.g. nfs) later for dynamically creating pv and pvc\n\n## Api to do\n- ingress controller\n \n\n## RedisOperator\n\n### clone git, build docker image and compile controller\n```sh\n$ git clone https://github.com/neverCase/k8s-controller-custom-resource.git\n$ cd k8s-controller-custom-resource \n\n# build image\n$ make mysql\n$ make redis\n\n# compile controller\n$ CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o multiplexcrd cmd/multiplex/main.go\n```\n\n### define the resource of the `RedisOperator`\n```sh\n$ cat \u003e redis-resource.yaml \u003c\u003cEOF\napiVersion: apiextensions.k8s.io/v1beta1\nkind: CustomResourceDefinition\nmetadata:\n  name: redisoperators.nevercase.io\nspec:\n  group: nevercase.io\n  version: v1\n  names:\n    kind: RedisOperator\n    plural: redisoperators\n  scope: Namespaced\nEOF\n\n$ kubectl apply -f redis-resource.yaml\ncustomresourcedefinition.apiextensions.k8s.io/redisoperators.nevercase.io created\n```\n\n### define demo file\n```sh\n$ cat \u003e example-redis.yaml \u003c\u003cEOF\napiVersion: nevercase.io/v1\nkind: RedisOperator\nmetadata:\n  name: example-redis\nspec:\n  masterSpec:\n    spec:\n      name: \"redis-cn1\"\n      replicas: 1\n      image: harbor.domain.com/helix-saga/redis-slave:1.1\n      imagePullSecrets:\n        - name: private-harbor\n      volumePath: /mnt/nas1\n      containerPorts:\n        - containerPort: 6379\n          protocol: TCP\n      servicePorts:\n        - port: 6379\n          protocol: TCP\n          targetPort: 6379\n      resources:\n        limits:\n          memory: \"1Gi\"\n          cpu: \"100m\"\n        requests:\n          memory: \"0.5Gi\"\n          cpu: \"100m\"\n  slaveSpec:\n    spec:\n      name: \"redis-cn1\"\n      replicas: 4\n      image: harbor.domain.com/helix-saga/redis-slave:1.1\n      imagePullSecrets:\n        - name: private-harbor\n      volumePath: /mnt/nas1\n      containerPorts:\n        - containerPort: 6379\n          protocol: TCP\n      servicePorts:\n        - port: 6379\n          protocol: TCP\n          targetPort: 6379\n      resources:\n        limits:\n          memory: \"1Gi\"\n          cpu: \"100m\"\n        requests:\n          memory: \"0.5Gi\"\n          cpu: \"100m\"\nEOF\n\n$ kubectl apply -f example-redis.yaml\nredisoperator.nevercase.io/example-redis created\n```\n\n### run the controller\n```sh\n$ ./multiplexcrd -kubeconfig=$HOME/.kube/config -alsologtostderr=true\nI0603 14:48:38.844075   20412 controller.go:72] Setting up event handlers\nI0603 14:48:38.844243   20412 controller.go:195] Starting Foo controller\nI0603 14:48:38.844249   20412 controller.go:198] Waiting for informer caches to sync\nI0603 14:48:38.944352   20412 controller.go:209] Starting workers\nI0603 14:48:38.944366   20412 controller.go:215] Started workers\n...\nI0603 14:48:47.721574   20412 event.go:255] Event(v1.ObjectReference{Kind:\"RedisOperator\", ... type: 'Normal' reason: 'Synced' Foo synced successfully\n```\n\n### watch status\n```sh\n$ kubectl get statefulset\nNAME                           READY   AGE\nstatefulset-redis-demo-master   1/1     46s\nstatefulset-redis-demo-slave    4/4     46s\n\n$ kubectl get pod\nNAME                                                    READY   STATUS      RESTARTS   AGE\nstatefulset-redis-demo-master-0                          1/1     Running     0          101s\nstatefulset-redis-demo-slave-0                           1/1     Running     0          101s\nstatefulset-redis-demo-slave-1                           1/1     Running     0          99s\nstatefulset-redis-demo-slave-2                           1/1     Running     0          98s\nstatefulset-redis-demo-slave-3                           1/1     Running     0          97s\n\n$ kubectl get svc\nNAME                       TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE\nservice-redis-demo-master  ClusterIP   10.96.110.148   \u003cnone\u003e        6379/TCP   4m38s\nservice-redis-demo-slave   ClusterIP   10.96.0.120     \u003cnone\u003e        6379/TCP   4m38s\n```\n\n## MysqlOperator\n\nThe usage was the same with the RedisOperator. \n\n\n## New custom-controller\n```go\nopt := k8sCoreV1.NewOption(\u0026mysqlOperatorV1.MysqlOperator{},\n    controllerName,\n    OperatorKindName,\n    mysqlOperatorScheme.AddToScheme(scheme.Scheme),\n    clientSet,\n    fooInformer,\n    fooInformer.Informer(),\n    CompareResourceVersion,\n    Get,\n    Sync,\n    SyncStatus)\nopts := k8sCoreV1.NewOptions()\nif err := opts.Add(opt); err != nil {\n    klog.Fatal(err)\n}\nop := k8sCoreV1.NewKubernetesOperator(k8sClientSet, stopCh, controllerName, opts)\nkc := k8sCoreV1.NewKubernetesController(op)\n...\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnevercase%2Fk8s-controller-custom-resource","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnevercase%2Fk8s-controller-custom-resource","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnevercase%2Fk8s-controller-custom-resource/lists"}