|
1 | | -# debugTools |
| 1 | +# debugTools |
| 2 | + |
| 3 | +Imagem de debug não-root para uso em containers efêmeros de diagnóstico no Kubernetes. |
| 4 | + |
| 5 | +## Objetivo |
| 6 | + |
| 7 | +Esta imagem existe para substituir o uso genérico de `nicolaka/netshoot` em cenários onde o workload alvo exige `runAsNonRoot` e políticas mais rígidas de segurança. |
| 8 | + |
| 9 | +Ela foi desenhada para uso geral em troubleshooting Kubernetes com `kubectl debug`, especialmente quando o caso exige toolbox de rede, DNS e TLS dentro do pod alvo. |
| 10 | + |
| 11 | +## Para que serve |
| 12 | + |
| 13 | +Use esta imagem quando o operador precisar: |
| 14 | + |
| 15 | +- validar DNS, TCP e TLS a partir do namespace/pod real; |
| 16 | +- inspecionar resolução de nomes, rotas e sockets; |
| 17 | +- fazer `GET`/`HEAD` idempotentes para health checks; |
| 18 | +- analisar certificados, cadeias TLS e handshake; |
| 19 | +- consultar JSON/YAML/texto com ferramentas simples e previsíveis; |
| 20 | +- operar em pods com `runAsNonRoot`, sem depender de imagem root. |
| 21 | + |
| 22 | +## O que esta imagem entrega |
| 23 | + |
| 24 | +Ferramental incluído: |
| 25 | + |
| 26 | +- `bash` |
| 27 | +- `bind-tools` (`dig`, `nslookup`) |
| 28 | +- `busybox-extras` |
| 29 | +- `ca-certificates` |
| 30 | +- `coreutils` |
| 31 | +- `curl` |
| 32 | +- `file` |
| 33 | +- `findutils` |
| 34 | +- `gawk` |
| 35 | +- `grep` |
| 36 | +- `iproute2` (`ip`, `ss`) |
| 37 | +- `iputils` |
| 38 | +- `jq` |
| 39 | +- `netcat-openbsd` (`nc`) |
| 40 | +- `openssl` |
| 41 | +- `procps` |
| 42 | +- `sed` |
| 43 | +- `socat` |
| 44 | +- `util-linux` |
| 45 | +- `wget` |
| 46 | +- `yq` |
| 47 | + |
| 48 | +Características operacionais: |
| 49 | + |
| 50 | +- base `alpine:3.23.4` |
| 51 | +- usuário numérico fixo `10001:10001` |
| 52 | +- `WORKDIR=/workspace` |
| 53 | +- imagem pequena o suficiente para uso recorrente, mas completa para diagnóstico de rede/TLS |
| 54 | + |
| 55 | +## O que esta imagem não tenta ser |
| 56 | + |
| 57 | +Esta imagem não tenta virar toolbox universal sem critério. |
| 58 | + |
| 59 | +Ela deliberadamente não inclui por padrão: |
| 60 | + |
| 61 | +- `kubectl` |
| 62 | +- `helm` |
| 63 | +- `tcpdump` |
| 64 | +- clientes específicos de banco (`psql`, `redis-cli`, `mysql`, `mongo`) |
| 65 | +- toolchains de build |
| 66 | +- Python/Node/Go só para scripting ad hoc |
| 67 | + |
| 68 | +Motivo: |
| 69 | + |
| 70 | +- isso aumenta tamanho, superfície de ataque e drift; |
| 71 | +- boa parte desses binários não é necessária para a maioria dos diagnósticos read-only no Kubernetes; |
| 72 | +- o objetivo aqui é resolver bem a trilha de conectividade, DNS, TLS, sockets e parsing leve. |
| 73 | + |
| 74 | +Se algum binário extra virar necessidade recorrente e justificada por evidência real, ele deve ser adicionado conscientemente, não por conveniência. |
| 75 | + |
| 76 | +## Como usar |
| 77 | + |
| 78 | +### 1. Publicar no GHCR |
| 79 | + |
| 80 | +O workflow em `.github/workflows/publish.yml` publica a imagem em: |
| 81 | + |
| 82 | +```text |
| 83 | +ghcr.io/heraque/debugtools |
| 84 | +``` |
| 85 | + |
| 86 | +Fluxo esperado: |
| 87 | + |
| 88 | +1. subir mudanças na branch `main`; |
| 89 | +2. deixar o GitHub Actions buildar e publicar; |
| 90 | +3. preferir tags versionadas para produção, por exemplo `v0.1.0`; |
| 91 | +4. evitar depender de `:main` por muito tempo em ambientes estáveis. |
| 92 | + |
| 93 | +### 2. Build local |
| 94 | + |
| 95 | +```bash |
| 96 | +docker build -t debugtools:test . |
| 97 | +``` |
| 98 | + |
| 99 | +### 3. Teste local rápido |
| 100 | + |
| 101 | +```bash |
| 102 | +docker run --rm debugtools:test sh -lc 'id && dig -v | head -n 1 && openssl version && jq --version' |
| 103 | +``` |
| 104 | + |
| 105 | +### 4. Uso manual com kubectl debug |
| 106 | + |
| 107 | +Exemplo ilustrativo: |
| 108 | + |
| 109 | +```bash |
| 110 | +kubectl debug pod/app-123 \ |
| 111 | + -n app-ns \ |
| 112 | + --target=app \ |
| 113 | + --image=ghcr.io/heraque/debugtools:v0.1.0 \ |
| 114 | + --container=debugger \ |
| 115 | + -- bash |
| 116 | +``` |
| 117 | + |
| 118 | +## Uso em automações e wrappers |
| 119 | + |
| 120 | +Esta imagem pode ser consumida por wrappers, automações de diagnóstico ou uso manual com `kubectl debug`. |
| 121 | + |
| 122 | +Contrato operacional esperado: |
| 123 | + |
| 124 | +- usar somente em diagnóstico controlado; |
| 125 | +- preferir primeiro o runtime nativo do container alvo quando ele já tiver os binários necessários; |
| 126 | +- subir para um container efêmero quando: |
| 127 | + - faltarem binários no container alvo; |
| 128 | + - a prova precisar vir do runtime/pod real; |
| 129 | + - o caso exigir toolbox de rede/TLS mais completo. |
| 130 | + |
| 131 | +## Casos típicos de uso |
| 132 | + |
| 133 | +- testar `tcp` e `tls` para `kubernetes.default.svc:443` |
| 134 | +- validar SNI e trust chain de um endpoint interno |
| 135 | +- confirmar DNS dentro do pod quando a aplicação não tem `dig`/`nslookup` |
| 136 | +- analisar `curl -I`/`wget --spider` em endpoints de health |
| 137 | +- checar `ss -plant` ou `ip route` durante falha de conectividade |
| 138 | +- inspecionar resposta HTTP sem depender de shell livre fora do fluxo de diagnóstico |
| 139 | + |
| 140 | +## Segurança e trade-offs |
| 141 | + |
| 142 | +Pontos de desenho: |
| 143 | + |
| 144 | +- não-root por padrão para compatibilidade com `runAsNonRoot` |
| 145 | +- sem privilégio adicional |
| 146 | +- sem capabilities extras por padrão |
| 147 | +- foco em diagnóstico read-only |
| 148 | + |
| 149 | +Trade-off aceito: |
| 150 | + |
| 151 | +- a imagem não é a menor possível em bytes absolutos; |
| 152 | +- ela é pequena o bastante para uso operacional e grande o bastante para evitar fallback tosco durante incidentes reais. |
| 153 | + |
| 154 | +## Versionamento recomendado |
| 155 | + |
| 156 | +Para uso operacional estável: |
| 157 | + |
| 158 | +- publique com tag semântica, por exemplo `v0.1.0` |
| 159 | +- fixe o chart/consumer nesse tag |
| 160 | +- use `:main` apenas como trilha de desenvolvimento |
| 161 | + |
| 162 | +## Quando evoluir esta imagem |
| 163 | + |
| 164 | +Vale mexer nela quando houver evidência recorrente de que falta uma capacidade necessária ao troubleshooting real, por exemplo: |
| 165 | + |
| 166 | +- debugging de DNS/TLS insuficiente; |
| 167 | +- parsing estrutural insuficiente; |
| 168 | +- incompatibilidade com políticas comuns de segurança de workload. |
| 169 | + |
| 170 | +Não vale mexer nela só porque “pode ser útil algum dia”. |
0 commit comments