Voltar ao blog

Configuração de Proxy em Clusters Kubernetes: Guia Completo para Engenheiros DevOps

Guia completo para configurar proxy no Kubernetes: configuração de variáveis de ambiente, configuração do Docker, containerd, kubectl e resolução de problemas comuns de acesso à rede.

📅17 de fevereiro de 2026
```html

Ao implantar o Kubernetes em um ambiente corporativo ou atrás de um firewall, frequentemente surge a necessidade de configurar um servidor proxy para acessar recursos externos. Isso é crucial para baixar imagens de contêineres, atualizar pacotes e interagir com APIs externas. Neste guia, abordaremos todos os níveis de configuração de proxy no Kubernetes — desde a configuração de nós até pods individuais.

Por que precisamos de proxy em clusters Kubernetes

Clusters Kubernetes em ambientes corporativos frequentemente operam em redes isoladas com acesso limitado à internet. Um servidor proxy resolve várias questões críticas:

  • Baixar imagens de contêineres — Docker Hub, Google Container Registry, repositórios privados exigem acesso externo
  • Atualização de pacotes — instalação de dependências via apt, yum, pip dentro de contêineres
  • Acesso a APIs externas — integração com serviços em nuvem, monitoramento, logging
  • Segurança — controle de tráfego, filtragem de domínios, registro de solicitações
  • Cache — aceleração de solicitações repetidas aos mesmos recursos

Sem a configuração correta do proxy, você enfrentará erros como "image pull failed", "connection timeout" ou "network unreachable" ao tentar implantar aplicativos. Isso é especialmente crítico para pipelines automáticos de CI/CD, onde cada segundo de inatividade custa dinheiro.

Importante: Para clusters corporativos, é recomendável usar proxies de data center com alta largura de banda e estabilidade de conexão, pois a funcionalidade de toda a infraestrutura depende deles.

Níveis de configuração de proxy no Kubernetes

O Kubernetes possui uma arquitetura em múltiplos níveis, e o proxy deve ser configurado em cada nível, dependendo das tarefas:

Nível O que é configurado Para que serve
Sistema Operacional Variáveis de ambiente do sistema Acesso a utilitários (curl, wget, apt)
Container Runtime (Docker/containerd) Configuração do daemon Baixar imagens de contêineres
kubelet Parâmetros de inicialização do kubelet Interação com o servidor API
Pods Variáveis de ambiente nos manifests Acesso de aplicativos a APIs externas
kubectl Variáveis de ambiente do cliente Gerenciamento do cluster através do proxy

Cada nível requer uma configuração separada, e pular qualquer um deles pode levar a problemas. Por exemplo, se você configurar o proxy apenas para o Docker, mas não para os pods, as imagens serão baixadas, mas os aplicativos dentro dos contêineres não conseguirão acessar APIs externas.

Configuração de proxy para Docker e containerd

O runtime de contêiner é o primeiro componente que precisa ser configurado, pois é ele quem é responsável por baixar imagens de contêineres de repositórios externos. Vamos ver a configuração para ambos os runtimes populares.

Configuração de proxy para Docker

Para o Docker, você precisa criar um arquivo drop-in do systemd que adicionará variáveis de ambiente ao serviço Docker:

# Crie o diretório para a configuração
sudo mkdir -p /etc/systemd/system/docker.service.d

# Crie o arquivo com as configurações do proxy
sudo tee /etc/systemd/system/docker.service.d/http-proxy.conf <<EOF
[Service]
Environment="HTTP_PROXY=http://proxy.company.com:8080"
Environment="HTTPS_PROXY=http://proxy.company.com:8080"
Environment="NO_PROXY=localhost,127.0.0.1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,.cluster.local,.svc"
EOF

# Recarregue a configuração do systemd
sudo systemctl daemon-reload

# Reinicie o Docker
sudo systemctl restart docker

# Verifique se as configurações foram aplicadas
sudo systemctl show --property=Environment docker

Depois disso, o Docker poderá baixar imagens através do servidor proxy. Você pode verificar o funcionamento com o comando:

docker pull nginx:latest

Configuração de proxy para containerd

O containerd é usado em clusters Kubernetes modernos como o principal runtime de contêiner. A configuração do proxy para ele é um pouco diferente:

# Crie o diretório para a configuração
sudo mkdir -p /etc/systemd/system/containerd.service.d

# Crie o arquivo com as configurações do proxy
sudo tee /etc/systemd/system/containerd.service.d/http-proxy.conf <<EOF
[Service]
Environment="HTTP_PROXY=http://proxy.company.com:8080"
Environment="HTTPS_PROXY=http://proxy.company.com:8080"
Environment="NO_PROXY=localhost,127.0.0.1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,.cluster.local,.svc"
EOF

# Recarregue a configuração
sudo systemctl daemon-reload
sudo systemctl restart containerd

# Verifique o status
sudo systemctl status containerd

Dica: Se você estiver usando um registro de contêiner privado, adicione seu domínio ao NO_PROXY para evitar atrasos desnecessários e problemas com certificados SSL.

Configuração de proxy para kubelet

O kubelet é o agente do Kubernetes que opera em cada nó do cluster. Ele também precisa de acesso ao servidor API e a recursos externos. A configuração depende da forma como o Kubernetes foi instalado.

Para clusters kubeadm

Se você estiver usando kubeadm, configure o proxy através do systemd:

# Crie o diretório para a configuração do kubelet
sudo mkdir -p /etc/systemd/system/kubelet.service.d

# Crie o arquivo com as configurações do proxy
sudo tee /etc/systemd/system/kubelet.service.d/http-proxy.conf <<EOF
[Service]
Environment="HTTP_PROXY=http://proxy.company.com:8080"
Environment="HTTPS_PROXY=http://proxy.company.com:8080"
Environment="NO_PROXY=localhost,127.0.0.1,10.96.0.0/12,10.244.0.0/16,.cluster.local,.svc"
EOF

# Recarregue o kubelet
sudo systemctl daemon-reload
sudo systemctl restart kubelet

Para Kubernetes gerenciado (EKS, GKE, AKS)

Em serviços Kubernetes gerenciados, a configuração do kubelet geralmente é feita através de parâmetros de inicialização dos nós ou scripts de dados do usuário. Por exemplo, para AWS EKS:

#!/bin/bash
# Script de dados do usuário para nós de trabalho EKS

# Configuração do proxy para o sistema
cat <<EOF >> /etc/environment
HTTP_PROXY=http://proxy.company.com:8080
HTTPS_PROXY=http://proxy.company.com:8080
NO_PROXY=localhost,127.0.0.1,169.254.169.254,.ec2.internal,.cluster.local
EOF

# Configuração para kubelet
mkdir -p /etc/systemd/system/kubelet.service.d
cat <<EOF > /etc/systemd/system/kubelet.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://proxy.company.com:8080"
Environment="HTTPS_PROXY=http://proxy.company.com:8080"
Environment="NO_PROXY=localhost,127.0.0.1,169.254.169.254,.ec2.internal,.cluster.local"
EOF

systemctl daemon-reload
systemctl restart kubelet

Note a adição de 169.254.169.254 ao NO_PROXY — este é o endereço do serviço de metadados da AWS, que deve estar acessível sem proxy.

Configuração de proxy no nível de pods

Mesmo que você tenha configurado o proxy para Docker e kubelet, os aplicativos dentro dos pods não usarão automaticamente o proxy. É necessário especificar explicitamente as variáveis de ambiente nos manifests do Kubernetes.

Configuração através do manifest de Deployment

A maneira mais simples é adicionar variáveis de ambiente na especificação do contêiner:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  namespace: default
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: app
        image: my-company/my-app:latest
        env:
        - name: HTTP_PROXY
          value: "http://proxy.company.com:8080"
        - name: HTTPS_PROXY
          value: "http://proxy.company.com:8080"
        - name: NO_PROXY
          value: "localhost,127.0.0.1,.cluster.local,.svc,10.0.0.0/8"
        ports:
        - containerPort: 8080

Uso de ConfigMap para configuração centralizada

Para evitar duplicar as configurações de proxy em cada Deployment, crie um ConfigMap:

apiVersion: v1
kind: ConfigMap
metadata:
  name: proxy-config
  namespace: default
data:
  HTTP_PROXY: "http://proxy.company.com:8080"
  HTTPS_PROXY: "http://proxy.company.com:8080"
  NO_PROXY: "localhost,127.0.0.1,.cluster.local,.svc,10.0.0.0/8"

Em seguida, use este ConfigMap no Deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  template:
    spec:
      containers:
      - name: app
        image: my-company/my-app:latest
        envFrom:
        - configMapRef:
            name: proxy-config

Essa abordagem simplifica o gerenciamento: ao alterar o endereço do proxy, basta atualizar o ConfigMap, e após a reinicialização dos pods, as novas configurações serão aplicadas automaticamente.

Injeção automática através do MutatingWebhook

Para adicionar automaticamente as variáveis de proxy em todos os pods, você pode usar o MutatingAdmissionWebhook. Esta é uma abordagem avançada que requer o desenvolvimento de um serviço webhook próprio, mas permite gerenciar centralizadamente as configurações sem modificar os manifests dos aplicativos.

Configuração correta do NO_PROXY

A variável NO_PROXY define quais endereços e domínios devem contornar o servidor proxy. Uma configuração incorreta do NO_PROXY é a causa mais comum de problemas em clusters Kubernetes.

Exceções obrigatórias para Kubernetes

Os seguintes endereços e intervalos DEVEM sempre estar no NO_PROXY:

Endereço/Intervalo Finalidade
localhost, 127.0.0.1 Conexões locais
.cluster.local DNS interno do cluster
.svc Serviços Kubernetes
10.0.0.0/8 Rede de Pods (depende do CNI)
10.96.0.0/12 Rede de Serviços (padrão)
172.16.0.0/12 Redes privadas do Docker
192.168.0.0/16 Redes locais privadas

Exemplo de configuração completa do NO_PROXY

NO_PROXY=localhost,127.0.0.1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,10.96.0.0/12,.cluster.local,.svc,.default.svc,.default.svc.cluster.local,kubernetes.default.svc,kubernetes.default.svc.cluster.local

Atenção: Alguns aplicativos não suportam a notação CIDR no NO_PROXY. Nesses casos, use wildcards: 10.* em vez de 10.0.0.0/8.

Configuração do kubectl para trabalhar através do proxy

Se você gerencia um cluster a partir de uma estação de trabalho que está atrás de um proxy, configure as variáveis de ambiente para o kubectl:

# Para Linux/macOS - adicione ao ~/.bashrc ou ~/.zshrc
export HTTP_PROXY=http://proxy.company.com:8080
export HTTPS_PROXY=http://proxy.company.com:8080
export NO_PROXY=localhost,127.0.0.1,kubernetes.default.svc,.cluster.local

# Para Windows PowerShell
$env:HTTP_PROXY="http://proxy.company.com:8080"
$env:HTTPS_PROXY="http://proxy.company.com:8080"
$env:NO_PROXY="localhost,127.0.0.1,kubernetes.default.svc,.cluster.local"

Depois disso, o kubectl poderá se conectar ao servidor API do cluster através do proxy. Verifique o funcionamento:

kubectl cluster-info
kubectl get nodes

Configuração de proxy com autenticação

Se o servidor proxy exigir autenticação, adicione as credenciais na URL:

export HTTP_PROXY=http://username:password@proxy.company.com:8080
export HTTPS_PROXY=http://username:password@proxy.company.com:8080

Segurança: Não armazene senhas em texto claro em arquivos de configuração. Use variáveis de ambiente ou segredos do Kubernetes para armazenar credenciais do proxy.

Diagnóstico e resolução de problemas comuns

Mesmo com a configuração correta, podem surgir problemas. Vamos abordar os erros mais comuns e como resolvê-los.

Erro "ImagePullBackOff" ao baixar imagens

Sintomas: Os pods não iniciam, nos eventos aparece o erro "Failed to pull image" ou "connection timeout".

Diagnóstico:

# Verifique os eventos do pod
kubectl describe pod <pod-name>

# Verifique as configurações de proxy no Docker/containerd
sudo systemctl show --property=Environment docker
sudo systemctl show --property=Environment containerd

# Tente baixar a imagem manualmente no nó
sudo docker pull nginx:latest
sudo crictl pull nginx:latest

Solução: Certifique-se de que o proxy está configurado para o runtime de contêiner e que o domínio do repositório de imagens não está no NO_PROXY.

Problemas com resolução de DNS dentro do cluster

Sintomas: Os pods não conseguem se comunicar entre si por nomes DNS (por exemplo, service-name.namespace.svc.cluster.local).

Diagnóstico:

# Verifique o DNS a partir do pod
kubectl run -it --rm debug --image=busybox --restart=Never -- nslookup kubernetes.default

# Verifique as variáveis de proxy no pod
kubectl exec -it <pod-name> -- env | grep PROXY

Solução: Adicione .cluster.local e .svc ao NO_PROXY.

Desempenho lento ou timeouts ao acessar APIs externas

Sintomas: Os aplicativos funcionam lentamente ou recebem timeout ao fazer solicitações a serviços externos.

Diagnóstico:

# Verifique a disponibilidade do proxy a partir do pod
kubectl exec -it <pod-name> -- curl -v -x http://proxy.company.com:8080 https://www.google.com

# Meça o tempo de resposta
kubectl exec -it <pod-name> -- time curl -x http://proxy.company.com:8080 https://api.example.com

Solução: O problema pode estar na performance do servidor proxy. Considere usar proxies residenciais com localização geográfica próxima para reduzir latências.

Erros SSL/TLS ao trabalhar através do proxy

Sintomas: Erros como "certificate verify failed" ou "SSL handshake failed".

Causa: Alguns servidores proxy realizam inspeção SSL (descriptografando o tráfego HTTPS), o que requer a instalação do certificado raiz do proxy.

Solução:

# Crie um ConfigMap com o certificado do proxy
kubectl create configmap proxy-ca-cert --from-file=ca.crt=/path/to/proxy-ca.crt

# Monte o certificado no pod e adicione ao armazenamento de sistema
apiVersion: apps/v1
kind: Deployment
spec:
  template:
    spec:
      containers:
      - name: app
        volumeMounts:
        - name: proxy-ca
          mountPath: /usr/local/share/ca-certificates/proxy-ca.crt
          subPath: ca.crt
      volumes:
      - name: proxy-ca
        configMap:
          name: proxy-ca-cert

Melhores práticas para proxy em produção

Com base na experiência de operação de clusters Kubernetes em ambientes corporativos, aqui estão recomendações para um funcionamento confiável com proxy:

1. Use servidores proxy de alta disponibilidade

O proxy se torna um único ponto de falha para todo o cluster. Configure vários servidores proxy atrás de um balanceador de carga:

HTTP_PROXY=http://proxy-lb.company.com:8080

Onde proxy-lb.company.com é o balanceador de carga na frente de vários servidores proxy.

2. Gerenciamento centralizado de configuração

Use ConfigMap ou Secret para armazenar as configurações do proxy em vez de codificá-las em cada manifest:

apiVersion: v1
kind: ConfigMap
metadata:
  name: cluster-proxy-config
  namespace: kube-system
data:
  HTTP_PROXY: "http://proxy-lb.company.com:8080"
  HTTPS_PROXY: "http://proxy-lb.company.com:8080"
  NO_PROXY: "localhost,127.0.0.1,.cluster.local,.svc,10.0.0.0/8"

3. Monitoramento e alertas

Configure o monitoramento da disponibilidade dos servidores proxy e alertas em caso de problemas:

  • Tempo de resposta do proxy (deve ser < 100ms para proxies locais)
  • Número de erros de conexão ao proxy
  • Número de eventos ImagePullBackOff no cluster
  • Uso de CPU e rede nos servidores proxy

4. Documente as exceções do NO_PROXY

Mantenha documentação sobre quais domínios e endereços IP foram adicionados ao NO_PROXY e por quê. Isso ajudará na resolução de problemas e auditoria de segurança.

5. Teste as alterações no ambiente de desenvolvimento

Antes de alterar as configurações do proxy em produção, sempre teste em um cluster de desenvolvimento/staging:

# Pod de teste para verificar o proxy
apiVersion: v1
kind: Pod
metadata:
  name: proxy-test
spec:
  containers:
  - name: test
    image: curlimages/curl:latest
    command: ["sleep", "3600"]
    env:
    - name: HTTP_PROXY
      value: "http://new-proxy.company.com:8080"
    - name: HTTPS_PROXY
      value: "http://new-proxy.company.com:8080"

# Verifique a disponibilidade de recursos externos
kubectl exec -it proxy-test -- curl -v https://registry.k8s.io
kubectl exec -it proxy-test -- curl -v https://docker.io

6. Use diferentes tipos de proxy para diferentes tarefas

Para componentes críticos (download de imagens, API do cluster), use proxies rápidos de data center, e para aplicativos que exigem diversidade geográfica de IP — proxies residenciais ou móveis.

7. Atualize regularmente a lista do NO_PROXY

Ao adicionar novos serviços ou alterar a topologia da rede, atualize o NO_PROXY. Automatize isso através de Helm charts ou Kustomize:

# values.yaml para Helm chart
proxy:
  enabled: true
  http: "http://proxy.company.com:8080"
  https: "http://proxy.company.com:8080"
  noProxy:
    - localhost
    - 127.0.0.1
    - .cluster.local
    - .svc
    - 10.0.0.0/8
    - internal-service.company.com

Conclusão

A configuração de proxy em clusters Kubernetes é uma tarefa em múltiplos níveis que requer atenção aos detalhes em cada nível: desde o sistema operacional e runtime de contêiner até pods individuais. A configuração correta garante a operação contínua do cluster, acesso seguro a recursos externos e conformidade com as políticas de segurança corporativas.

Pontos-chave a serem lembrados:

  • Configure o proxy em todos os níveis: OS, runtime de contêiner, kubelet, pods
  • Configure corretamente o NO_PROXY, incluindo todas as redes internas do cluster
  • Use gerenciamento centralizado através de ConfigMap
  • Monitore a disponibilidade e o desempenho dos servidores proxy
  • Teste as alterações antes de aplicá-las em produção

Para clusters Kubernetes críticos, recomendamos o uso de proxies de data center confiáveis com alta disponibilidade e baixa latência. Isso garantirá a operação estável da infraestrutura e minimizará os riscos de inatividade devido a problemas de acesso à rede.

Ao enfrentar problemas, use uma abordagem sistemática para diagnóstico: verifique as configurações em cada nível, analise logs e eventos, teste a conexão manualmente. A maioria dos problemas com proxy no Kubernetes é resolvida com a configuração correta das variáveis de ambiente e do NO_PROXY.

```