add: documentation
This commit is contained in:
@@ -0,0 +1,55 @@
|
||||
# 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 приложения **абсолютно статически**:
|
||||
```bash
|
||||
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` основного контейнера, чтобы запускать скачанный файл.
|
||||
Reference in New Issue
Block a user