Conectar serviços públicos e acessar bancos privados pelo cluster
Quase todo erro de conexão com RabbitMQ, Service Bus, MongoDB ou Redis tem uma de duas causas: o firewall do serviço não conhece os IPs do Kubepier, ou o serviço é um banco privado (private endpoint, IP privado) que a internet não alcança e que você acessa pelo cluster. Esta página mostra de onde cada conexão parte e o que fazer em cada caso.
IPs de saída do Kubepier Web
A lista de IPs aparece aqui e no app, no menu Rede e segurança.
Os mesmos IPs valem para todos os clientes do Kubepier Web. Libere todos os da lista.
Um caso real
- Redis no Azure Cache: o firewall do cache tinha IPs antigos, e a conexão dava tempo esgotado. A correção foi liberar os IPs de saída atuais do Kubepier na regra de firewall do cache e conectar na porta 6380 com TLS (a porta 6379, sem TLS, vem desligada no Azure Cache).
- MongoDB numa VM: o nome do servidor resolvia para um IP privado (172.16.x.x) e a VM não tinha IP público. Pela rota Direta não há como chegar lá; o caminho é a rota Pelo cluster, de dentro da rede do cliente (ou o desktop pela VPN).
- Redis no Azure Cache Premium: conexao_encerrada pela rota Direta e pela rota Pelo cluster, com firewall, porta e TLS certos. A causa era a senha salva no cadastro, de outro cache. Desde 05/10/2026 esse caso aparece como erro de autenticação (WRONGPASS), não mais como conexão encerrada. Detalhes em Problemas comuns.
De onde o Kubepier conecta
| Caminho | De onde a conexão parte | Alcança | O que você precisa fazer |
|---|---|---|---|
| Kubepier Web, rota Direta (menus de serviços, clusters) | Dos IPs de saída fixos do Kubepier, direto para o serviço | Serviços com endpoint público | Liberar os IPs de saída no firewall do serviço |
| Kubepier Web, rota Pelo cluster (menus de serviços) | De um relay restrito num cluster e namespace do cliente, pela API do Kubernetes | O que a rede do cluster alcança: private endpoints, IPs privados, VPN | Escolher a rota no cadastro do serviço e dar o Role no namespace |
| Kubepier Desktop (menus de serviços, clusters) | Da sua máquina | O que a sua máquina alcança, inclusive pela VPN e pela rede do escritório | Estar na rede ou na VPN certa |
| Bastion (web) e Túnel seguro (desktop) | De dentro do cluster do cliente | O que a rede do cluster alcança, em geral a rede privada do cliente | Dar ao Kubepier as permissões no namespace; o cluster precisa ter rota até o serviço |
Seu serviço é público ou privado (private endpoint, IP privado)?
- Público (tem endpoint na internet): use a rota Direta. Libere os IPs de saída do Kubepier no firewall do serviço. Prefira liberar só a faixa do Kubepier em vez de abrir para todos.
- Privado (private endpoint, IP privado, só pela VPN ou on-premises): use a rota Pelo cluster, se algum cluster do cliente alcança o serviço. Nada precisa ser aberto para a internet.
- Se nenhum cluster do cliente alcança o serviço: use o Kubepier Desktop pela sua VPN.
- Para testar a rede antes, de dentro do cluster: Bastion da web (nc, curl, dig) ou Túnel seguro do desktop.
Rota de conexão: Direta ou Pelo cluster
No formulário de cada serviço do cliente (RabbitMQ, Service Bus, MongoDB e Redis), Rota de conexão tem duas opções. O serviço mostra a rota em uso: "direta" ou "via cluster <nome>".
| Rota | Como conecta | Quando usar |
|---|---|---|
| Direta (IPs de saída) | A API do Kubepier Web conecta direto no serviço, a partir dos IPs de saída fixos. | Serviço com endpoint público e os IPs liberados no firewall. |
| Pelo cluster | A API cria um pod temporário e sem privilégio (relay) no cluster e no namespace escolhidos e chega no serviço por ele, pela API do Kubernetes. O TLS continua de ponta a ponta com o serviço, validando o nome real do servidor. | Serviço em rede privada que algum cluster do cliente alcança. |
Rota pelo cluster: como acessar o banco privado
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: kubepier-relay
namespace: <namespace>
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["create", "get", "list", "delete"]
- apiGroups: [""]
resources: ["pods/exec", "pods/portforward"]
verbs: ["create", "get"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: kubepier-relay
namespace: <namespace>
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: kubepier-relay
subjects:
- kind: User
name: <usuario-ou-objectId-da-credencial>
apiGroup: rbac.authorization.k8s.io - No cadastro do serviço, em Rota de conexão, escolha Pelo cluster, escolha um cluster do cliente e o namespace, e clique em Salvar rota. Só o admin muda a rota; o membro vê a dica para pedir a um admin.
- Aplique no namespace o Role abaixo (o mesmo que o app mostra em Rede e segurança, no item da rota pelo cluster), ligado à identidade da credencial do cluster.
- No primeiro uso, a tela mostra "Preparando conexão pelo cluster…" enquanto o relay sobe (até 120 segundos).
- Quando a conexão direta falha com IP privado ou tempo esgotado, a tela sugere "Conectar pelo cluster".
Rota pelo cluster: como funciona e limites
| Regra | Valor |
|---|---|
| Relays | 1 por organização, cluster e namespace, compartilhado pelos serviços que usam essa rota |
| Destinos por relay | até 10 |
| Primeiro uso | até 120 segundos para o relay ficar Running |
| Conexão do relay até o serviço | tempo esgotado em 10 segundos |
| Ouvintes locais da API | fecham depois de 5 minutos sem uso |
| Relay | apagado depois de 10 minutos sem uso, ou em 2 horas; o próximo pedido cria outro |
| Relay que falhou | nova tentativa depois de 30 segundos |
| Imagem e segurança do relay | a mesma do Bastion: netshoot fixada por digest, perfil restricted, 50m/64 Mi pedidos e 500m/256 Mi de limite |
MongoDB: replica sets e mongodb+srv:// funcionam; os registros SRV e TXT são resolvidos dentro do cluster. Service Bus: pela rota, usa AMQP sobre WebSocket na porta 443. A rota também vale no plano Free, para as telas de leitura.
Rota pelo cluster: auditoria
- Criação e remoção do relay (relay_criar, relay_remover) e cada mudança de rota (rota_alterada) vão para a auditoria da organização.
- Nunca o tráfego nem as credenciais.
Como saber se o endereço é privado
Resolva o nome do serviço. Se o IP estiver em 10.0.0.0/8, 172.16.0.0/12 ou 192.168.0.0/16, ele é privado e a web não chega lá.
# O nome resolve para IP público ou privado?
dig +short mongo.cliente.com.br
nslookup mongo.cliente.com.br
# A porta responde? (do Bastion, de dentro do cluster)
nc -vz mongo.cliente.com.br 27017
# TLS: qual certificado o servidor apresenta?
openssl s_client -connect meu-cache.redis.cache.windows.net:6380 -servername meu-cache.redis.cache.windows.net </dev/null Azure Cache for Redis
az redis firewall-rules create --resource-group <resource-group> --name <cache> \
--rule-name kubepier --start-ip 20.206.66.128 --end-ip 20.206.66.129 - Libere os IPs de saída em Firewall do cache (no portal) ou pelo comando abaixo. Remova regras antigas que não servem mais.
- Conecte na porta 6380 com TLS: use rediss://, ou marque TLS no cadastro. A porta 6379 sem TLS vem desligada.
- A senha é uma das chaves de acesso do cache.
- Cache só com private endpoint (acesso público desligado): a web não alcança. Use a rota Pelo cluster, ou o desktop pela VPN.
Azure Cosmos DB for MongoDB (RU e vCore)
- No portal, em Networking: deixe o acesso público em redes selecionadas e acrescente os IPs de saída do Kubepier (no vCore, em regras de firewall).
- Com acesso público desligado e só private endpoint, use a rota Pelo cluster, ou o desktop pela VPN.
MongoDB Atlas
atlas accessLists create 20.206.66.128/31 --type cidrBlock --comment "Kubepier" - Em Network Access → IP Access List, acrescente a faixa do Kubepier, ou pelo Atlas CLI:
Cluster com private endpoint ou peering, sem acesso público: use a rota Pelo cluster, ou o desktop pela VPN.
Azure Service Bus
- No portal: o namespace → Networking → Selected networks, e acrescente os IPs de saída no firewall.
- Nem todo tier aceita regras de IP: confira na documentação da Azure o do seu namespace.
- Namespace só com private endpoint: use a rota Pelo cluster, ou o desktop pela VPN.
RabbitMQ
- CloudAMQP e outros gerenciados: acrescente os IPs na lista de IPs permitidos do provedor, no painel.
- Numa VM: libere no NSG (Azure) ou no security group (AWS) a porta da API de gerenciamento (15672, ou a que você publica) para a faixa do Kubepier.
AWS
aws ec2 authorize-security-group-ingress --group-id <sg-id> \
--protocol tcp --port 5432 --cidr 20.206.66.128/31 - ElastiCache: não tem endpoint público; a web não alcança. Use a rota Pelo cluster com um cluster na mesma VPC, ou o desktop pela VPN.
- RDS: só com Publicly accessible ligado e o security group liberando a porta para a faixa do Kubepier:
MSK: hoje a web não conecta no Kafka; o painel Dependências do desktop só lê as variáveis do pod e os ConfigMaps que elas referenciam.
Google Cloud
# Substitui a lista inteira: inclua as redes que já estão lá
gcloud sql instances patch <instancia> --authorized-networks=20.206.66.128/31,<redes-ja-liberadas> - Memorystore (Redis): só IP privado; use a rota Pelo cluster com um cluster na mesma VPC, ou o desktop pela VPN.
- Cloud SQL: em Authorized networks, acrescente a faixa do Kubepier:
Serviços próprios em VMs
Libere a porta do serviço só para a faixa do Kubepier no NSG ou no security group. Exemplo no Azure, para um MongoDB na 27017:
az network nsg rule create --resource-group <resource-group> --nsg-name <nsg> \
--name kubepier --priority 300 --direction Inbound --access Allow --protocol Tcp \
--source-address-prefixes 20.206.66.128/31 --destination-port-ranges 27017 On-premises
- Com IP público e NAT: libere a faixa do Kubepier no firewall de borda para a porta do serviço, com TLS.
- Sem exposição para a internet: use a rota Pelo cluster com um cluster que tenha rota até lá, ou o desktop pela VPN.
Mensagem de erro → o que fazer
| O que aparece | Causa provável | Como conferir | Como resolver |
|---|---|---|---|
| Tempo esgotado (timeout, ETIMEDOUT) | O firewall descarta a conexão: os IPs do Kubepier não estão liberados, ou o IP é privado | dig no nome; nc -vz host porta pelo Bastion | Liberar os IPs de saída; se o IP for privado, usar a rota Pelo cluster |
| Conexão encerrada pelo servidor (conexao_encerrada: ECONNRESET, EPIPE, socket hang up, TLS fechado antes do handshake) | Em geral, firewall ou lista de IPs que não inclui os IPs de saída do Kubepier (por exemplo, o firewall do Azure Cache); ou TLS e porta errados; ou limite de conexões do servidor | Conferir a lista de IPs do serviço; openssl s_client -connect host:porta | Liberar os IPs de saída ou trocar para Pelo cluster (a tela sugere "Conectar pelo cluster"), e conferir TLS e porta. Se a falha é igual nas duas rotas, confira a senha: até 05/10/2026 (web) e até a 2.2.0 (desktop), senha errada no Redis também aparecia assim |
| Conexão recusada (ECONNREFUSED) | Nada escutando nessa porta, ou porta errada (6379 em vez de 6380 no Azure Cache) | nc -vz host porta | Corrigir a porta; ligar o serviço |
| Nome não encontrado (ENOTFOUND) | O nome não existe no DNS público (é um nome interno ou está escrito errado) | dig +short nome | Corrigir o nome; nomes internos só resolvem de dentro da rede |
| Erro de TLS ou handshake | TLS desligado de um lado, porta sem TLS, ou certificado com outro nome | openssl s_client -connect host:porta -servername host | Usar rediss:// ou marcar TLS; conectar pelo nome que está no certificado |
| Erro de autenticação ou sem permissão no serviço (WRONGPASS, NOAUTH, NOPERM, 401, 403) | Senha errada (WRONGPASS), senha que falta (NOAUTH), usuário sem permissão ou ACL sem os comandos (NOPERM). No Redis, a senha errada aparece assim na web desde 05/10/2026 e no desktop a partir da 2.3.0 | Testar a mesma credencial com o cliente oficial (redis-cli, mongosh, a API do RabbitMQ) | Corrigir a credencial no cadastro do cliente ou o papel (veja a página de cada serviço). No Azure Cache, cole a connection string inteira do portal |
| host_privado (RabbitMQ, Service Bus, MongoDB e Redis) | O nome resolve só para IPs privados (10/8, 172.16/12, 192.168/16, 100.64/10, fc00::/7): a rota Direta não tem como chegar. O Kubepier confere isso antes de tentar conectar (resultado guardado por 60 s), então o erro aparece na hora, sem esperar o tempo esgotar | dig +short nome | Trocar a rota para Pelo cluster, ou usar o desktop pela VPN |
| Precisa do papel clusterMonitor (MongoDB) | O usuário do Mongo não tem clusterMonitor | O painel diz qual papel falta | Dar clusterMonitor no admin e read no banco |
| 403 do Kubernetes (Bastion, Túnel seguro) | A credencial não tem os verbos no namespace | A mensagem diz o verbo que falta | Aplicar o Role da página do Bastion ou do Túnel seguro |
Na rota Direta, a web mostra a mensagem do próprio serviço (por exemplo, connect ETIMEDOUT ou getaddrinfo ENOTFOUND) dentro de "erro no serviço", e as falhas de credencial como "sem permissão no serviço". No cartão de status do Redis aparece a mensagem do servidor, como WRONGPASS invalid username-password pair. Na rota Pelo cluster, os erros de rede têm os códigos da tabela abaixo; os de credencial são os mesmos da rota Direta.
Erros da rota pelo cluster
Quando a rota pelo cluster falha, a API responde 502 com o erro rota_cluster e um destes códigos:
| Código | O que significa | Como resolver |
|---|---|---|
| sem_permissao | A credencial do cluster não tem os verbos no namespace | Aplicar o Role acima |
| podsecurity, admissao | O PodSecurity ou uma política de admissão recusou o relay | O relay já é restricted; confira políticas próprias (Kyverno, Gatekeeper, webhook) |
| imagem | O cluster não baixou a imagem do relay | Espelhar nicolaka/netshoot (mesmo digest) no registry da empresa |
| tempo_esgotado | O relay não ficou Running em 120 s | Conferir os eventos do namespace |
| cota | A ResourceQuota não comporta o relay | Liberar 50m/64 Mi pedidos e 500m/256 Mi de limite |
| namespace_inexistente | O namespace escolhido não existe | Corrigir o namespace da rota |
| cluster_inexistente | O cluster da rota foi apagado do Kubepier | Escolher outro cluster ou voltar para Direta |
| cluster_inacessivel | O cluster da rota não respondeu | Conferir o cluster e a rede até a API dele |
| alvo_recusado | O relay chegou ao serviço, mas a conexão foi recusada | Conferir host e porta e se o serviço aceita a rede do cluster |
| alvo_tempo | O relay não alcançou o serviço em 10 s | Conferir NSG/Security Group, firewall do serviço e NetworkPolicy do namespace |
| alvo_inalcancavel | A rede do cluster não tem rota até o serviço | Conferir peering, VPN, NSG/Security Group e NetworkPolicy |
| alvo_dns | O DNS de dentro do cluster não resolve o host | Conferir o nome, a zona privada ligada à rede do cluster e o CoreDNS |
| limite_alvos | O relay já repassa 10 destinos | Usar outro namespace para a rota de outros serviços |
| srv_invalido, srv_vazio | mongodb+srv:// inválido, ou sem registros SRV vistos de dentro do cluster | Conferir a connection string e o DNS do cluster |
Formatos de conexão aceitos
- Redis: redis://usuario:senha@host:porta/banco, rediss:// para TLS, ou os campos host, porta, usuário, senha, TLS e banco.
- Redis no formato que o portal da Azure mostra (host:6380,password=...,ssl=True,abortConnect=False, com user= e defaultDatabase= opcionais). Nesse formato não há como escapar vírgula, então uma senha com vírgula é recusada. Prefira colar a connection string inteira, copiada em Chaves de acesso do cache certo: host, porta, senha e TLS vêm juntos e a chave de dev não vai parar no cadastro de prd.
- Redis: TLS ligado sem porta usa 6380 (sem TLS, 6379); a caixa TLS vale também com connection string; TLS na 6379 de um *.redis.cache.windows.net, ou redis:// na 6380 sem TLS, são recusados com a explicação.
- MongoDB: a connection string (mongodb:// ou mongodb+srv://) e, em campo separado, o nome do banco. Se você chega a um replica set por um único nó (um IP ou um túnel), acrescente directConnection=true: sem isso, o driver tenta os outros membros pelos nomes internos e falha.
- RabbitMQ: URL da API de gerenciamento (https://host:15672 ou a do provedor), usuário e senha.
- Service Bus: a connection string do namespace (Endpoint=sb://...;SharedAccessKeyName=...;SharedAccessKey=...).
Boas práticas de segurança
- Libere só a faixa do Kubepier (a /31 da lista acima), nunca 0.0.0.0/0.
- Nunca exponha um banco na internet sem TLS.
- Ao trocar de IPs, remova as regras antigas.
- Use credenciais com o mínimo de permissão; a lista de IPs soma uma camada de rede às credenciais, não as substitui.