Как автоматически загружать новые сертификаты TLS для прокси-сервера Envoy?

Я использую https://github.com/jetstack/cert-manager в среде Kubernetes. для автоматической загрузки https://letsencrypt.org/. Он создает сертификаты, срок действия которых истекает через 90 дней. за 30 дней до истечения срока, cert-manager обновляет сертификаты и заменяет сертификаты. Сертификаты хранятся в секрете k8s.

Как заставить Envoy Proxy автоматически перезагружать сертификаты? Вопросы были закрыты и, похоже, остались без ответа. Есть несколько упоминаний о службе секретного обнаружения (SDS), которая может помочь найти решение, но я еще не смог придумать ни одного.

Для nginx можно настроить TLS, добавив секреты k8s в тома k8s, подключив том к файловой системе для использования nginx. Затем можно использовать наблюдатель файловой системы для вызова sudo nginx -s reload для перезагрузки конфигурации при изменении сертификатов. Я вижу, что Envoy Proxy поддерживает горячий перезапуск, но я не вижу команды аналогично nginx для горячего перезапуска.

Есть hot-restarter.py, но он не является наблюдателем за файлами, и я бы предпочел не устанавливать python на envoyproxy / envoy: последний образ докера. Я подумал, что некоторые функции этой программы могут быть встроены в приложение Rust, которое также отслеживает файлы, но для этого очень распространенного сценария должно быть что-то, что уже существует, верно?


person Cameron Taggart    schedule 04.01.2019    source источник
comment
Привет. Вы наконец нашли решение по поводу автоматической перезагрузки сертификата?   -  person Chaoxiang N    schedule 12.04.2019
comment
@ChaoxiangN Я этого не делал. Я мечтал перевести hot-restarter.py в ржавчину, но этого не произошло.   -  person Cameron Taggart    schedule 12.04.2019


Ответы (1)


Похоже, вы настраиваете (или планируете настраивать) Envoy, используя статическую конфигурацию, тогда как Envoy действительно выделяется, когда вы предоставляете ему динамически сгенерированную конфигурацию на лету. Основное различие между ними заключается в том, что у вас есть служба, которую вы настраиваете для Envoy на регулярную проверку обновлений, но то, что служба должна будет отправлять обратно, очень похоже на статическую конфигурацию.

Это то, что они называют xDS, который включает в себя различные сервисы, которые вы можете написать, которые генерируют разные части конфигурации. Эта одна служба (которую вы должны предоставить и запустить) может эффективно предоставлять все другие службы (например, службу обнаружения прослушивателя) через разные конечные точки, которые она предоставляет. Envoy позволяет настроить его для опроса REST-подобный API, потоковая передача gRPC или даже для просмотра файла в определенном месте (я подозреваю, что это лучший вариант для вас). На самом деле вам нужно только реализовать LDS для динамически управляемых сертификатов TLS. Остальная часть конфига может оставаться статичной.

Если вы выберете маршрут записи динамической службы, с которой Envoy консультируется для конфигурации, тогда не сложно настроить ее так, чтобы она просто считывала содержимое файлов на диске и предоставляла Envoy все, что там находит. Для этого вы можете просто указать встроенный строковый источник данных для Общий объект контекста TLS. Если у вас нет тысяч сертификатов и слушателей, тело ответа не приблизится к вашим пределам пропускной способности / памяти.

Признаюсь, я исчерпал время, которое мог позволить себе начать работу с Envoy, пытаясь интерпретировать их обширную машинно-ориентированную документацию, поэтому в конечном итоге я остановился на HTTP-сервисе с опросом для нашей конфигурации. Даже с опросом каждые несколько секунд это единственный реальный трафик, поэтому его довольно легко настроить и продолжить. Я расскажу об этом подходе, поскольку он мне наиболее знаком. Вы могли начать с чего-то вроде статического примера, но все, что вам нужно сделать, чтобы сделать его более динамичным, - это перейти на динамическая конфигурация чуть ниже. Просто замените REST на gRPC, так как это немного проще, и реализуйте конечные точки REST описаны ниже. Это требует небольшого количества проб и ошибок, но хороший способ начать - просто заставить службу возвращать JSON-версию конфигурации, которую вы уже используете. Одна ошибка, на которую следует обратить внимание, заключается в том, что вам нужно добавить ключи "type" и "version" в объект JSON верхнего уровня, который ссылается на прототип того типа вещи, которую вы возвращаете, то есть ответ на службу LDS может выглядеть следующим образом:

{
    "version_info": "0",
    "resources": [{
        "@type": "type.googleapis.com/envoy.api.v2.Listener",
        "name": "http_listener",
        "address": "{...}",
        "filter_chains": [{
            "filters": [
                "{...}"
            ]
        }]
    }]
}

Это оказалось не так просто, как я надеялся начать работать с Python. У них есть довольно хороший пример в Go сервера xDS, который использует gRPC, но это не помогло мне почти так сильно, как просмотр некоторых других попыток реализации xDS сервер, который я нашел на Github. Этот проект был для меня особенно полезным. Также мне еще предстоит столкнуться с чем-либо, что действительно потребовало бы горячего перезапуска, если вы уже динамически настраиваете envoy, кроме стабильных вещей, таких как идентификаторы кластера самого экземпляра Envoy.

person jeteon    schedule 09.09.2019