<p>I am using <code>minikube</code> to run kubernetes cluster. I followed the setup given in <a href="https://istio.io/docs/setup/getting-started/" rel="nofollow noreferrer">Istio Docs</a> to install istio plugin. I am able to access the dashboard using <code>localhost:3000</code> but unable to access using <code>ip:3000</code>. </p>

<p>Checked firewall. It isn’t blocking any port.</p>

Achal Shah
<p>Unfortunately, if you are using <code>istio</code> it's not so easy to just change service type. You have to configure Istio <code>VirtualService</code> and create <code>Gateway</code>. </p>

<p>I am posting this answer as community wiki related to another stack case: <a href="https://stackoverflow.com/a/56019381/11148139">https://stackoverflow.com/a/56019381/11148139</a>
As mentioned question have 1 downvote and might be delete in the future I am posting for future use in this case.</p>

<p>============================================</p>

<p>You can create <a href="https://istio.io/docs/tasks/traffic-management/ingress/#configuring-ingress-using-an-istio-gateway" rel="nofollow noreferrer">Istio Gateway and VirtualService</a> in order to forward your requests to <code>grafana</code> service running by default on port 3000</p>

<p>Firstly, let's check <code>grafana</code> and <code>istio-ingressgateway</code> service</p>

<pre><code>kubectl get svc grafana istio-ingressgateway -n istio-system
NAME                   TYPE           CLUSTER-IP      EXTERNAL-IP                                                               PORT(S)                                                                                                                                      AGE
grafana                ClusterIP      100.71.67.105   &lt;none&gt;                                                                    3000/TCP                                                                                                                                     18h
istio-ingressgateway   LoadBalancer   100.64.42.106   &lt;Public IP address&gt;   15020:31766/TCP,80:31380/TCP,443:31390/TCP,31400:31400/TCP,15029:32576/TCP,15030:30728/TCP,15031:31037/TCP,15032:31613/TCP,15443:32501/TCP   18h
</code></pre>

<p>So, we have <code>grafana</code> running service listening on port 3000, and default <code>istio-ingressgateway</code> LoadBalancer service running with assigned public ip address.</p>

<p>Then we create <code>gateway</code> to use this default LoadBalancer.</p>

<pre><code>$ kubectl apply -f - &lt;&lt;EOF
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: grafana-gateway
  namespace: istio-system # Use same namespace with backend service
spec:
  selector:
    istio: ingressgateway # use Istio default gateway implementation
  servers:
  - port:
      number: 80
      name: HTTP
      protocol: HTTP
    hosts:
    - "*"
EOF
</code></pre>

<p>Then configure route to <code>grafana service</code> for traffic entering via the this gateway:</p>

<pre><code>$ kubectl apply -f - &lt;&lt;EOF
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: grafana
  namespace: istio-system # Use same namespace with backend service
spec:
  hosts:
  - "*"
  gateways:
  - grafana-gateway # define gateway name
  http:
  - match:
    - uri:
        prefix: "/"
    route:
    - destination:
        port:
          number: 3000 # Backend service port
        host: grafana # Backend service name
EOF
</code></pre>

<p>Then hit the <code>http://&lt;public_ip_istio_ingressgateway&gt;</code>, you should see the grafana dashboard</p>

<p>I hope it will be helpful for you.</p>
