HTTPBin es una herramienta de código abierto para pruebas HTTP que facilita la depuración web. Después de desplegar HTTPBin en su service mesh, puede inspeccionar los métodos de solicitud, los encabezados y los detalles de autorización mediante endpoints HTTP sencillos.
Este tema describe cómo desplegar HTTPBin en un clúster ACK, enrutar el tráfico externo hacia esta aplicación a través de una puerta de enlace de entrada de ASM y comprobar la configuración.
Requisitos previos
Antes de empezar, asegúrese de contar con lo siguiente:
kubectl configurado para conectarse al clúster ACK del plano de datos
Paso 1: Desplegar HTTPBin en el clúster ACK
La aplicación HTTPBin se ejecuta en el clúster de Container Service for Kubernetes (ACK) del plano de datos.
-
Guarde el siguiente contenido YAML como
httpbin-application.yaml.Este manifiesto crea tres recursos: un ServiceAccount, un Service que expone el puerto 8000 y un Deployment de una sola réplica que ejecuta el contenedor HTTPBin.
-
Aplique el manifiesto:
kubectl apply -f httpbin-application.yaml -
Compruebe que el pod de HTTPBin se está ejecutando:
kubectl get pods -l app=httpbin
Paso 2: Configurar el enrutamiento de tráfico
Para enrutar el tráfico externo hacia HTTPBin, cree dos recursos de Istio: un Gateway que acepte conexiones entrantes en el borde de la malla y un VirtualService que reenvíe las solicitudes coincidentes al servicio HTTPBin.
Crear una puerta de enlace de Istio
Un recurso Gateway define los puertos, protocolos y hosts en los que escucha la puerta de enlace de entrada. El siguiente Gateway acepta tráfico HTTP en el puerto 80 para todos los hosts.
Para obtener más información, consulte Manage Istio gateways.
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: httpbin
namespace: default
spec:
selector:
istio: ingressgateway
servers:
- hosts:
- '*'
port:
name: test
number: 80
protocol: HTTP
Crear un servicio virtual
Un recurso VirtualService se vincula al Gateway y define las reglas de enrutamiento. El siguiente VirtualService enruta todas las solicitudes HTTP al servicio HTTPBin en httpbin.default.svc.cluster.local:8000.
Para obtener más información, consulte Manage virtual services.
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: httpbin-vs
namespace: default
spec:
gateways:
- httpbin
hosts:
- '*'
http:
- name: test
route:
- destination:
host: httpbin.default.svc.cluster.local
port:
number: 8000
Paso 3: Comprobar el despliegue
Envíe solicitudes a través de la puerta de enlace de entrada para confirmar que HTTPBin responde correctamente.
Sustituya ${GATEWAY_IP} en los siguientes comandos por la dirección IP real de la puerta de enlace de ASM. Para conocer cómo obtener la dirección IP de la puerta de enlace, consulte Obtain the IP address of the ingress gateway.
Probar códigos de estado HTTP
El endpoint /status/<code> devuelve el código de estado HTTP especificado. Úselo para validar que la puerta de enlace reenvía las solicitudes correctamente.
# Expect: 200 OK
curl http://${GATEWAY_IP}/status/200 -v
# Expect: 418 Unknown
curl http://${GATEWAY_IP}/status/418 -v
# Expect: 403 Forbidden
curl http://${GATEWAY_IP}/status/403 -v
Probar el reenvío de encabezados
El endpoint /headers devuelve todos los encabezados incluidos en la solicitud. Úselo para comprobar que los encabezados atraviesan intactos la puerta de enlace y los proxies sidecar.
curl http://${GATEWAY_IP}/headers -H "test-header: test-value" -v
El cuerpo de la respuesta contiene todos los encabezados de la solicitud, incluido test-header: test-value.
(Opcional) Comprobación con el servicio sleep
Como alternativa a curl desde su computadora local, despliegue un pod sleep dentro de la malla y envíe solicitudes desde el interior del clúster. Esto confirma la conectividad entre servicios a través de los sidecars de Envoy.
-
Guarde el siguiente contenido YAML como
sleep.yaml.################################################################################################## # Sample sleep service ################################################################################################## apiVersion: v1 kind: ServiceAccount metadata: name: sleep --- apiVersion: v1 kind: Service metadata: name: sleep labels: app: sleep service: sleep spec: ports: - port: 80 name: http selector: app: sleep --- apiVersion: apps/v1 kind: Deployment metadata: name: sleep spec: replicas: 1 selector: matchLabels: app: sleep template: metadata: labels: app: sleep spec: terminationGracePeriodSeconds: 0 serviceAccountName: sleep containers: - name: sleep image: registry.cn-hangzhou.aliyuncs.com/acs/curl:8.1.2 command: ["/bin/sleep", "infinity"] imagePullPolicy: IfNotPresent volumeMounts: - mountPath: /etc/sleep/tls name: secret-volume volumes: - name: secret-volume secret: secretName: sleep-secret optional: true -
Despliegue el servicio sleep:
kubectl apply -f sleep.yaml -n default -
Abra un shell en el pod sleep:
kubectl exec -it deploy/sleep -- sh -
Envíe una solicitud a HTTPBin desde el interior de la malla:
curl -I http://httpbin:8000/headersResultado esperado:
HTTP/1.1 200 OK server: envoy date: Tue, 26 Dec 2023 07:23:49 GMT content-type: application/json content-length: 353 access-control-allow-origin: * access-control-allow-credentials: true x-envoy-upstream-service-time: 1Una respuesta
200 OKconserver: envoyconfirma que el tráfico fluye a través del sidecar de Envoy y llega correctamente a HTTPBin.
Limpieza
Para eliminar todos los recursos creados en este tema:
kubectl delete -f httpbin-application.yaml
kubectl delete gateway httpbin -n default
kubectl delete virtualservice httpbin-vs -n default
# If you deployed the sleep service
kubectl delete -f sleep.yaml -n default