diff --git a/cmd/minikube/cmd/config/addons_list_test.go b/cmd/minikube/cmd/config/addons_list_test.go index ae4a53ca25f2..1398508c2d60 100644 --- a/cmd/minikube/cmd/config/addons_list_test.go +++ b/cmd/minikube/cmd/config/addons_list_test.go @@ -77,7 +77,7 @@ func TestAddonsList(t *testing.T) { Ambassador *interface{} `json:"ambassador"` } - b := make([]byte, 557) + b := make([]byte, 571) r, w, err := os.Pipe() if err != nil { t.Fatalf("failed to create pipe: %v", err) diff --git a/cmd/minikube/cmd/config/enable.go b/cmd/minikube/cmd/config/enable.go index 28da1eb43f5b..36c38c1ed833 100644 --- a/cmd/minikube/cmd/config/enable.go +++ b/cmd/minikube/cmd/config/enable.go @@ -67,6 +67,29 @@ var addonsEnableCmd = &cobra.Command{ minikube{{.profileArg}} addons enable metrics-server +`, out.V{"profileArg": tipProfileArg}) + + } + if addon == "headlamp" { + out.Styled(style.Tip, `To access Headlamp, use the following command: +minikube service headlamp -n headlamp + +`) + out.Styled(style.Tip, `To authenticate in Headlamp, fetch the Authentication Token using the following command: + +export SECRET=$(kubectl get secrets --namespace headlamp -o custom-columns=":metadata.name" | grep "headlamp-token") +kubectl get secret $SECRET --namespace headlamp --template=\{\{.data.token\}\} | base64 --decode + +`) + + tipProfileArg := "" + if ClusterFlagValue() != constants.DefaultClusterName { + tipProfileArg = fmt.Sprintf(" -p %s", ClusterFlagValue()) + } + out.Styled(style.Tip, `Headlamp can display more detailed information when metrics-server is installed. To install it, run: + +minikube{{.profileArg}} addons enable metrics-server + `, out.V{"profileArg": tipProfileArg}) } diff --git a/deploy/addons/assets.go b/deploy/addons/assets.go index 84b6b644d53b..209f0560d4f4 100644 --- a/deploy/addons/assets.go +++ b/deploy/addons/assets.go @@ -147,4 +147,8 @@ var ( // InAccelAssets assets for inaccel addon //go:embed inaccel/fpga-operator.yaml.tmpl InAccelAssets embed.FS + + // HeadlampAssets assets for headlamp addon + //go:embed headlamp/*.yaml headlamp/*.tmpl + HeadlampAssets embed.FS ) diff --git a/deploy/addons/headlamp/headlamp-clusterrolebinding.yaml b/deploy/addons/headlamp/headlamp-clusterrolebinding.yaml new file mode 100644 index 000000000000..1f516989ed97 --- /dev/null +++ b/deploy/addons/headlamp/headlamp-clusterrolebinding.yaml @@ -0,0 +1,18 @@ +--- +# ClusterRoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: headlamp-admin + namespace: headlamp + labels: + app.kubernetes.io/name: headlamp + app.kubernetes.io/instance: headlamp +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: cluster-admin +subjects: +- kind: ServiceAccount + name: headlamp + namespace: headlamp diff --git a/deploy/addons/headlamp/headlamp-deployment.yaml.tmpl b/deploy/addons/headlamp/headlamp-deployment.yaml.tmpl new file mode 100644 index 000000000000..35b15aa9de19 --- /dev/null +++ b/deploy/addons/headlamp/headlamp-deployment.yaml.tmpl @@ -0,0 +1,49 @@ +--- +# Deployment +apiVersion: apps/v1 +kind: Deployment +metadata: + name: headlamp + namespace: headlamp + labels: + app.kubernetes.io/name: headlamp + app.kubernetes.io/instance: headlamp +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/name: headlamp + app.kubernetes.io/instance: headlamp + template: + metadata: + labels: + app.kubernetes.io/name: headlamp + app.kubernetes.io/instance: headlamp + spec: + serviceAccountName: headlamp + containers: + - name: headlamp + image: {{.CustomRegistries.Headlamp | default .ImageRepository | default .Registries.Headlamp }}{{.Images.Headlamp}} + imagePullPolicy: IfNotPresent + args: + - "-in-cluster" + - "-plugins-dir=/headlamp/plugins" + ports: + - name: http + containerPort: 4466 + protocol: TCP + livenessProbe: + httpGet: + path: / + port: http + readinessProbe: + httpGet: + path: / + port: http + volumeMounts: + - mountPath: /headlamp/plugins + name: plugins + volumes: + - name: plugins + persistentVolumeClaim: + claimName: headlamp diff --git a/deploy/addons/headlamp/headlamp-namespace.yaml b/deploy/addons/headlamp/headlamp-namespace.yaml new file mode 100644 index 000000000000..85d4ae0a2eb0 --- /dev/null +++ b/deploy/addons/headlamp/headlamp-namespace.yaml @@ -0,0 +1,6 @@ +--- +# Namespace +apiVersion: v1 +kind: Namespace +metadata: + name: headlamp diff --git a/deploy/addons/headlamp/headlamp-pvc.yaml b/deploy/addons/headlamp/headlamp-pvc.yaml new file mode 100644 index 000000000000..d1cc086f8a31 --- /dev/null +++ b/deploy/addons/headlamp/headlamp-pvc.yaml @@ -0,0 +1,16 @@ +--- +# PersistentVolumeClaim +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: headlamp + namespace: headlamp + labels: + app.kubernetes.io/name: headlamp + app.kubernetes.io/instance: headlamp +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi diff --git a/deploy/addons/headlamp/headlamp-service.yaml b/deploy/addons/headlamp/headlamp-service.yaml new file mode 100644 index 000000000000..1eca749b8293 --- /dev/null +++ b/deploy/addons/headlamp/headlamp-service.yaml @@ -0,0 +1,21 @@ +--- +# Service +apiVersion: v1 +kind: Service +metadata: + name: headlamp + namespace: headlamp + labels: + app.kubernetes.io/name: headlamp + app.kubernetes.io/instance: headlamp + kubernetes.io/minikube-addons-endpoint: headlamp +spec: + type: NodePort + ports: + - port: 80 + targetPort: http + protocol: TCP + name: http + selector: + app.kubernetes.io/name: headlamp + app.kubernetes.io/instance: headlamp diff --git a/deploy/addons/headlamp/headlamp-serviceaccount.yaml b/deploy/addons/headlamp/headlamp-serviceaccount.yaml new file mode 100644 index 000000000000..2dfba7fc61b9 --- /dev/null +++ b/deploy/addons/headlamp/headlamp-serviceaccount.yaml @@ -0,0 +1,10 @@ +--- +# ServiceAccount +apiVersion: v1 +kind: ServiceAccount +metadata: + name: headlamp + namespace: headlamp + labels: + app.kubernetes.io/name: headlamp + app.kubernetes.io/instance: headlamp diff --git a/pkg/addons/config.go b/pkg/addons/config.go index 81db657897f2..6aba241a0065 100644 --- a/pkg/addons/config.go +++ b/pkg/addons/config.go @@ -202,4 +202,9 @@ var Addons = []*Addon{ set: SetBool, callbacks: []setFn{EnableOrDisableAddon}, }, + { + name: "headlamp", + set: SetBool, + callbacks: []setFn{EnableOrDisableAddon}, + }, } diff --git a/pkg/minikube/assets/addons.go b/pkg/minikube/assets/addons.go index 5858635303e5..97bb7f7d85d4 100755 --- a/pkg/minikube/assets/addons.go +++ b/pkg/minikube/assets/addons.go @@ -701,6 +701,20 @@ var Addons = map[string]*Addon{ }, map[string]string{ "Helm3": "docker.io", }), + "headlamp": NewAddon([]*BinAsset{ + MustBinAsset(addons.HeadlampAssets, "headlamp/headlamp-namespace.yaml", vmpath.GuestAddonsDir, "headlamp-namespace.yaml", "6040"), + MustBinAsset(addons.HeadlampAssets, "headlamp/headlamp-service.yaml", vmpath.GuestAddonsDir, "headlamp-service.yaml", "6040"), + MustBinAsset(addons.HeadlampAssets, "headlamp/headlamp-pvc.yaml", vmpath.GuestAddonsDir, "headlamp-pvc.yaml", "6040"), + MustBinAsset(addons.HeadlampAssets, "headlamp/headlamp-deployment.yaml.tmpl", vmpath.GuestAddonsDir, "headlamp-deployment.yaml", "6040"), + MustBinAsset(addons.HeadlampAssets, "headlamp/headlamp-serviceaccount.yaml", vmpath.GuestAddonsDir, "headlamp-serviceaccount.yaml", "6040"), + MustBinAsset(addons.HeadlampAssets, "headlamp/headlamp-clusterrolebinding.yaml", vmpath.GuestAddonsDir, "headlamp-clusterrolebinding.yaml", "6040"), + }, false, "headlamp", "kinvolk.io", "https://minikube.sigs.k8s.io/docs/handbook/addons/headlamp/", + map[string]string{ + "Headlamp": "kinvolk/headlamp:v0.9.0@sha256:465aaee6518f3fdd032965eccd6a8f49e924d144b1c86115bad613872672ec02", + }, + map[string]string{ + "Headlamp": "ghcr.io", + }), } // parseMapString creates a map based on `str` which is encoded as =,=,... diff --git a/site/content/en/docs/handbook/addons/headlamp.md b/site/content/en/docs/handbook/addons/headlamp.md new file mode 100644 index 000000000000..6124ce5948c4 --- /dev/null +++ b/site/content/en/docs/handbook/addons/headlamp.md @@ -0,0 +1,51 @@ +--- +title: "Using Headlamp Addon" +linkTitle: "Headlamp" +weight: 1 +date: 2022-06-08 +--- + +## Headlamp Addon + +[Headlamp](https://kinvolk.github.io/headlamp) is an easy-to-use and extensible Kubernetes web UI. + +### Enable Headlamp on minikube + +To enable this addon, simply run: +```shell script +minikube addons enable headlamp +``` + +Once the addon is enabled, you can access the Headlamp's web UI using the following command. +```shell script +minikube service headlamp -n headlamp +``` + +To authenticate in Headlamp, fetch the Authentication Token using the following command: + +```shell script +export SECRET=$(kubectl get secrets --namespace headlamp -o custom-columns=":metadata.name" | grep "headlamp-token") +kubectl get secret $SECRET --namespace headlamp --template=\{\{.data.token\}\} | base64 --decode +``` + +Headlamp can display more detailed information when metrics-server is installed. To install it, run: + +```shell script +minikube addons enable metrics-server +``` + +### Testing installation + +```shell script +kubectl get pods -n headlamp +``` + +If everything went well, there should be no errors about Headlamp's installation in your Minikube cluster. + +### Disable headlamp + +To disable this addon, simply run: + +```shell script +minikube addons disable headlamp +``` \ No newline at end of file