O HTTPBin é uma ferramenta de teste HTTP de código aberto para depuração web. Após implantar o HTTPBin em sua service mesh, inspecione métodos de requisição, cabeçalhos e detalhes de autorização por meio de endpoints HTTP simples.
Este tópico descreve como implantar o HTTPBin em um cluster ACK, rotear tráfego externo para ele por um gateway de entrada ASM e verificar a configuração.
Pré-requisitos
Antes de começar, certifique-se de que:
O kubectl está configurado para se conectar ao cluster ACK no plano de dados.
Etapa 1: Implantar o HTTPBin no cluster ACK
O aplicativo HTTPBin executa no cluster Container Service for Kubernetes (ACK) no plano de dados.
-
Salve o seguinte YAML como
httpbin-application.yaml.Este manifesto cria três recursos: uma ServiceAccount, um Service que expõe a porta 8000 e um Deployment de réplica única com o contêiner HTTPBin.
-
Aplique o manifesto:
kubectl apply -f httpbin-application.yaml -
Verifique se o pod do HTTPBin está em execução:
kubectl get pods -l app=httpbin
Etapa 2: Configure o roteamento de tráfego
Para rotear tráfego externo para o HTTPBin, crie dois recursos Istio: um Gateway que aceita conexões de entrada na borda da malha e um VirtualService que encaminha requisições correspondentes ao serviço HTTPBin.
Crie um gateway Istio
Um Gateway define as portas, os protocolos e os hosts nos quais o gateway de entrada escuta. O exemplo a seguir aceita tráfego HTTP na porta 80 para todos os hosts.
Para mais informações, consulte Gerencie gateways Istio.
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
Crie um serviço virtual
Um VirtualService vincula-se ao Gateway e define regras de roteamento. O exemplo a seguir roteia todas as requisições HTTP para o serviço HTTPBin em httpbin.default.svc.cluster.local:8000.
Para mais informações, consulte Gerencie serviços virtuais.
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
Etapa 3: Verifique a implantação
Envie requisições pelo gateway de entrada para confirme se o HTTPBin responde corretamente.
Substitua ${GATEWAY_IP} nos comandos a seguir pelo endereço IP real do gateway ASM. Para obter mais informações sobre como recuperar o endereço IP do gateway, consulte Obter o endereço IP do gateway de entrada.
Testar códigos de status HTTP
O endpoint /status/<code> retorna o código de status HTTP especificado. Use-o para validar se o gateway encaminha requisições corretamente.
# 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
Testar o encaminhamento de cabeçalhos
O endpoint /headers retorna todos os cabeçalhos incluídos na requisição. Use-o para verifique se os cabeçalhos passam intactos pelo gateway e pelos proxies sidecar.
curl http://${GATEWAY_IP}/headers -H "test-header: test-value" -v
O corpo da resposta contém todos os cabeçalhos da requisição, incluindo test-header: test-value.
(Opcional) Verifique com o serviço sleep
Como alternativa ao uso de curl na máquina local, implante um pod sleep dentro da malha e envie requisições de dentro do cluster. Essa ação confirma a conectividade serviço a serviço pelos sidecars Envoy.
-
Salve o seguinte 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 -
Implante o serviço sleep:
kubectl apply -f sleep.yaml -n default -
Abra um shell no pod sleep:
kubectl exec -it deploy/sleep -- sh -
Envie uma requisição para o HTTPBin de dentro da malha:
curl -I http://httpbin:8000/headersSaída esperada:
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: 1Uma resposta
200 OKcomserver: envoyconfirma que o tráfego flui pelo sidecar Envoy e chega ao HTTPBin com sucesso.
Limpeza
Para remover todos os recursos criados neste tópico:
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