<p>I have an Azure kubernetes cluster with Istio service mesh.</p>
<p>Currently the Istio controller is associated with a public load balancer IP. I want to configure the Istio with with Internal load balancer. I would be using the firewall mapping for public IP to Internal LB.</p>
<p>How do I configure the Istio controller to use the internal load balancer?</p>

<p>With istio 1.7 you can use the <code>IstioOperator</code>.</p>
<p>Create a values.yml:</p>
<pre><code>apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  profile: default #or demo
  components:
    ingressGateways:
      - name: istio-ingressgateway
        enabled: true
        k8s:
          serviceAnnotations:
            service.beta.kubernetes.io/azure-load-balancer-internal: &quot;true&quot;
</code></pre>
<p>Now install istio with the command <code>istioctl install -f values.yml</code>.</p>
<p>The ingress gateway will now get an internal loadbalancer with an ip of the clusters vnet as external ip. By this the cluster is only available from inside the vnet or from vnets peered with the clusters one.</p>
<p>If you want to have a fix ip, chose an unused one (here e.g. 10.30.09.20) from the clusters VNet and add:</p>
<pre><code>[...]
  k8s:
    serviceAnnotations:
      service.beta.kubernetes.io/azure-load-balancer-internal: &quot;true&quot;
      service.beta.kubernetes.io/azure-load-balancer-ipv4: 10.30.09.20
</code></pre>
<p>You can check if an ip address is available/unused with the az cli:</p>
<pre><code>az network vnet check-ip-address -g MyResourceGroup -n MyVnet --ip-address 10.30.09.20
</code></pre>
