---
title: Configuring Istio Ingress with AWS NLB
description: Describes how to configure Istio ingress with a network load balancer on AWS.
publishdate: 2018-04-20
last_update: 2019-01-16
subtitle: Ingress AWS Network Load Balancer
attribution: Julien SENON
keywords: [ingress,traffic-management,aws]
target_release: 1.0
---

{{< tip >}}
This post was updated on January 16, 2019 to include some usage warnings.
{{< /tip >}}

This post provides instructions to use and configure ingress Istio with [AWS Network Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/introduction.html).

Network load balancer (NLB) could be used instead of classical load balancer. You can see the [comparison](https://aws.amazon.com/elasticloadbalancing/details/#Product_comparisons) between different AWS `loadbalancer` for more explanation.

## Prerequisites

The following instructions require a Kubernetes **1.9.0 or newer** cluster.

{{< warning >}}
Usage of AWS `nlb` on Kubernetes is an Alpha feature and not recommended for production clusters.

Usage of AWS `nlb` does not support the creation of two or more Kubernetes clusters running Istio in the same zone as a result of [Kubernetes Bug #69264](https://github.com/kubernetes/kubernetes/issues/69264).
{{< /warning >}}

## IAM policy

You need to apply policy on the master role in order to be able to provision network load balancer.

1. In AWS `iam` console click on policies and click on create a new one:

    {{< image width="80%" link="./createpolicystart.png" caption="Create a new policy" >}}

1. Select `json`:

    {{< image width="80%" link="./createpolicyjson.png" caption="Select json" >}}

1. Copy/paste text below:

    {{< text json >}}
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "kopsK8sNLBMasterPermsRestrictive",
                "Effect": "Allow",
                "Action": [
                    "ec2:DescribeVpcs",
                    "elasticloadbalancing:AddTags",
                    "elasticloadbalancing:CreateListener",
                    "elasticloadbalancing:CreateTargetGroup",
                    "elasticloadbalancing:DeleteListener",
                    "elasticloadbalancing:DeleteTargetGroup",
                    "elasticloadbalancing:DescribeListeners",
                    "elasticloadbalancing:DescribeLoadBalancerPolicies",
                    "elasticloadbalancing:DescribeTargetGroups",
                    "elasticloadbalancing:DescribeTargetHealth",
                    "elasticloadbalancing:ModifyListener",
                    "elasticloadbalancing:ModifyTargetGroup",
                    "elasticloadbalancing:RegisterTargets",
                    "elasticloadbalancing:SetLoadBalancerPoliciesOfListener"
                ],
                "Resource": [
                    "*"
                ]
            },
            {
                "Effect": "Allow",
                "Action": [
                    "ec2:DescribeVpcs",
                    "ec2:DescribeRegions"
                ],
                "Resource": "*"
            }
        ]
    }
    {{< /text >}}

1. Click review policy, fill all fields and click create policy:

    {{< image width="80%" link="./create_policy.png" caption="Validate policy" >}}

1. Click on roles, select you master role nodes, and click attach policy:

    {{< image link="./roles_summary.png" caption="Attach policy" >}}

1. Your policy is now attach to your master node.

## Generate the Istio manifest

To use an AWS `nlb` load balancer, it is necessary to add an AWS specific
annotation to the Istio installation.  These instructions explain how to
add the annotation.

Save this as the file `override.yaml`:

{{< text yaml >}}
gateways:
  istio-ingressgateway:
    serviceAnnotations:
      service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
{{< /text >}}

Generate a manifest with Helm:

{{< text bash >}}
$ helm template install/kubernetes/helm/istio --namespace istio -f override.yaml > $HOME/istio.yaml
{{< /text >}}
