Proxy the httpbin service with Ingress
This document explains how apisix-ingress-controller guides Apache APISIX routes traffic to httpbin service correctly by the Kubernetes Ingress.
#
Prerequisites- Prepare an available Kubernetes cluster in your workstation, we recommend you to use Minikube.
- Install Apache APISIX in Kubernetes by Helm Chart.
- Install apisix-ingress-controller.
#
Deploy httpbin serviceWe use kennethreitz/httpbin as the service image, See its overview page for details.
Now, try to deploy it to your Kubernetes cluster:
kubectl run httpbin --image kennethreitz/httpbin --port 80kubectl expose pod httpbin --port 80
#
Resource DeliveryHere we create an Ingress resource.
# httpbin-ingress.yaml# Note use apiVersion is networking.k8s.io/v1, so please make sure your# Kubernetes cluster version is v1.19.0 or higher.apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: httpserver-ingressspec: # apisix-ingress-controller is only interested in Ingress # resources with the matched ingressClass name, in our case, # it's apisix. ingressClassName: apisix rules: - host: local.httpbin.org http: paths: - backend: service: name: httpbin port: number: 80 path: / pathType: Prefix
# Use ingress.networking.k8s.io/v1beta1 if your Kubernetes cluster# version is older than v1.19.0.apiVersion: networking.k8s.io/v1beta1kind: Ingressmetadata: name: httpserver-ingress # Note for ingress.networking.k8s.io/v1beta1, # you have to carry annotation kubernetes.io/ingress.class, # and its value must be matched with the one configured in # apisix-ingress-controller, in our case, it's apisix. annotations: kubernetes.io/ingress.class: apisixspec: rules: - host: local.httpbin.org http: paths: - backend: serviceName: httpbin servicePort: 80 path: / pathType: Prefix
The YAML snippet shows a simple Ingress configuration, which tells Apache APISIX to route all requests with Host local.httpbin.org
to the httpbin
service.
Now try to create it.
kubectl apply -f httpbin-ingress.yaml
#
TestRun curl call in one of Apache APISIX Pods to check whether the resource was delivered to it. Note you should replace the value of --apisix-admin-key
to the real admin_key
value in your Apache APISIX cluster.
kubectl exec -it -n ${namespace of Apache APISIX} ${Pod name of Apache APISIX} -- curl http://127.0.0.1:9180/apisix/admin/routes -H 'X-API-Key: edd1c9f034335f136f87ad84b625c8f1'
And request to Apache APISIX to verify the route.
kubectl exec -it -n ${namespace of Apache APISIX} ${Pod name of Apache APISIX} -- curl http://127.0.0.1:9080/headers -H 'Host: local.httpbin.org'
In case of success, you'll see a JSON string which contains all requests headers carried by curl
like:
{ "headers": { "Accept": "*/*", "Host": "httpbin.org", "User-Agent": "curl/7.64.1", "X-Amzn-Trace-Id": "Root=1-5ffc3273-2928e0844e19c9810d1bbd8a" }}