3.7 KiB
3.7 KiB
Troubleshooting Note: GPG, Terraform Custom Registry & Alpine
Этот документ описывает технические нюансы и "грабли", обнаруженные при отладке Registry Protocol 23.01.2026.
1. Ошибки Terraform GPG
authentication signature from unknown issuer
Симптом: Terraform скачивает провайдер, но отказывается его устанавливать. Механизм:
terraform initзапрашивает у Registry URL для скачивания.- Registry возвращает JSON, в котором есть поле
signing_keys(массив public keys). - Terraform скачивает
.sigфайл и.zipфайл. - Terraform проверяет, соответствует ли подпись
.sigодному из ключей полученных из JSON. Решение: Публичный ключ, "зашитый" в код Registry Server, должен СТРОГО соответствовать приватному ключу, которым выполняетсяgpg --detach-sign.
Практический чек-лист:
- Сгенерируйте ключи и сохраните
secrets/private_key.ascиsecrets/public_key.asc. - Обновите ASCII Armor блока публичного ключа в:
registry-server-build/main.gooperator/cmd/registry/main.go
- Пересоберите и задеплойте registry server.
- Пересоберите и перезагрузите артефакты провайдера.
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, но нужно обновить код в запущенном кластере:
- Скомпилируйте бинарник локально.
- Загрузите его в S3.
- Используйте
initContainerв Pod'е для скачивания бинарника вemptyDirvolume. - Смонтируйте этот volume в основной контейнер.
- Переопределите
commandосновного контейнера, чтобы запускать скачанный файл.