Configure um recurso Sidecar para que outros pods no cluster possam usar um service e acessar uma aplicação que escuta em localhost.
Por que outros pods não conseguem acessar uma aplicação localhost
localhost é um endereço de loopback acessível apenas dentro do mesmo pod. Quando uma aplicação implantada em um cluster escuta em localhost, os demais pods do cluster não conseguem acessá-la, mesmo que você exponha a porta de service da aplicação por meio de um Service.
Os exemplos a seguir mostram como aplicações escritas em diferentes linguagens escutam em localhost:
Golang:
net.Listen("tcp", "localhost:8080")Node.js:
http.createServer().listen(8080, "localhost")Python:
socket.socket().bind(("localhost", 8083))
Escolha uma opção
Há duas opções para expor sua aplicação. Escolha uma com base na possibilidade de modifique o código da aplicação:
Opção 1 — Altere o endereço de rede no qual a aplicação escuta. Escolha esta opção se puder modifique o código da aplicação.
Opção 2 — Use o Service Mesh (ASM) para expor uma aplicação que escuta em localhost. Escolha esta opção se não desejar modifique o código da aplicação.
Opção 1: Alterar o endereço de rede no qual a aplicação escuta
Para expor sua aplicação, modifique o código da aplicação para escutar em 0.0.0.0 em vez de localhost.
Opção 2: Usar o ASM para expor uma aplicação que escuta em localhost
Crie um recurso Sidecar no console do ASM. O recurso Sidecar intercepta as requisições de entrada nos pods selecionados e as encaminha para sua aplicação em localhost.
Siga estas etapas:
Faça login no console do ASM. No painel de navegação à esquerda, escolha .
Na página Mesh Management, clique em no nome da instância do ASM. No painel de navegação à esquerda, escolha . Na página exibida, clique em Create from YAML.
-
Na página Create, selecione um Namespaces e um Scenario Template, configure o YAML a seguir e clique em Create.
apiVersion: networking.istio.io/v1beta1 kind: Sidecar metadata: name: localhost-access namespace: {namespace} spec: ingress: - defaultEndpoint: '127.0.0.1:{container_port}' port: name: tcp number: {port} protocol: TCP workloadSelector: labels: {key}: {value}Substitua os parâmetros a seguir pelos valores reais:
Parâmetro
Descrição
{namespace}Namespace onde a aplicação está implantada.
{container_port}Porta do container na qual a aplicação escuta em localhost.
{port}Porta do service da aplicação.
{key}: {value}Rótulo usado para selecione os pods da aplicação.
A configuração anterior aplica-se apenas aos pods com o rótulo definido em workloadSelector e expõe somente a porta TCP definida em ingress.