Using Ambassador Ingress Controller

Using Ambassador Ingress Controller with Minikube

Overview

Ambassador allows access to Kubernetes services running inside Minikube. Ambassador can be configured via both, Ingress resources and Mapping resources.

Prerequisites

  • Minikube version higher than v1.10.1
  • kubectl

Configuring Ambassador

Installing Ambassador

Ambassador is available as a Minikube addon Install it by running -

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 in a separate terminal.

minikube tunnel

You can now access Ambassador at the external IP allotted to the ambassador service. Get the external IP with the following command:

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.

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

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

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:

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.

Configuring via Mapping resource

While Ambassador understands the Ingress spec, the Ingress spec does not leverage all of Ambassador’s features. The Mapping 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 -

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

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:

curl http://<Ambassdor's External IP'/hello-mapping/>

Note: Read more about mappings in Ambassador’s documentation.

Last modified June 17, 2020: Able to run sucessfully (0a309f9c5)