Como acessar um aplicativo Kubernetes remoto com encaminhamento de porta Kubectl

0
14


Você precisa depurar um aplicativo em execução dentro de seu cluster Kubernetes? O encaminhamento de porta é uma maneira de se conectar a pods que não são acessíveis publicamente. Você pode usar essa técnica para inspecionar bancos de dados, ferramentas de monitoramento e outros aplicativos que deseja implantar internamente sem uma rota pública.

O encaminhamento de porta é integrado ao Kubectl. A CLI pode iniciar sessões de encapsulamento que redirecionam o tráfego em portas locais para pods em seu cluster Kubernetes. Veja como configurá-lo.

Como funciona o encaminhamento de porta

O encaminhamento de porta é um tipo de regra de conversão de endereço de rede (NAT) que roteia o tráfego de uma rede para outra. No contexto do Kubernetes, solicitações que parecem ser canceladas por localhost são redirecionados para a rede interna do seu cluster.

O encaminhamento de porta funciona apenas no nível da porta. Você endereça uma porta específica como 33060 para um porto de destino, como 3306 na rede de destino. Quando você envia tráfego para sua porta local 33060será encaminhado automaticamente para a porta 3306 na extremidade remota.

Essa técnica permite acessar cargas de trabalho privadas do Kubernetes que não são expostas pelo NodePort, Ingress ou LoadBalancer. Você pode rotear o tráfego local diretamente para seu cluster, eliminando a necessidade de criar serviços Kubernetes para suas cargas de trabalho internas. Isso ajuda a reduzir sua superfície de ataque.

Como implantar um aplicativo de amostra

Agora vamos ver o encaminhamento de porta do Kubernetes em ação. Comece criando uma implantação básica à qual você se conectará usando o encaminhamento de porta na próxima seção.

Estamos usando um pod de banco de dados MySQL como um exemplo realista de quando você pode precisar usar essa técnica. Os bancos de dados normalmente não são expostos publicamente, portanto, os administradores do Kubernetes costumam usar o encaminhamento de porta para abrir uma conexão direta.

Crie um arquivo YAML para sua implementação:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - image: mysql:8.0
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: mysql

Certifique-se de alterar o valor do MYSQL_ROOT_PASSWORD variável de ambiente antes de usar este manifesto em produção. Corre kubectl apply Para criar sua implementação do MySQL:

$ kubectl apply -f mysql.yaml
deployment.apps/mysql created

Em seguida, use o get pods Comando para verificar se a carga de trabalho foi iniciada com sucesso:

$ kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
mysql-5f54dd5789-t5fzc   1/1     Running   0          2s

Usando Kubectl para encaminhar portas para Kubernetes

Embora o MySQL agora esteja sendo executado em seu cluster, você não tem como acessá-lo de fora. Em seguida, configure uma sessão de encaminhamento de porta para que você possa usar suas instalações locais de ferramentas como o mysql CLI para se conectar ao seu banco de dados.

Aqui está um exemplo simples:

$ kubectl port-forward deployment/mysql 33060:3306
Forwarding from 127.0.0.1:33060 -> 3306
Forwarding from [::1]:33060 -> 3306

As conexões com a porta 33060 serão direcionadas para a porta 3306 no Pod executando sua implementação do MySQL. Agora você pode iniciar uma sessão de shell MySQL direcionada ao seu banco de dados no Kubernetes:

$ mysql --host 127.0.0.1 --port 33060 -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 10
Server version: 8.0.29 MySQL Community Server - GPL

Mantenha a janela do shell que está executando o kubectl port-forward comando open durante a sessão de depuração. O encaminhamento de porta terminará quando você pressionar Ctrl + C ou fechar a janela.

Alterando os números das portas locais e remotas

A sintaxe para ligações de número de porta é local:remote. a 33060:3306 exemplo mostrado acima mapeia a porta 33060 em localhost uma 3306 na cápsula de destino.

Especificar apenas um número, sem dois pontos, irá interpretá-lo como a porta local e remota:

$ kubectl port-forward deployment/mysql 3306

Você pode deixar a porta local em branco para atribuir automaticamente uma porta aleatória:

$ kubectl port-forward deployment/mysql :3306
Forwarding from 127.0.0.1:34923 -> 3306
Forwarding from [::1]:34923 -> 3306

Aqui eu usaria o número da porta gerado aleatoriamente 34923 com seu cliente MySQL local.

Mudar a direção de escuta

Kubectl se junta à porta local no 127.0.0.1 (IPv4) e ::1 (IPv6) endereços padrão. Em vez disso, você pode especificar seu próprio conjunto de endereços IP fornecendo um --address marca quando você executa o port-forward domínio:

# Listen on two IPv4 addresses
$ kubectl port-forward deployment/mysql :3306 --address 127.0.0.1,192.168.0.1

A bandeira só aceita endereços IP e o localhost palavra chave. Este último é interpretado para incluir 127.0.0.1 S ::1padrões de comando correspondentes quando --address omitido.

Resumo

O encaminhamento de porta é uma técnica útil para acessar aplicativos privados em seu cluster Kubernetes. O Kubectl afunila o tráfego da sua rede local para uma porta específica em um determinado pod. É um mecanismo de nível relativamente baixo que pode lidar com qualquer conexão TCP. O encaminhamento de porta UDP ainda não é suportado.

Usar uma sessão de encaminhamento de porta ad-hoc é uma maneira segura de depurar cargas de trabalho que não precisam ser expostas externamente. A criação de um serviço para cada nova implantação pode permitir que invasores e invasores descubram endpoints que precisam ser protegidos. O encaminhamento de portas no Kubectl permite que você se conecte com segurança diretamente aos seus aplicativos, sem precisar descobrir em quais nós eles estão sendo executados.