Files
tf_provider/docs/20_discovery/troubleshooting_gpg_and_registry.md
2026-06-30 15:45:24 +04:00

3.7 KiB
Raw Permalink Blame History

Troubleshooting Note: GPG, Terraform Custom Registry & Alpine

Этот документ описывает технические нюансы и "грабли", обнаруженные при отладке Registry Protocol 23.01.2026.

1. Ошибки Terraform GPG

authentication signature from unknown issuer

Симптом: Terraform скачивает провайдер, но отказывается его устанавливать. Механизм:

  1. terraform init запрашивает у Registry URL для скачивания.
  2. Registry возвращает JSON, в котором есть поле signing_keys (массив public keys).
  3. Terraform скачивает .sig файл и .zip файл.
  4. Terraform проверяет, соответствует ли подпись .sig одному из ключей полученных из JSON. Решение: Публичный ключ, "зашитый" в код Registry Server, должен СТРОГО соответствовать приватному ключу, которым выполняется gpg --detach-sign.

Практический чек-лист:

  1. Сгенерируйте ключи и сохраните secrets/private_key.asc и secrets/public_key.asc.
  2. Обновите ASCII Armor блока публичного ключа в:
    • registry-server-build/main.go
    • operator/cmd/registry/main.go
  3. Пересоберите и задеплойте registry server.
  4. Пересоберите и перезагрузите артефакты провайдера.

error checking signature: openpgp: invalid data: tag byte does not have MSB set

Симптом: Terraform считает подпись битой. Причина: Формат файла подписи.

  • Если файл называется .asc, Terraform ожидает ASCII Armor (-----BEGIN PGP...).
  • Если файл называется .sig, Terraform (в некоторых версиях/контекстах) ожидает бинарный OpenPGP формат. Решение: Для файлов .sig создавайте бинарную подпись: gpg --detach-sign ... (БЕЗ --armor).

2. Проблемы запуска Go бинарников в Alpine

exec /path/to/binary: no such file or directory

Симптом: Файл существует (проверено через ls), права на исполнение есть (+x), но при запуске ядро выдает "файл не найден". Причина: Бинарник скомпилирован динамически и требует динамический линковщик (например, /lib64/ld-linux-x86-64.so.2), которого нет в Alpine Linux (там используется musl, а не glibc). Решение: Компилировать Go приложения абсолютно статически:

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -installsuffix cgo -ldflags '-extldflags "-static"' .

3. Паттерн "Hot Deployment" (InitContainer Injection)

Если нет доступа к Docker Registry, но нужно обновить код в запущенном кластере:

  1. Скомпилируйте бинарник локально.
  2. Загрузите его в S3.
  3. Используйте initContainer в Pod'е для скачивания бинарника в emptyDir volume.
  4. Смонтируйте этот volume в основной контейнер.
  5. Переопределите command основного контейнера, чтобы запускать скачанный файл.