# Kubernetes Dashboard - Official Web UI # Deploy with: kubectl apply -f manifests/alaska/k8s-dashboard.yaml apiVersion: v1 kind: Namespace metadata: name: kubernetes-dashboard --- apiVersion: v1 kind: ServiceAccount metadata: name: admin-user namespace: kubernetes-dashboard --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: admin-user roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: admin-user namespace: kubernetes-dashboard --- apiVersion: v1 kind: Secret metadata: name: admin-user namespace: kubernetes-dashboard annotations: kubernetes.io/service-account.name: "admin-user" type: kubernetes.io/service-account-token --- apiVersion: apps/v1 kind: Deployment metadata: name: kubernetes-dashboard namespace: kubernetes-dashboard labels: k8s-app: kubernetes-dashboard spec: replicas: 1 revisionHistoryLimit: 10 selector: matchLabels: k8s-app: kubernetes-dashboard template: metadata: labels: k8s-app: kubernetes-dashboard spec: containers: - name: kubernetes-dashboard image: kubernetesui/dashboard:v2.7.0 imagePullPolicy: IfNotPresent ports: - containerPort: 8443 protocol: TCP args: - --auto-generate-certificates - --namespace=kubernetes-dashboard - --enable-skip-login # Skip-login uses the "kubernetes-dashboard" ServiceAccount below, # which only has get/list/watch (view-only) - so opening the # dashboard needs no token, but it can't edit/delete/exec. # For write access, still log in with the admin-user token # (kubectl -n kubernetes-dashboard create token admin-user). # # --token-ttl=0 was tried here to disable the 15-min idle # timeout, but login broke immediately after that pod came up - # in this dashboard version, 0 appears to mean "expire # immediately" rather than "never expire". Reverted; back to # the default 900s timeout until a properly-tested value (e.g. # a long finite number of seconds) is confirmed safe. volumeMounts: - name: kubernetes-dashboard-certs mountPath: /certs - name: tmp-volume mountPath: /tmp securityContext: allowPrivilegeEscalation: false readOnlyRootFilesystem: true runAsUser: 1001 runAsGroup: 2001 livenessProbe: httpGet: scheme: HTTPS path: / port: 8443 initialDelaySeconds: 30 timeoutSeconds: 30 periodSeconds: 10 failureThreshold: 3 resources: limits: cpu: 200m memory: 256Mi requests: cpu: 100m memory: 128Mi volumes: - name: kubernetes-dashboard-certs secret: secretName: kubernetes-dashboard-certs - name: tmp-volume emptyDir: {} serviceAccountName: kubernetes-dashboard nodeSelector: "kubernetes.io/os": linux tolerations: - key: node-role.kubernetes.io/master operator: Exists effect: NoSchedule - key: node-role.kubernetes.io/control-plane operator: Exists effect: NoSchedule --- apiVersion: v1 kind: Service metadata: name: kubernetes-dashboard namespace: kubernetes-dashboard labels: k8s-app: kubernetes-dashboard spec: type: ClusterIP ports: - port: 443 targetPort: 8443 protocol: TCP name: https selector: k8s-app: kubernetes-dashboard --- apiVersion: v1 kind: ServiceAccount metadata: name: kubernetes-dashboard namespace: kubernetes-dashboard --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: kubernetes-dashboard rules: - apiGroups: [""] resources: ["*"] verbs: ["get", "list", "watch"] - apiGroups: ["apps"] resources: ["*"] verbs: ["get", "list", "watch"] - apiGroups: ["networking.k8s.io"] resources: ["*"] verbs: ["get", "list", "watch"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: kubernetes-dashboard roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: kubernetes-dashboard subjects: - kind: ServiceAccount name: kubernetes-dashboard namespace: kubernetes-dashboard --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: kubernetes-dashboard-secrets namespace: kubernetes-dashboard rules: - apiGroups: [""] resources: ["secrets"] verbs: ["get", "update", "create"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: kubernetes-dashboard-secrets namespace: kubernetes-dashboard roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: kubernetes-dashboard-secrets subjects: - kind: ServiceAccount name: kubernetes-dashboard namespace: kubernetes-dashboard --- apiVersion: v1 kind: Secret metadata: name: kubernetes-dashboard-certs namespace: kubernetes-dashboard type: Opaque --- apiVersion: v1 kind: Secret metadata: name: kubernetes-dashboard-csrf namespace: kubernetes-dashboard type: Opaque data: csrf: "" # Will be auto-generated by dashboard --- apiVersion: v1 kind: ConfigMap metadata: name: dashboard-proxy-config namespace: kubernetes-dashboard data: nginx.conf: | events { worker_connections 1024; } http { upstream k8s_dashboard { server kubernetes-dashboard:443; } server { listen 8083; server_name _; location / { proxy_pass https://k8s_dashboard; proxy_ssl_verify off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_connect_timeout 60s; proxy_send_timeout 60s; proxy_read_timeout 60s; } } } --- apiVersion: apps/v1 kind: StatefulSet metadata: name: dashboard-proxy namespace: kubernetes-dashboard labels: app.kubernetes.io/name: dashboard-proxy app.kubernetes.io/part-of: kubernetes-dashboard spec: serviceName: "dashboard-proxy" replicas: 1 selector: matchLabels: app.kubernetes.io/name: dashboard-proxy template: metadata: labels: app.kubernetes.io/name: dashboard-proxy app.kubernetes.io/part-of: kubernetes-dashboard spec: containers: - name: nginx image: nginx:alpine ports: - containerPort: 8083 volumeMounts: - name: nginx-config mountPath: /etc/nginx/nginx.conf subPath: nginx.conf resources: requests: memory: "64Mi" cpu: "50m" limits: memory: "128Mi" cpu: "100m" volumes: - name: nginx-config configMap: name: dashboard-proxy-config --- apiVersion: v1 kind: Service metadata: name: dashboard-proxy namespace: kubernetes-dashboard labels: app.kubernetes.io/name: dashboard-proxy spec: type: NodePort selector: app.kubernetes.io/name: dashboard-proxy ports: - port: 8083 targetPort: 8083 nodePort: 30826 protocol: TCP