Visão Geral da Solução
eKuiper atua como um software de análise de dados leve e processamento em tempo real projetado especificamente para ambientes de borda (edge). Embora seu núcleo funcione diretamente nos dispositivos locais, ele oferece uma interface administrativa centralizada para orquestrar múltiplas instâncias distribuídas. Comumente, essa camada de gerenciamento reside na nuvem, supervisionando nós distantes.
No entanto, restrições de segurança ou isolamento de rede frequentemente impedem que a infraestrutura central acesse diretamente os endpoints físicos da borda. Isso gera lacunas operacionais significativas. O projeto OpenYurt resolve esse cenário ao estender o ecossistema nativo do Kubernetes, permitindo que aplicações rodem na borda com a mesma abstração gerenciada em nuvem. A partir da versão 0.4.0, o suporte oficial para eKuiper foi incorporado, habilitando a criação de túneis seguros para gestão remota.
Neste guia técnico, detalhamos a configuração de um ambiente onde instâncias do eKuiper rodam em nós isolados (borda) enquanto o painel de controle opera na nuvem, utilizando túneis OpenYurt para estabelecer comunicação bidirecional entre redes distintas.
Pré-requisitos
A infraestrutura base deve consistir em dois grupos de nós conectados através de uma topologia de duas camadas:
- Nó Central (Cloud): Requer Kubernetes, Helm e as ferramentas de conversão do OpenYurt instaladas. É necessário garantir que este nó possua um endereço IP público ou roteável externamente para servir de ponto de entrada aos túneis.
- Nó de Borda (Edge): Deve ter o Kubernetes instalado, mas pode permanecer em uma rede interna fechada, sem acesso direto externo.
Atenção à versão do Kubernetes: Para compatibilidade total com OpenYurt neste contexto, recomenda-se a faixa de 1.20.x ou inferior, evitando versões superiores que possam quebrar dependências do controlador.
Configuração do Cluster
Inicializamos a plataforma utilizando kubeadm. No nó central, definimos um ponto final explícito de controle para facilitar a descoberta posterior pelos nós trabalhadores.
# Inicia o cluster com a versão específica suportada
sudo kubeadm init --control-plane-endpoint 192.168.1.100 --kubernetes-version stable-1.20
Este comando configura a autoridade mestre e gera credenciais necessárias. Após a inicialização bem-sucedida, configure o ambiente de usuário seguindo as instruções de saída para exportar o arquivo admin.conf.
No nó de borda, execute o comando de junção retornado anteriormente. Caso os nós permaneçam no status NotReady, aplique um plugin de rede padrão como o Weave Net para resolver conflitos de comunicação entre pods.
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\\n')"
Verifique a saúde dos nós antes de prosseguir:
$ kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP CONTAINER-RUNTIME
cloud-master Ready control-plane,master 10m v1.20.8 172.31.10.5 - docker://20.10.7
edge-worker Ready <none> 10m v1.20.8 10.0.2.15 - docker://20.10.7</none>
Roteamento de Acesso Externo
Para que os serviços na borda sejam alcançáveis via túnel a partir da nuvem, é crucial mapear corretamente os endereços internos. Se o nó central não tiver um IP público nativo, configure regras iptables no gateway para traduzir o destino interno para o público.
Exemplo de regra no nó central para redirecionar tráfego destinado ao IP interno do servidor para o IP externo acessível:
sudo iptables -t nat -A OUTPUT -d 172.31.10.5 -j DNAT --to-destination 192.168.1.100
Aplicação equivalente no nó de borda garante que a requisição seja encaminhada corretamente para o serviço local.
Implantação do eKuiper na Borda
O fluxo de processamento será hospedado exclusivamente no nó de borda. Utilizamos arquivos de template do Helm ajustados para fixar o agendamento (scheduling) específico.
- Baixe o repositório de deploy e edite o manifest do StatefulSet.
- Force a execução no nó de borda alterando o campo de seleção de nó:
spec:
replicas: 1
selector:
matchLabels:
app: ekuiper
template:
spec:
nodeName: edge-worker
containers:
- name: kuiper
image: emqx/ekuiper:latest
Proceda com a instalação através do Helm no namespace padrão:
$ helm install iot-stream ./chart/Kuiper
Validação do pod confirmará que o agente está rodando no endereço interno correto da borda. O serviço REST exposto internamente ouvirá na porta 9081.
Implantação do Painel Gerencial na Nuvem
No centro de controle, configuramos o serviço kmanager para gerenciar os recursos remotos. Defina a imagem correspondente à versão do eKuiper instalado para evitar incompatibilidades.
image: emqx/kuiper-manager:1.2.1
Com o manifesto aplicado, o serviço de administração ficará disponível via NodePort. Acesse o painel através do navegador utilizando o IP público da máquina central e a porta exposta (ex.: 32555). Ao tentar adicionar o serviço remoto manualmente, observe que a conexão falhará inicialmente devido à ausência de rota para o IP privado da borda.
Habilitando Túneis com OpenYurt
O problema de conectividade é resolvido integrando o cluster ao ecossistema OpenYurt e configurando tunelamentos de rede.
1. Mapeamento de Portas no ConfigMap: No servidor de túnel, defina a tradução necessária para a porta 9081 do eKuiper.
data:
dnat-ports-pair: "9081=10264"
2. Rótulos de Trabalho: Identifique os nós para o controlador OpenYurt.
# Nó Central atuando como controlador principal
kubectl label nodes cloud-master openyurt.io/is-edge-worker=false
# Nó de Borda sendo gerenciado
kubectl label nodes edge-worker openyurt.io/is-edge-worker=true
3. Conversão do Cluster: Transforme o cluster existente para operar com os controladores estendidos.
_output/bin/yurtctl convert --provider kubeadm --cloud-nodes cloud-master
Após a conversão e a ativação do agente de túnel no nó de borda, o servidor central estabelece um canal criptografado. Retorne ao painel do eKuiper Manager; o serviço remoto agora deve apresentar um estado Healthy.
Com a estabilidade do túnel estabelecida, operações complexas como criação de fluxos de streaming, definição de regras de filtro e gerenciamento de plug-ins podem ser executadas remotamente através da interface web, unificando a experiência operacional entre centros e extremidades da rede.