Skip to content

Commit

Permalink
Add Ambassador tutorial
Browse files Browse the repository at this point in the history
  • Loading branch information
concaf committed May 19, 2020
1 parent 4a4a470 commit 81dabc9
Showing 1 changed file with 131 additions and 0 deletions.
131 changes: 131 additions & 0 deletions site/content/en/docs/tutorials/ambassador_ingress_controller.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
---
title: "Using Ambassador Ingress Controller"
linkTitle: "Using Ambassador Ingress Controller"
weight: 1
date: 2020-05-14
description: >
Using Ambassador Ingress Controller with Minikube
---

## Overview

[Ambassador](https://getambassador.io/) allows access to Kubernetes services running inside Minikube. Ambassador can be
configured via both, [Ingress](https://kubernetes.io/docs/concepts/services-networking/ingress/) resources and
[Mapping](https://www.getambassador.io/docs/latest/topics/using/intro-mappings/) resources.

## Prerequisites

- Minikube version higher than v1.10.1
- kubectl

## Configuring Ambassador

### Installing Ambassador

Ambassador is available as a Minikube
[addon]((https://github.com/kubernetes/minikube/tree/master/deploy/addons/ambassdor)). Install it by running -

```shell script
minikube addons enable ambassador
```

This will install Ambassador in the namespace `ambassador`.

### Accessing Ambassador via `minikube tunnel`

The service `ambassador` is of type `LoadBalancer`. To access this service, run a
[Minikube tunnel](https://minikube.sigs.k8s.io/docs/handbook/accessing/#using-minikube-tunnel) in a separate terminal.

```shell script
minikube tunnel
```

You can now access Ambassador at the external IP allotted to the `ambassador` service.
Get the external IP with the following command:
```shell script
kubectl get service ambassador -n ambassador
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ambassador LoadBalancer 10.104.86.124 10.104.86.124 80:31287/TCP,443:31934/TCP 77m
```

### Configuring via Ingress resource

In this tutorial, we'll configure Ambassador via an Ingress resource. To configure via `IngressClass` resource, read
this [post](https://blog.getambassador.io/new-kubernetes-1-18-extends-ingress-c34abdc2f064).

First, let's create a Kubernetes deployment and service which we will talk to via Ambassador.

```shell script
kubectl create deployment hello-minikube --image=k8s.gcr.io/echoserver:1.4
kubectl expose deployment hello-minikube --port=8080
```

This service `hello-minikube` is of type `ClusterIP` and is not accessible from outside the cluster.

Now, create an Ingress resource which exposes this service at the path `/hello/`

**Note:** The Ingress resource must have the annotation `kubernetes.io/ingress.class: ambassador` for Ambassador to
pick it up.

`hello-ingress.yaml`
```yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: ambassador
name: test-ingress
spec:
rules:
- http:
paths:
- path: /hello/
backend:
serviceName: hello-minikube
servicePort: 8080
```
Run the command: `kubectl apply -f hello-ingress.yaml`

That's it! You can now access your service via Ambassador:
```shell script
curl http://<Ambassdor's External IP'/hello/>
```

**Note:** For more advanced Ingress configurations with Ambassador, like TLS termination and name-based virtual hosting,
see Ambassador's [documentation](https://www.getambassador.io/docs/latest/topics/running/ingress-controller/).

### Configuring via Mapping resource

While Ambassador understands the Ingress spec, the Ingress spec does not leverage all of Ambassador's features. The
[Mapping](https://www.getambassador.io/docs/latest/topics/using/intro-mappings/) resource is Ambassador's core resource
that maps a target backend service to a given host or prefix.

Let's create another Kubernetes deployment and service that we will expose via Ambassador -
```shell script
kubectl create deployment mapping-minikube --image=k8s.gcr.io/echoserver:1.4
kubectl expose deployment mapping-minikube --port=8080
```

This service `mapping-minikube` is of type `ClusterIP` and is not accessible from outside the cluster.

Now, let's create a mapping that exposes this service via Ambassador at the path `/hello-mapping/`

`hello-mapping.yaml`
```yaml
apiVersion: getambassador.io/v2
kind: Mapping
metadata:
name: mapping-minikube
spec:
prefix: /hello-mapping/
service: mapping-minikube.default:8080
```
Run the command: `kubectl apply -f hello-mapping.yaml`

That's it! You can now access your service via Ambassador:
```shell script
curl http://<Ambassdor's External IP'/hello-mapping/>
```

**Note:** Read more about mappings in Ambassador's
[documentation](https://www.getambassador.io/docs/latest/topics/using/mappings/).

0 comments on commit 81dabc9

Please sign in to comment.