Install dashboard
To run the following command to deploy dashboard
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.0/aio/deploy/recommended.yaml
once done, to check the resource status under the namespace of kubernetes-dashboard, if all the resources are running, that means dashboard is deployed successfully.
ps:
- On above screenshot, you can see the EXTERNAL-IP for kubernetes-dashboard service, the reason is i edit the service change the type from ClusterIp to LoadBalancer, and the loadbalancer is backed by Metallb.
 - Brower(Chrome) will block the dasboard access though the https://192.168.58.156 since the tls cert is generated by kubernetes during installation, it can not be trusted by CA, this issue will be resolved in later step.
 
Generate TLS Cert
Suppose you have already a domain name, or buy a domain name from Alicloud, AWS, or godady,etc. Here i will use Alicould for instance, my Domain name is it-meta.space.
Create free TSL cert
the menu naviagation is in below: Aliyun Console » Certificate Management Service » SSL Certificates » Manage Free Certificates
on the Free cert management page, you can create 20 free certs, after raising request, the cert will be ready within minutes.

Download the cert
On the right hand side of the cert generated, you can trigger the cert download after click the ‘Download’ or 3 dot mean.
in the package downloaded, there are two files, 1 key file and 1 cert.

Replace TSL cert
Run following command to relace the TSL certs with newly downloaded in above steps.
# check existing secert
kubectl get secret kubernetes-dashboard-certs -n kubernetes-dashboard
# remove the current secert
kubectl delete secret kubernetes-dashboard-certs -n kubernetes-dashboard
# create a secert with same name - kubernetes-dashboard-certs
kubectl create secret generic kubernetes-dashboard-certs --from-file=7588655_dashboard.it-meta.space.key --from-file=7588655_dashboard.it-meta.space.pem -n kubernetes-dashboard
# delete the kubernetes pod to force system to auto schedule a new one and applying the new secret.
kubectl delete pod/${kubectl get pod -n kubernetes-dashboard|grep kubernetes-dashboard-|awk '{print $1}'}
Setup Ingress for the dashboard
In order to expose the dashboard endpoint with https protocol, here will leverage the Ingress-nginx to support TLS connection.
Create Secret for ingress
To run following command to do the creation.
kubectl create secret tls k8s-dashboard --key 7588655_dashboard.it-meta.space.key --cert 7588655_dashboard.it-meta.space.pem -n kubernetes-dashboard
kubectl get secret -n kubernetes-dashboard
Captured screenshot for reference.

Create Ingress for dashboard
here is the sample of yaml file - k8s-dashboard-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: k8s-dashboard-ingress
  namespace: kubernetes-dashboard
  annotations:
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
  ingressClassName: nginx
  rules:
  - host: dashboard.it-meta.space
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: kubernetes-dashboard
            port:
              number: 443
  tls:
  - secretName: k8s-dashboard
    hosts:
    - dashboard.it-meta.space
kubectl apply -f k8s-dashboard-ingress.yaml
After the ingress creation, if you want to know the nginx config, you can enter log into the ingress-nginx-controller pod to check the nginx.conf.
Jamies-MacBook-Pro:dashboard jamie$ kubectl get pod -n ingress-nginx
NAME                                               READY   STATUS    RESTARTS      AGE
ingress-ingress-nginx-controller-c8b8497fb-559sg   1/1     Running   1 (13h ago)   24h
Jamies-MacBook-Pro:dashboard jamie$ kubectl exec -it ingress-ingress-nginx-controller-c8b8497fb-559sg -n ingress-nginx -- bash 
bash-5.1$ ls
fastcgi.conf            koi-win                 nginx.conf              template
fastcgi.conf.default    lua                     nginx.conf.default      uwsgi_params
fastcgi_params          mime.types              opentracing.json        uwsgi_params.default
fastcgi_params.default  mime.types.default      owasp-modsecurity-crs   win-utf
geoip                   modsecurity             scgi_params
koi-utf                 modules                 scgi_params.default
bash-5.1$ cat nginx.conf
...
## start server dashboard.it-meta.space
	server {
		server_name dashboard.it-meta.space ;
		
		listen 80  ;
		listen 443  ssl http2 ;
		
		set $proxy_upstream_name "-";
		
		ssl_certificate_by_lua_block {
			certificate.call()
		}
...
Access the dashboard
DNS resolve for local(Optional)
if you are doing the setup on VM/machine which has public access, then you could access the dashboard url directly.
if you are doing it in local with host only network, then you have to take care of the DNS resolve, what need to do is to change the hosts file directly, thus for my case, i’m using vmware fusion on Macbook, i have to change the hosts file to make the FQDN to point to the EXTERNAL-IP of the ingress nginx controller service.
192.168.58.155 dashboard.it-meta.space
Access the dashboard
Until now, the setup is almost done, let’s try the dashboard.

It looks good, now trying to get token and login it.
Using below command to get login token and use it to login the dashboard console.
kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep kubernetes-dashboard | awk ‘{print $1}’)
Optional - create a new user with cluster-admin role
Becuase the existing user kubernetes-dashboard has very limited access right to cluster resources, hence suggest to create a new service account.
apiVersion: v1
kind: ServiceAccount
metadata:
  name: dashboard-admin
  namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: dashboard-admin-cluster-role-binding
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: dashboard-admin
  namespace: kubernetes-dashboard
once done, can use this new user to get token to login dashboard.
v1.23 and older  version
kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep dashboard-admin | awk ‘{print $1}’) 
v1.24 and later version
kubectl -n kubernetes-dashboard create token dashboard-admin 
after login, you can see the resources running on the clusters and do the operation work through this dashboard.

「真诚赞赏,手留余香」
真诚赞赏,手留余香
使用微信扫描二维码完成支付