Por padrão, o proxy sidecar redireciona todo o tráfego de saída dos pods em uma instância do Service Mesh (ASM). Para permitir que os pods acessem serviços fora do mesh — como APIs de terceiros, bancos de dados ou endpoints SaaS —, configure o tratamento de requisições para destinos não registrados.
O ASM oferece três abordagens com diferentes compensações entre esforço de configuração, visibilidade e controle de tráfego:
|
Abordagem |
Visibilidade do tráfego |
Controle do tráfego |
Esforço de configuração |
Mais indicado para |
|
Política de tráfego de saída ( |
Nenhuma |
Nenhum |
Baixo |
Testes iniciais e avaliação |
|
ServiceEntry (recomendado) |
Completa |
Completo (roteamento, novas tentativas, timeouts, injeção de falhas) |
Médio |
Cargas de trabalho em produção |
|
Interceptação baseada em CIDR |
Nenhuma para o tráfego ignorado |
Nenhum para o tráfego ignorado |
Baixo |
Cargas de trabalho sensíveis a desempenho que não toleram sobrecarga do proxy |
Pré-requisitos
Antes de começar, verifique se você tem:
Uma instância do ASM com injeção de proxy sidecar ativada
Um pod com proxy sidecar injetado disponível para testar o acesso externo
Permissões para modificar configurações da instância do ASM no console do ASM
Para configurar um pod de teste, implante uma carga de trabalho de exemplo e exporte o nome do pod:
export SOURCE_POD=$(kubectl get pod -l <app-label> -o jsonpath='{.items..metadata.name}')
Substitua <app-label> pelo seletor de rótulo da sua carga de trabalho de teste. Execute todos os comandos curl subsequentes dentro deste pod:
kubectl exec "$SOURCE_POD" -c <container-name> -- curl -I http://www.aliyun.com/
Defina a política de tráfego de saída
A configuração Outbound Traffic Policy determina como o proxy sidecar lida com o tráfego destinado a locais não registrados no mesh.
ALLOW_ANY: O proxy encaminha todo o tráfego de saída. Os pods conseguem alcançar qualquer serviço externo, mas o Istio não monitora nem controla esse tráfego.
REGISTRY_ONLY: O proxy bloqueia o tráfego para qualquer destino não registrado no registro de serviços do mesh.
Quando a política de tráfego de saída está definida como ALLOW_ANY e nenhum ServiceEntry está configurado, o proxy sidecar permite tráfego TCP para qualquer endereço IP e porta. Essa configuração não possui controle de fluxo explícito e pode causar comportamentos inesperados quando vários serviços escutam na mesma porta. Não utilize este modo para serviços externos como bancos de dados. Em vez disso, defina recursos ServiceEntry para controlar explicitamente os destinos do tráfego.
Defina a política como ALLOW_ANY
Faça login no console do ASM.
No painel de navegação à esquerda, escolha Service Mesh > Mesh Management.
Na página Mesh Management, localize a instância do ASM desejada. Clique em no nome da instância ou em Manage na coluna Actions.
No painel de navegação à esquerda, escolha Dataplane Component Management > Sidecar Proxy Setting.
Na aba global, clique em Outbound Traffic Policy, defina o valor como ALLOW_ANY e clique em Update Settings.
Verifique o acesso externo
Em um pod com proxy sidecar injetado, teste o acesso HTTP e HTTPS:
Requisição HTTP:
curl -I http://www.aliyun.com/
Saída esperada:
HTTP/1.1 301 Moved Permanently
server: envoy
date: Mon, 07 Sep 2020 09:28:54 GMT
content-type: text/html
content-length: 239
location: https://www.aliyun.com/
x-envoy-upstream-service-time: 67
Requisição HTTPS:
curl -I https://www.aliyun.com/
Saída esperada:
HTTP/2 200
server: Tengine
content-type: text/html; charset=utf-8
strict-transport-security: max-age=31536000
O cabeçalho server: envoy na resposta HTTP confirma que o tráfego passou pelo proxy sidecar.
Crie um ServiceEntry
Se a política de tráfego de saída estiver configurada como REGISTRY_ONLY, o proxy sidecar bloqueia requisições para serviços externos não registrados no mesh. Por exemplo:
Requisição HTTP bloqueada (retorna 502):
curl -I http://www.aliyun.com/
HTTP/1.1 502 Bad Gateway
server: envoy
Requisição HTTPS bloqueada (conexão recusada):
curl -I https://www.aliyun.com/
curl: (35) LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to www.aliyun.com:443
Para permitir o acesso a um serviço externo específico mantendo o modo REGISTRY_ONLY, crie um ServiceEntry para registrar esse serviço no mesh. Um ServiceEntry registrado habilita o gerenciamento completo de tráfego do Istio — regras de roteamento, timeouts, novas tentativas e injeção de falhas — para o tráfego externo.
Etapa 1: Crie o ServiceEntry
Faça login no console do ASM.
No painel de navegação à esquerda, escolha Service Mesh > Mesh Management.
Na página Mesh Management, localize a instância do ASM desejada. Clique em no nome da instância ou em Manage na coluna Actions.
No painel de navegação à esquerda, escolha Cluster & Workload Management > External Service(ServiceEntry).
Clique em Create from YAML.
Selecione um namespace, cole o YAML a seguir e clique em Create.
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: aliyun-com-ext
spec:
hosts:
- 'www.aliyun.com'
ports:
- number: 80
name: http
protocol: HTTP
- number: 443
name: https
protocol: HTTPS
resolution: DNS
location: MESH_EXTERNAL
Defina o campo hosts com o hostname do serviço externo alvo. Este exemplo registra www.aliyun.com nas portas 80 (HTTP) e 443 (HTTPS).
Etapa 2: Verifique o acesso externo
Teste o acesso novamente em um pod com proxy sidecar injetado:
Requisição HTTP:
curl -I http://www.aliyun.com/
Saída esperada:
HTTP/1.1 301 Moved Permanently
server: envoy
date: Mon, 07 Sep 2020 09:49:17 GMT
content-type: text/html
content-length: 239
location: https://www.aliyun.com/
x-envoy-upstream-service-time: 66
Requisição HTTPS:
curl -I https://www.aliyun.com/
Saída esperada:
HTTP/2 200
server: Tengine
content-type: text/html; charset=utf-8
strict-transport-security: max-age=31536000
Uma resposta bem-sucedida confirma o funcionamento do ServiceEntry.
Etapa 3: Aplique regras de gerenciamento de tráfego (opcional)
Após registrar um serviço externo com um ServiceEntry, aplique regras de gerenciamento de tráfego do Istio. O exemplo a seguir cria um VirtualService que adiciona um atraso de 5 segundos a cada requisição para www.aliyun.com. Isso é útil para testar a resiliência da sua carga de trabalho contra dependências externas lentas.
No painel de navegação à esquerda, escolha Traffic Management Center > VirtualService.
Clique em Create from YAML.
Selecione um namespace, cole o YAML a seguir e clique em Create.
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: aliyun-com-ext
spec:
hosts:
- 'www.aliyun.com'
http:
- fault:
delay:
percent: 100
fixedDelay: 5s
route:
- destination:
host: www.aliyun.com
weight: 100
Etapa 4: Verifique a regra de tráfego
Confirme a aplicação do atraso de 5 segundos:
time curl -o /dev/null -s -w "%{http_code}\n" http://www.aliyun.com/
Saída esperada:
301
real 0m 5.07s
user 0m 0.00s
sys 0m 0.00s
O tempo real de aproximadamente 5 segundos confirma que a regra de injeção de falhas do VirtualService está em vigor.
Configure a interceptação baseada em CIDR
Por padrão, o proxy sidecar intercepta o tráfego para todos os endereços IP. Restrinja o escopo de interceptação a blocos CIDR específicos para que o tráfego destinado a outros locais ignore completamente o proxy sidecar.
Um padrão comum é definir o escopo de interceptação como o bloco CIDR de serviço dos clusters Kubernetes no plano de dados. O tráfego para serviços internos do cluster passa pelo proxy sidecar para garantir observabilidade e controle, enquanto o tráfego para serviços externos o ignora para reduzir a latência.
Diferentemente das outras duas abordagens, o bypass baseado em CIDR desativa completamente os recursos do Istio (observabilidade, gerenciamento de tráfego, políticas de segurança) para o tráfego ignorado. Utilize esta abordagem apenas quando a sobrecarga do proxy for inaceitável para destinos externos específicos.
Procedimento
Faça login no console do ASM.
No painel de navegação à esquerda, escolha Service Mesh > Mesh Management.
Na página Mesh Management, localize a instância do ASM desejada. Clique em no nome da instância ou em Manage na coluna Actions.
No painel de navegação à esquerda, escolha Dataplane Component Management > Sidecar Proxy Setting.
Na aba global, clique em Enable/Disable Sidecar Proxy by Ports or IP Addresses.
No campo Addresses to Which External Access Is Redirected to Sidecar Proxy, insira o bloco CIDR a ser interceptado e clique em Update Settings.
O valor padrão é *, que intercepta todo o tráfego. Insira um bloco CIDR conforme suas necessidades de negócio. Geralmente, insira o bloco CIDR de serviço dos clusters Kubernetes no plano de dados da instância do ASM.
Alternativamente, use o campo Addresses to Which External Access Is Not Redirected to Sidecar Proxy para especificar blocos CIDR que ignoram o proxy sidecar. Todo o restante do tráfego será interceptado.
Considerações de segurança
Ao configurar o acesso externo, observe os seguintes pontos:
**Prefira
REGISTRY_ONLYcom recursos ServiceEntry em produção.** Essa abordagem garante que apenas serviços externos explicitamente registrados sejam acessíveis, reduzindo o risco de exfiltração não intencional de dados.**Evite
ALLOW_ANYpara acesso a bancos de dados.** Sem definições explícitas de ServiceEntry, o tráfego para bancos de dados carece de controle de fluxo e pode causar comportamentos inesperados quando múltiplos serviços escutam na mesma porta.
Próximos passos
Para visualizar os serviços registrados no mesh, acesse ASM Instance > Instances Status no console do ASM.
Para saber mais sobre a configuração do ServiceEntry do Istio, consulte a referência do ServiceEntry do Istio.