<p>How to access the canonical kubernetes dashboard from external network/IP? 
Is there a way to expose dashboard services externally rather accessing from the localhost browser where the canonical k8s cluster node?</p>

<p><a href="https://github.com/kubernetes/dashboard/wiki/Accessing-Dashboard---1.7.X-and-above" rel="noreferrer">The documentation has a guide</a> on how to do it.</p>
<h2>Using kubectl proxy</h2>
<p><code>kubectl proxy</code> creates proxy server between your machine and Kubernetes API server. By default it is only accessible locally (from the machine that started it).
Start local proxy server:</p>
<pre><code>$ kubectl proxy

Starting to serve on 127.0.0.1:8001
</code></pre>
<p>Once proxy server is started you should be able to access Dashboard from your browser.</p>
<p>To access HTTPS endpoint of dashboard go to: <code>http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/</code></p>
<p>NOTE: Dashboard should not be exposed publicly using kubectl proxy command as it only allows HTTP connection. For domains other than localhost and 127.0.0.1 it will not be possible to sign in. Nothing will happen after clicking Sign in button on login page.</p>
<h2>Using NodePort</h2>
<p>This way of accessing Dashboard is only recommended for development environments in a single node setup.
Edit <code>kubernetes-dashboard</code> service.</p>
<pre><code>$ kubectl -n kube-system edit service kubernetes-dashboard
</code></pre>
<p>You should see yaml representation of the service. Change type: ClusterIP to type: NodePort and save file. If it's already changed go to next step.</p>
<pre><code># 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
...
  name: kubernetes-dashboard
  namespace: kube-system
  resourceVersion: &quot;343478&quot;
  selfLink: /api/v1/namespaces/kube-system/services/kubernetes-dashboard-head
  uid: 8e48f478-993d-11e7-87e0-901b0e532516
spec:
  clusterIP: 10.100.124.90
  externalTrafficPolicy: Cluster
  ports:
  - port: 443
    protocol: TCP
    targetPort: 8443
  selector:
    k8s-app: kubernetes-dashboard
  sessionAffinity: None
  type: ClusterIP
status:
  loadBalancer: {}
</code></pre>
<p>Next we need to check port on which Dashboard was exposed.</p>
<pre><code>$ kubectl -n kube-system get service kubernetes-dashboard
NAME                   CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes-dashboard   10.100.124.90   &lt;nodes&gt;       443:31707/TCP   21h
</code></pre>
<p>Dashboard has been exposed on port 31707 (HTTPS). Now you can access it from your browser at: <code>https://&lt;master-ip&gt;:31707</code>. <code>master-ip</code> can be found by executing <code>kubectl cluster-info</code>. Usually it is either 127.0.0.1 or IP of your machine, assuming that your cluster is running directly on the machine, on which these commands are executed.</p>
<p>In case you are trying to expose Dashboard using NodePort on a multi-node cluster, then you have to find out IP of the node on which Dashboard is running to access it. Instead of accessing <code>https://&lt;master-ip&gt;:&lt;nodePort&gt;</code> you should access <code>https://&lt;node-ip&gt;:&lt;nodePort&gt;</code>.</p>
<h2>API Server</h2>
<p>In case Kubernetes API server is exposed and accessible from outside you can directly access dashboard at: <code>https://&lt;master-ip&gt;:&lt;apiserver-port&gt;/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/</code></p>
<h2>Ingress</h2>
<p>Dashboard can be also exposed using Ingress resource. For example</p>
<pre><code>apiVersion: extensions/v1beta1
kind: Ingress
metadata:
 name: kubernetes-dashboard-ingress
 namespace: kube-system
spec:
 rules:
   — host: kubernetes
     http:
       paths:
         — path: /ui
           backend:
             serviceName: kubernetes-dashboard
             servicePort: 80
</code></pre>
