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.
-
GatewayClass: Define una plantilla .
-
Gateway: Provisiona un data plane a partir de una plantilla y configura los entry points para aceptar trafico externo
-
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
- 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
- Verificar la instalacion con el comando
El output debe ser parecido al siguiente.
kubectl get pods -n nginx-gatewayCrear un nuevo nodeport con el siguiente contenido.NAME READY STATUS RESTARTS AGE nginx-gateway-5d4f4c7db7-xk2kq 2/2 Running 0 112s
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
- 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
- Obtener el wildcard del nodo con el siguiente comando dentro del nodo worker.
Adicional crear 2 nuevas variables en el nodo AIO
CLUSTER_WILDCARD=$(curl http://showip.net|tr '.' '-').nip.io echo $CLUSTER_WILDCARD
GW_IP=XXX.YYY.ZZZ.III //La ip del nodo worker
GW_PORT=30080
- 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
- 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
- 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
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