<p>I want to expose kubernetes dashboard to multiple users who have access to my vpc, i've seen some examples using internal load balancer with external DNS but i just want to know if there are more suggestions.</p>

<p>When you install the dashboard, the service is set as <code>ClusterIP</code>. To let users from the same VPC access it you need to change the service to <code>NodePort</code>.</p>

<pre><code>$ kubectl get service kubernetes-dashboard -n kube-system
NAME                   TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes-dashboard   ClusterIP   10.0.184.227   &lt;none&gt;        80/TCP          15m
</code></pre>

<p>To change it you have to edit the service:</p>

<pre><code>kubectl edit service kubernetes-dashboard -n kube-system
</code></pre>

<p>And change the <code>.spec.type</code> from <code>ClusterIP</code> to <code>NodePort</code>.</p>

<p>Another option is to patch the service with the following command: </p>

<pre><code>$ kubectl patch service -n kube-system kubernetes-dashboard --patch '{"spec": {"type": "NodePort"}}'
</code></pre>

<p>After you edit or patch it your service is ready to be acceded as you need.</p>

<pre><code>$ kubectl get service kubernetes-dashboard -n kube-system
NAME                   TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes-dashboard   NodePort   10.0.184.227   &lt;none&gt;        80:30334/TCP   18m
...
</code></pre>

<p>Now to connect to the dashboard you have to point your browser to <a href="http://master-node-ip:nodePort" rel="nofollow noreferrer">http://master-node-ip:nodePort</a></p>

<pre><code>$ kubectl describe service kubernetes-dashboard -n kube-system
...
NodePort:                 &lt;unset&gt;  30334/TCP
...
</code></pre>

<pre><code>$ kubectl get node -o wide
NAME                                STATUS   ROLES   AGE   VERSION    INTERNAL-IP   EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
aks-agentpool-20139558-vmss000000   Ready    agent   16m   v1.15.10   10.240.0.5    &lt;none&gt;        Ubuntu 16.04.6 LTS   4.15.0-1071-azure   docker://3.0.10+azure
...
</code></pre>

<p>So based on this example it looks like: <code>http://10.240.0.5:30334</code></p>

<p>And it can be accessed from anyone in the same network as your master node.</p>

<pre><code>$ curl http://10.240.0.5:30334
 &lt;!doctype html&gt; &lt;html ng-app="kubernetesDashboard"&gt; &lt;head&gt; &lt;meta charset="utf-8"&gt; &lt;title ng-controller="kdTitle as $ctrl" ng-bind="$ctrl.title()"&gt;&lt;/title&gt; &lt;link rel="icon" type="image/png" href="assets/images/kubernetes-logo.png"&gt; &lt;meta name="viewport" content="width=device-width"&gt; &lt;link rel="stylesheet" href="static/vendor.93db0a0d.css"&gt; &lt;link rel="stylesheet" href="static/app.ddd3b5ec.css"&gt; &lt;/head&gt; &lt;body ng-controller="kdMain as $ctrl"&gt; &lt;!--[if lt IE 10]&gt;
      &lt;p class="browsehappy"&gt;You are using an &lt;strong&gt;outdated&lt;/strong&gt; browser.
      Please &lt;a href="http://browsehappy.com/"&gt;upgrade your browser&lt;/a&gt; to improve your
      experience.&lt;/p&gt;
    &lt;![endif]--&gt; &lt;kd-login layout="column" layout-fill ng-if="$ctrl.isLoginState()"&gt; &lt;/kd-login&gt; &lt;kd-chrome layout="column" layout-fill ng-if="!$ctrl.isLoginState()"&gt; &lt;/kd-chrome&gt; &lt;script src="static/vendor.bd425c26.js"&gt;&lt;/script&gt; &lt;script src="api/appConfig.json"&gt;&lt;/script&gt; &lt;script src="static/app.91a96542.js"&gt;&lt;/script&gt; &lt;/body&gt; &lt;/html&gt;
</code></pre>

<p>To know more about the different between all Kubernetes services type, check the following links: </p>

<p><a href="https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types" rel="nofollow noreferrer">Publishing Services (ServiceTypes)</a>
Kubernetes – Service Publishing</p>
