1. Install heapster:
git clone https://github.com/kubernetes/heapster.git
cd heapster
kubectl create -f deploy/kube-config/influxdb/
kubectl create -f deploy/kube-config/rbac/heapster-rbac.yaml
2. Deploy dashboard k8s
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml
3. Expose Dashboard

more:https://github.com/kubernetes/dashboard/wiki/Accessing-Dashboard---1.7.X-and-above
I use NodePort to access k8s dashboard:
Edit kubernetes-dashboard service.

$ kubectl -n kube-system edit service kubernetes-dashboard

replace ClusterIP by NodePort.
example:

# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
kind: Service
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"k8s-app":"kubernetes-dashboard"},"name":"kubernetes-dashboard","namespace":"kube-system"},"spec":{"ports":[{"port":443,"targetPort":8443}],"selector":{"k8s-app":"kubernetes-dashboard"}}}
  creationTimestamp: 2018-06-28T07:55:42Z
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kube-system
  resourceVersion: "658"
  selfLink: /api/v1/namespaces/kube-system/services/kubernetes-dashboard
  uid: a8187b62-7aa8-11e8-9012-fa163e6b3c52
spec:
  clusterIP: 10.101.42.25
  ports:
  - port: 443
    protocol: TCP
    targetPort: 8443
  selector:
    k8s-app: kubernetes-dashboard
  sessionAffinity: None
  type: NodePort
status:
  loadBalancer: {}

Next we need to check port on which Dashboard was exposed.

$ kubectl -n kube-system get service kubernetes-dashboard
NAME                   TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)         AGE
kubernetes-dashboard   NodePort   10.101.42.25   <none>        443:30748/TCP   15m

Now we can access to our dashboard in web browser at: https://<master-ip>:30748/

4. Access Dashboard

more: https://github.com/kubernetes/dashboard/wiki/Creating-sample-user
admin-user-service-account.yaml

apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kube-system

Create ClusterRoleBinding
admin-user-RoleBinding.yaml

apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kube-system

Creating Service Account with name admin-user in namespace kube-system.

[[email protected] ~]# kubectl apply -f admin-user-service-account.yaml
serviceaccount "admin-user" created
[[email protected] ~]# kubectl apply -f admin-user-RoleBinding.yaml
clusterrolebinding.rbac.authorization.k8s.io "admin-user" created

Now, Get token to login dashboard:

[[email protected] ~]# kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')
Name:         admin-user-token-fq458
Namespace:    kube-system
Labels:       <none>
Annotations:  kubernetes.io/service-account.name=admin-user
              kubernetes.io/service-account.uid=353c50ce-7aad-11e8-9012-fa163e6b3c52

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     1025 bytes
namespace:  11 bytes
token:      eyJhbGciOiJSxadqwdfgerrqe435hbvs90iapdjkaYydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLWZxNDU4Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiIzNTNjNTBjZS03YWFkLTExZTgtOTAxMi1mYTE2M2U2YjNjNTIiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06YWRtaW4tdXNlciJ9.myQiKK8FNtt2lidivqsupdVzDEXJFYulxw90QBvfv4WdZXPdBduMIUJHlVnoLMiCd45zZKgyLsqNzTzD97Ir4eNwQm1yPZFV1q_4OIKvcfs_HCFu8yeS6rys7O8Yje41NxR0WlwJ9nFGPNe_uNwxKpx0avYXgKE7OltbbxXsbjnaP3q9OhEgtyhunc3CYImTyhLIDz2327sPTfxN1_IkpZS-fHD_MCtgDfl6kd3STmzpR9rQVdtVFxrpUhdFApwIxoM0XwwJ4W2K4As9i8c709dd1QOB55WPXpEm0wcgjGoOMpnXAN4gRqkK4YmKV-pOSnQVe121KNocsaqakA_wGA
[[email protected] ~]# 

Get NodePort access dashboard:

# kubectl get svc -n kube-system
NAME                   TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)         AGE
heapster               ClusterIP   10.103.207.36   <none>        80/TCP          5m
kube-dns               ClusterIP   10.96.0.10      <none>        53/UDP,53/TCP   6m
kubernetes-dashboard   NodePort    10.107.27.26    <none>        443:30309/TCP   5m
monitoring-grafana     ClusterIP   10.98.29.122    <none>        80/TCP          5m
monitoring-influxdb    ClusterIP   10.110.95.37    <none>        8086/TCP        5m

Url: https://<ip_master>:30309

Use Token login.
Enjoy!!!