yurt-manager
In order to improve the management of all repos in OpenYurt, and reduce the complexity of deploying OpenYurt. we will create a new component named yurt-manager for managing all controllers and webhooks.
yurt-manager has built a framework for controllers that supports:
- crd definition
- controller logic
- webhook logic
- auto-issuing of webhook certificates
- helm chart generation
- client-api generation
the yurt-manager framework lets you easily add new CRD and their controller, webhook logic, avoiding a lot of repetitive development work.
Code architecture
yurt-manager contains five structures:
| structure |
dirs |
description |
| add_controller.sh |
hack/make-rules/add_controller.sh |
Add a new CRD definition, including controller and Webhooks, you can use make newcontroller command |
| cmd |
cmd/yurt-manager |
yurt-manager entry function. In most cases, you do not need to modify it. Do not modify the directory structure!!! |
| apis |
pkg/apis |
api definition, including the group and version directories. Do not modify the directory structure!!! |
| controller |
pkg/controller |
Process the logic of the crd controller. Do not modify the directory structure !!! |
| webhook |
pkg/webhook |
Handle the logic of crd Webhooks. Do not modify the directory structure!!! |
| charts |
charts/openyurt |
openyurt helm chart, You can run the make manifests command to automatically modify the template file. Do not modify the directory structure!!! |
| manifest |
_output/manifest |
temporary directory for converting helm chart. Do not modify the directory structure!!! |
The directory structure is as follows:
├── hack
│ └── make-rules
│ ├── add_controller.sh
├── cmd
│ └─ yurt-manager
│ ├── README.md
│ └── main.go
├── pkg
│ ├─ apis
│ │ ├── addtoscheme_apps_v1beta1.go
│ │ ├── apis.go
│ │ └── apps
│ │ └── v1beta1
│ ├── controller
│ │ ├── controller.go
│ │ └─ {instance}
│ │ └── {instance}_controller.go
│ └── webhook
│ ├── add_{instance}.go
│ ├── {instance}
│ │ ├── mutating
│ │ └── validating
│ └── server.go
├── _output
│ └── manifest
│ ├── auto_generate
│ │ ├── crd
│ │ ├── rbac
│ │ └── webhook
│ └── kustomize
│ ├── crd
│ ├── default
│ ├── rbac
│ └── webhook
├── charts
│ └── openyurt
│ ├── Chart.yaml
│ ├── templates
│ │ ├── _helpers.tpl
│ │ ├── yurt-manager-auto-generated.yaml
│ │ └── yurt-manager.yaml
│ └── values.yaml
How do I add a new CRD
Record local changes to the repository
Before adding new CRDS, please use the git commit command to record local changes to the repository.
# cd $GOPATH/src/github.com/openyurtio/openyurt
# git add .
# git commit -m "prepare to add new crd"
Add new crd
Assume that the new crd belongs to group net, version is v1beta1, kind is Spider, shortname is sd, and scope is Cluster
You can execute the following command:
GROUP=net
VERSION=v1beta1
KIND=Spider
# make newcontroller GROUP=${GROUP} VERSION=${VERSION} KIND=${KIND} SHORTNAME=sd SCOPE=Cluster
Assume that the new crd belongs to group iot, version is v1alpha1, kind is Device, shortname is dc, and scope is Namespaced
You can execute the following command:
GROUP=iot
VERSION=v1alpha1
KIND=Device
# make newcontroller GROUP=iot VERSION=v1alpha1 KIND=${KIND} SHORTNAME=dc SCOPE=Namespaced
After the preceding command is executed, you can run the git status command to check which files have been added and modified
# git status
Update helm chart
# make manifests
make manifests command will automatically update file charts/openyurt/templates/yurt-manager-auto-generated.yaml . If you have other special configurations for yurt-manger, please update the charts/openyurt/templates/yurt-manager.yaml and charts/openyurt/values.yaml files.
Do not modify file charts/openyurt/templates/yurt-manager-auto-generated.yaml directly, because file charts/openyurt/templates/yurt-manager-auto-generated.yaml is overwritten every time command make manifests is executed
exec git commit to record local change
# git commit -m "add a new crd ${GROUP}/${VERSION}/${KIND} and controller ,webhook "
Build and push yurt-manger image
Suppose the name of our image repository edgetest-registry.cn-zhangjiakou.cr.aliyuncs.com/openyurt
# make docker-push-yurt-manager IMAGE_REPO=edgetest-registry.cn-zhangjiakou.cr.aliyuncs.com/openyurt
make docker-push-yurt-manager automatically constructs docker images. The full image is named $IMAGE_REPO/yurt-manager:{git commit} and automatically pushed to the image repository.
helm install
# cd $GOPATH/src/github.com/openyurtio/openyurt
# helm uninstall openyurt
# helm install openyurt ./openyurt --set yurtManager.image.registry=edgetest-registry.cn-zhangjiakou.cr.aliyuncs.com --set yurtManager.image.tag=v1.2.0-52ef527
Note !!!
You need to specify the correct yurtManager.image.registry and yurtManager.image.tag using the --set flag when you execute helm install command.