diff --git a/site/content/en/docs/contrib/addons.en.md b/site/content/en/docs/contrib/addons.en.md index 06ec833d01c23967f4a193f1b7eae645ccc216d4..3b400dd9e84c652dd309d88c7516440d7431295a 100644 --- a/site/content/en/docs/contrib/addons.en.md +++ b/site/content/en/docs/contrib/addons.en.md @@ -1,78 +1,103 @@ --- title: "Addons" -date: 2019-07-31 weight: 4 description: > How to develop minikube addons --- -## Testing Addon changes +## Creating a new addon -Build the minikube binary: +To create an addon, first fork the minikube repository, and check out your fork: + +`git clone git@github.com:/minikube.git` + +Then go into the source directory: + +`cd minikube` + +Create a subdirectory: + +`mkdir deploy/addons/` + +Add your manifest YAML's to the directory you have created: + +`cp *.yaml deploy/addons/` + +To make the addon appear in `minikube addons list`, add it to `pkg/addons/config.go`. Here is the entry used by the `registry` addon, which will work for any addon which does not require custom code: + +```go + { + name: "registry", + set: SetBool, + callbacks: []setFn{enableOrDisableAddon}, + }, +``` + +Then, add into `pkg/minikube/assets/addons.go` the list of files to copy into the cluster, including manifests. Here is the entry used by the `registry` addon: + +```go + "registry": NewAddon([]*BinAsset{ + MustBinAsset( + "deploy/addons/registry/registry-rc.yaml.tmpl", + vmpath.GuestAddonsDir, + "registry-rc.yaml", + "0640", + false), + MustBinAsset( + "deploy/addons/registry/registry-svc.yaml.tmpl", + vmpath.GuestAddonsDir, + "registry-svc.yaml", + "0640", + false), + MustBinAsset( + "deploy/addons/registry/registry-proxy.yaml.tmpl", + vmpath.GuestAddonsDir, + "registry-proxy.yaml", + "0640", + false), + }, false, "registry"), +``` + +The `MustBinAsset` arguments are: + +* source filename +* destination directory (typically `vmpath.GuestAddonsDir`) +* destination filename +* permissions (typically `0640`) +* boolean value representing if template substitution is required (often `false`) + +The boolean value on the last line is whether the addon should be enabled by default. This should always be `false`. + +To see other examples, see the [addons commit history](https://github.com/kubernetes/minikube/commits/master/deploy/addons) for other recent examples. + +## "addons open" support + +If your addon contains a NodePort Service, please add the `kubernetes.io/minikube-addons-endpoint: ` label, which is used by the `minikube addons open` command: + +```yaml +apiVersion: v1 +kind: Service +metadata: + labels: + kubernetes.io/minikube-addons-endpoint: +``` + +NOTE: `minikube addons open` currently only works for the `kube-system` namespace: [#8089](https://github.com/kubernetes/minikube/issues/8089). + +## Testing addon changes + +Rebuild the minikube binary and apply the addon with extra logging enabled: ```shell -make +make && ./out/minikube addons enable --alsologtostderr ``` -Apply addon from your newly built minikube binary: +Please note that you must run `make` each time you change your YAML files. To disable the addon when new changes are made, run: ```shell -./out/minikube addons enable +./out/minikube addons disable --alsologtostderr ``` -## Adding a New Addon - -To add a new addon to minikube the following steps are required: - -* For the new addon's .yaml file(s): - * Put the required .yaml files for the addon in the `minikube/deploy/addons` directory. - * Add the `kubernetes.io/minikube-addons: ` label to each piece of the addon (ReplicationController, Service, etc.) - * Also, the `addonmanager.kubernetes.io/mode` annotation is needed so that your resources are picked up by the `addon-manager`. - * In order to have `minikube addons open ` work properly, the `kubernetes.io/minikube-addons-endpoint: ` label must be added to the appropriate endpoint service (what the user would want to open/interact with). This service must be of type NodePort. - -* To add the addon into minikube commands/VM: - * Add the addon with appropriate fields filled into the `Addon` dictionary, see this [commit](https://github.com/kubernetes/minikube/commit/41998bdad0a5543d6b15b86b0862233e3204fab6#diff-e2da306d559e3f019987acc38431a3e8R133) and example. - - ```go - // cmd/minikube/cmd/config/config.go - var settings = []Setting{ - ..., - // add other addon setting - { - name: "efk", - set: SetBool, - validations: []setFn{IsValidAddon}, - callbacks: []setFn{EnableOrDisableAddon}, - }, - } - ``` - - * Add the addon to settings list, see this [commit](https://github.com/kubernetes/minikube/commit/41998bdad0a5543d6b15b86b0862233e3204fab6#diff-07ad0c54f98b231e68537d908a214659R89) and example. - - ```go - // pkg/minikube/assets/addons.go - var Addons = map[string]*Addon{ - ..., - // add other addon asset - "efk": NewAddon([]*BinAsset{ - MustBinAsset( - "deploy/addons/efk/efk-configmap.yaml", - guestAddonsDir, - "efk-configmap.yaml", - "0640", - false), - MustBinAsset( - "deploy/addons/efk/efk-rc.yaml", - guestAddonsDir, - "efk-rc.yaml", - "0640", - false), - MustBinAsset( - "deploy/addons/efk/efk-svc.yaml", - guestAddonsDir, - "efk-svc.yaml", - "0640", - false), - }, false, "efk"), - } - ``` +## Sending out your PR + +Once you have tested your addon, click on [new pull request](https://github.com/kubernetes/minikube/compare) to send us your PR!