Skip to content

Kubernetes Api Gateway

Gateway Api es un projecto oficial de kubernetes que esta enfocado en enrutamiento l4 y l7 en kubernetes. Representa la siguiente generacion de kubernetes ingress, load balancing y apis service mesh.

Gateway api posee los siguientes principios en su diseño y arquitectura.

Orientada a roles: Quiere decir que sus componentes esta modelados en base a roles de una organizacion.

Portable: Las especificaciones estan definidas como recursos personalizados.

Expresivo: Soporta una gran cantidad de funcionalidad para enrutamiento que solo era posible con anotaciones personalizadas en recursos como ingress.

Extensivo: Permite que los recursos sean unidos en varios niveles del api.

Tenemos 3 componentes.

  1. GatewayClass: Define una plantilla .

  2. Gateway: Provisiona un data plane a partir de una plantilla y configura los entry points para aceptar trafico externo

  3. HttpRoute: Configurar las reglas para el trafico externo hacia los servicios en el cluster.

Laboratorio: Kubernetes Api Gateway

Descripción

Instalar un controlador de gateway api y probar su funcionamiento.

Objetivos

  • Instalar nginx gateway fabric
  • Crear recursos de gateway api y comprobar su funcionamiento.

Antes de comenzar

  • Contar con el acceso al ambiente del laboratorio
  • Haber realizado la guía de Instalación Rancher Kubernetes Engine (RKE)
  • Haber realizado la guía de Acceso a rancher y kubernetes cluster

Inicio de laboratorio

  1. Ingrese al CLI del sistema operativo del servidor usado como Bastion con el usuario y la contraseña proporcionados.

Aplicar los siguientes manifiestos para instalar el api gateway.

kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.0.0/standard-install.yaml
kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.0.0/webhook-install.yaml
kubectl apply -f https://github.com/nginxinc/nginx-gateway-fabric/releases/download/v1.1.0/crds.yaml
kubectl apply -f https://github.com/nginxinc/nginx-gateway-fabric/releases/download/v1.1.0/nginx-gateway.yaml

  1. Verificar la instalacion con el comando
    kubectl get pods -n nginx-gateway
    
    El output debe ser parecido al siguiente.
    NAME                             READY   STATUS    RESTARTS   AGE
    nginx-gateway-5d4f4c7db7-xk2kq   2/2     Running   0          112s
    
    Crear un nuevo nodeport con el siguiente contenido.
apiVersion: v1
kind: Service
metadata:
  name: nginx-gateway
  namespace: nginx-gateway
spec:
  ports:
    - name: http
      nodePort: 30080
      port: 30080
      protocol: TCP
      targetPort: 80
  selector:
    app.kubernetes.io/instance: nginx-gateway
    app.kubernetes.io/name: nginx-gateway
  sessionAffinity: None
  type: NodePort
  1. Crear un nuevo namespace llamado example-gateway
    kubectl create ns example-gateway
    

Establcer el nuevo namespace por defecto en el contexto actual:

kubectl config set-context --current --namespace=example-gateway

  1. Obtener el wildcard del nodo con el siguiente comando dentro del nodo worker.
    CLUSTER_WILDCARD=$(curl http://showip.net|tr '.' '-').nip.io
    echo $CLUSTER_WILDCARD
    
    Adicional crear 2 nuevas variables en el nodo AIO
GW_IP=XXX.YYY.ZZZ.III //La ip del nodo worker
GW_PORT=30080
  1. Crear un nuevo archivo llamada cafe.yaml con el siguiente contenido.
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: coffee
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: coffee
      template:
        metadata:
          labels:
            app: coffee
        spec:
          containers:
          - name: coffee
            image: nginxdemos/nginx-hello:plain-text
            ports:
            - containerPort: 8080
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: coffee
    spec:
      ports:
      - port: 80
        targetPort: 8080
        protocol: TCP
        name: http
      selector:
        app: coffee
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: tea
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: tea
      template:
        metadata:
          labels:
            app: tea
        spec:
          containers:
          - name: tea
            image: nginxdemos/nginx-hello:plain-text
            ports:
            - containerPort: 8080
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: tea
    spec:
      ports:
      - port: 80
        targetPort: 8080
        protocol: TCP
        name: http
      selector:
        app: tea
    

Aplicar este archivo.

kubectl apply -f cafe.yaml
  1. Crear un archivo llamado gateway.yaml con el siguiente contenido.
    apiVersion: gateway.networking.k8s.io/v1
    kind: Gateway
    metadata:
      name: gateway
    spec:
      gatewayClassName: nginx
      listeners:
      - name: http
        port: 80
        protocol: HTTP
        hostname: "*.104-196-105-144.nip.io"
    

Cambiar el hostname por su propio wildcard. Aplicar el archivo.

kubectl apply -f gateway.yaml

  1. Crear un archivo llamado routes.yaml con el siguiente contenido
    apiVersion: gateway.networking.k8s.io/v1
    kind: HTTPRoute
    metadata:
      name: coffee
    spec:
      parentRefs:
      - name: gateway
        sectionName: http
      hostnames:
      - "cafe.example.com"
      rules:
      - matches:
        - path:
            type: PathPrefix
            value: /coffee
        backendRefs:
        - name: coffee
          port: 80
    ---
    apiVersion: gateway.networking.k8s.io/v1
    kind: HTTPRoute
    metadata:
      name: tea
    spec:
      parentRefs:
      - name: gateway
        sectionName: http
      hostnames:
      - "cafe.example.com"
      rules:
      - matches:
        - path:
            type: Exact
            value: /tea
        backendRefs:
        - name: tea
          port: 80
    

Aplicarlo con el comando.

kubectl apply -f routes.yaml
8. Probar el aplicativo con el comando.
curl --resolve cafe.wildcard:$GW_PORT:$GW_IP http://cafe.wildcard.com:$GW_PORT/coffee
curl --resolve cafe.wildcard:$GW_PORT:$GW_IP http://cafe.wildcard.com:$GW_PORT/tea