# UDP loadbalancing

This example shows how to implement UDP loadbalancing through the Nginx Controller

## Prerequisites

You need a [Default Backend service](/examples/deployment/nginx/README.md#default-backend) and a [kube-dns service](https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/dns#kube-dns) for this example
```
$ kubectl -n kube-system get svc 
NAMESPACE     NAME                   CLUSTER-IP      EXTERNAL-IP   PORT(S)         AGE
kube-system   default-http-backend   192.168.3.204   <none>        80/TCP          1d
kube-system   kube-dns               192.168.3.10    <none>        53/UDP,53/TCP   23h
```

## Config UDP Service

To configure which services and ports will be exposed:
```
$ kubectl create -f nginx-udp-ingress-configmap.yaml
configmap "nginx-udp-ingress-configmap" created

$ kubectl -n kube-system get configmap 
NAME                                 DATA      AGE
extension-apiserver-authentication   1         1d
kube-dns                             0         1d
nginx-udp-ingress-configmap          1         15m

$ kubectl -n kube-system describe configmap nginx-udp-ingress-configmap
Name:           nginx-udp-ingress-configmap
Namespace:      kube-system
Labels:         <none>
Annotations:    <none>

Data
====
9001:
----
kube-system/kube-dns:53
```

The file `nginx-udp-ingress-configmap.yaml` uses a ConfigMap where the key is the external port to use and the value is
`<namespace/service name>:<service port>`

## Deploy
```
$ kubectl create -f nginx-udp-ingress-controller.yaml
replicationcontroller "nginx-udp-ingress-controller" created

$ kubectl -n kube-system get rc
NAME                           DESIRED   CURRENT   READY     AGE
nginx-udp-ingress-controller   1         1         1         13m

$ kubectl -n kube-system describe rc nginx-udp-ingress-controller
Name:           nginx-udp-ingress-controller
Namespace:      kube-system
Image(s):       gcr.io/google_containers/nginx-ingress-controller:0.9.0-beta.15
Selector:       k8s-app=nginx-udp-ingress-lb
Labels:         k8s-app=nginx-udp-ingress-lb
Annotations:    <none>
Replicas:       1 current / 1 desired
Pods Status:    1 Running / 0 Waiting / 0 Succeeded / 0 Failed
No volumes.
Events:
  FirstSeen     LastSeen        Count   From                    SubObjectPath   Type            Reason                  Message
  ---------     --------        -----   ----                    -------------   --------        ------                  -------
  46s           46s             1       replication-controller                  Normal          SuccessfulCreate        Created pod: nginx-udp-ingress-controller-m0pjl
  
$ kubectl -n kube-system get po -o wide
NAME                                    READY     STATUS    RESTARTS   AGE       IP           
NAME                                    READY     STATUS    RESTARTS   AGE       IP            NODE
default-http-backend-2198840601-5j1zc   1/1       Running   0          1d        172.16.45.3   10.114.51.28
kube-dns-1874783228-nvs9f               3/3       Running   0          23h       172.16.10.3   10.114.51.217
nginx-udp-ingress-controller-m0pjl      1/1       Running   0          1m        172.16.10.2   10.114.51.217
```

## Test
```
$ nc -uzv 172.16.10.2 9001
Connection to 172.16.10.2 9001 port [udp/*] succeeded!
```
