diff --git a/deploy/addons/assets.go b/deploy/addons/assets.go index a1c11e795f..d7f8f7adce 100644 --- a/deploy/addons/assets.go +++ b/deploy/addons/assets.go @@ -170,4 +170,8 @@ var ( // NvidiaDevicePlugin assets for nvidia-device-plugin addon //go:embed nvidia-device-plugin/*.tmpl NvidiaDevicePlugin embed.FS + + // YakdAssets assets for yakd addon + //go:embed yakd/*.yaml yakd/*.tmpl + YakdAssets embed.FS ) diff --git a/deploy/addons/yakd/yakd-crb.yaml b/deploy/addons/yakd/yakd-crb.yaml new file mode 100644 index 0000000000..abace7a20d --- /dev/null +++ b/deploy/addons/yakd/yakd-crb.yaml @@ -0,0 +1,16 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: yakd-dashboard + labels: + app.kubernetes.io/name: yakd-dashboard + kubernetes.io/minikube-addons: yakd-dashboard + addonmanager.kubernetes.io/mode: Reconcile +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: cluster-admin +subjects: +- kind: ServiceAccount + name: yakd-dashboard + namespace: yakd-dashboard diff --git a/deploy/addons/yakd/yakd-dp.yaml.tmpl b/deploy/addons/yakd/yakd-dp.yaml.tmpl new file mode 100644 index 0000000000..3f00b2fa6c --- /dev/null +++ b/deploy/addons/yakd/yakd-dp.yaml.tmpl @@ -0,0 +1,69 @@ +kind: Deployment +apiVersion: apps/v1 +metadata: + labels: + app.kubernetes.io/name: yakd-dashboard + app.kubernetes.io/instance: yakd-dashboard + kubernetes.io/minikube-addons: yakd-dashboard + addonmanager.kubernetes.io/mode: Reconcile + name: yakd-dashboard + namespace: yakd-dashboard +spec: + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + app.kubernetes.io/name: yakd-dashboard + app.kubernetes.io/instance: yakd-dashboard + template: + metadata: + labels: + app.kubernetes.io/name: yakd-dashboard + app.kubernetes.io/instance: yakd-dashboard + gcp-auth-skip-secret: "true" + spec: + containers: + - name: yakd + image: {{.CustomRegistries.Yakd | default .ImageRepository | default .Registries.Yakd }}{{.Images.Yakd}} + imagePullPolicy: IfNotPresent + ports: + - name: http + containerPort: 8080 + protocol: TCP + env: + - name: KUBERNETES_NAMESPACE + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.namespace + - name: HOSTNAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.name + resources: + limits: + memory: 256Mi + requests: + memory: 128Mi + securityContext: + allowPrivilegeEscalation: false + privileged: false + runAsUser: 1001 + runAsGroup: 2001 + livenessProbe: + httpGet: + path: / + port: 8080 + initialDelaySeconds: 10 + timeoutSeconds: 10 + readinessProbe: + httpGet: + path: / + port: 8080 + initialDelaySeconds: 10 + timeoutSeconds: 10 + restartPolicy: Always + serviceAccountName: yakd-dashboard + nodeSelector: + "kubernetes.io/os": linux diff --git a/deploy/addons/yakd/yakd-ns.yaml b/deploy/addons/yakd/yakd-ns.yaml new file mode 100644 index 0000000000..a4bbd8e69f --- /dev/null +++ b/deploy/addons/yakd/yakd-ns.yaml @@ -0,0 +1,7 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: yakd-dashboard + labels: + kubernetes.io/minikube-addons: yakd-dashboard + addonmanager.kubernetes.io/mode: Reconcile diff --git a/deploy/addons/yakd/yakd-sa.yaml b/deploy/addons/yakd/yakd-sa.yaml new file mode 100644 index 0000000000..56666980fc --- /dev/null +++ b/deploy/addons/yakd/yakd-sa.yaml @@ -0,0 +1,9 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + app.kubernetes.io/name: yakd-dashboard + kubernetes.io/minikube-addons: yakd-dashboard + addonmanager.kubernetes.io/mode: Reconcile + name: yakd-dashboard + namespace: yakd-dashboard diff --git a/deploy/addons/yakd/yakd-svc.yaml b/deploy/addons/yakd/yakd-svc.yaml new file mode 100644 index 0000000000..6dd2081732 --- /dev/null +++ b/deploy/addons/yakd/yakd-svc.yaml @@ -0,0 +1,17 @@ +kind: Service +apiVersion: v1 +metadata: + labels: + app.kubernetes.io/name: yakd-dashboard + kubernetes.io/minikube-addons: yakd-dashboard + addonmanager.kubernetes.io/mode: Reconcile + name: yakd-dashboard + namespace: yakd-dashboard +spec: + type: NodePort + ports: + - port: 80 + targetPort: 8080 + selector: + app.kubernetes.io/name: yakd-dashboard + app.kubernetes.io/instance: yakd-dashboard diff --git a/pkg/addons/addons.go b/pkg/addons/addons.go index cba3b2f4b5..d12e9128ae 100644 --- a/pkg/addons/addons.go +++ b/pkg/addons/addons.go @@ -150,6 +150,12 @@ kubectl get secret $SECRET --namespace headlamp --template=\{\{.data.token\}\} | minikube{{.profileArg}} addons enable metrics-server `, out.V{"profileArg": tipProfileArg}) + case "yakd": + out.Styled(style.Tip, `To access YAKD - Kubernetes Dashboard, wait for Pod to be ready and run the following command: + + minikube service yakd-dashboard -n yakd-dashboard + +`) } } diff --git a/pkg/addons/config.go b/pkg/addons/config.go index 3e5f96aeb9..bbfc8a9011 100644 --- a/pkg/addons/config.go +++ b/pkg/addons/config.go @@ -232,4 +232,9 @@ var Addons = []*Addon{ set: SetBool, callbacks: []setFn{EnableOrDisableAddon}, }, + { + name: "yakd", + set: SetBool, + callbacks: []setFn{EnableOrDisableAddon}, + }, } diff --git a/pkg/minikube/assets/addons.go b/pkg/minikube/assets/addons.go index a8c41211fc..d20a34900f 100644 --- a/pkg/minikube/assets/addons.go +++ b/pkg/minikube/assets/addons.go @@ -787,6 +787,19 @@ var Addons = map[string]*Addon{ }, map[string]string{ "NvidiaDevicePlugin": "nvcr.io", }), + "yakd": NewAddon([]*BinAsset{ + MustBinAsset(addons.YakdAssets, "yakd/yakd-ns.yaml", vmpath.GuestAddonsDir, "yakd-ns.yaml", "0640"), + MustBinAsset(addons.YakdAssets, "yakd/yakd-sa.yaml", vmpath.GuestAddonsDir, "yakd-sa.yaml", "0640"), + MustBinAsset(addons.YakdAssets, "yakd/yakd-crb.yaml", vmpath.GuestAddonsDir, "yakd-crb.yaml", "0640"), + MustBinAsset(addons.YakdAssets, "yakd/yakd-svc.yaml", vmpath.GuestAddonsDir, "yakd-svc.yaml", "0640"), + MustBinAsset(addons.YakdAssets, "yakd/yakd-dp.yaml.tmpl", vmpath.GuestAddonsDir, "yakd-dp.yaml", "0640"), + }, false, "yakd", "3rd party (marcnuri.com)", "manusa", "https://minikube.sigs.k8s.io/docs/handbook/addons/yakd/", + map[string]string{ + "Yakd": "marcnuri/yakd:0.0.3@sha256:ebb5a2378be98b0674e5fb123b37812c5f2108791bfe3a1f579bf71718eac63b", + }, + map[string]string{ + "Yakd": "docker.io", + }), } // parseMapString creates a map based on `str` which is encoded as =,=,... diff --git a/site/content/en/docs/handbook/addons/yakd-kubernetes-dashboard.md b/site/content/en/docs/handbook/addons/yakd-kubernetes-dashboard.md new file mode 100644 index 0000000000..9900ad9a19 --- /dev/null +++ b/site/content/en/docs/handbook/addons/yakd-kubernetes-dashboard.md @@ -0,0 +1,42 @@ +--- +title: "Using the YAKD - Kubernetes Dashboard Addon" +linkTitle: "YAKD - Kubernetes Dashboard" +weight: 1 +date: 2023-12-12 +--- + +## YAKD - Kubernetes Dashboard Addon + +[YAKD - Kubernetes Dashboard](https://github.com/manusa/yakd) is a full-featured web-based Kubernetes Dashboard with special functionality for Minikube. + +The dashboard features a real-time Search pane that allows you to search for Kubernetes resources and see them update in real-time as you type. + +### Enable YAKD - Kubernetes Dashboard on minikube + +To enable this addon, simply run: + +```shell script +minikube addons enable yakd +``` + +Once the addon is enabled, you can access the YAKD - Kubernetes Dashboard's web UI using the following command. + +```shell script +minikube service yakd-dashboard -n yakd-dashboard +``` + +There dashboard will open in a new browser window and you should be able to start using it with no further hassle. + +YAKD - Kubernetes Dashboard is also compatible with metrics-server. To install it, run: + +```shell script +minikube addons enable metrics-server +``` + +### Disable YAKD - Kubernetes Dashboard + +To disable this addon, simply run: + +```shell script +minikube addons disable yakd +``` diff --git a/test/integration/addons_test.go b/test/integration/addons_test.go index 38e219fa97..555bb6ddd5 100644 --- a/test/integration/addons_test.go +++ b/test/integration/addons_test.go @@ -134,6 +134,7 @@ func TestAddons(t *testing.T) { {"CloudSpanner", validateCloudSpannerAddon}, {"LocalPath", validateLocalPathAddon}, {"NvidiaDevicePlugin", validateNvidiaDevicePlugin}, + {"Yakd", validateYakdAddon}, } for _, tc := range tests { tc := tc @@ -955,3 +956,16 @@ func validateNvidiaDevicePlugin(ctx context.Context, t *testing.T, profile strin t.Errorf("failed to disable nvidia-device-plugin: args %q : %v", rr.Command(), err) } } + +func validateYakdAddon(ctx context.Context, t *testing.T, profile string) { + defer PostMortemLogs(t, profile) + + rr, err := Run(t, exec.CommandContext(ctx, Target(), "addons", "enable", "yakd", "-p", profile, "--alsologtostderr", "-v=1")) + if err != nil { + t.Fatalf("failed to enable yakd addon: args: %q: %v", rr.Command(), err) + } + + if _, err := PodWait(ctx, t, profile, "yakd-dashboard", "app.kubernetes.io/name=yakd-dashboard", Minutes(2)); err != nil { + t.Fatalf("failed waiting for YAKD - Kubernetes Dashboard pod: %v", err) + } +}