Как эффективно использовать Kubernetes для 2 удаленных узлов

#docker #ssl #kubernetes #networking #certbot

#docker #ssl #kubernetes #сеть #certbot

Вопрос:

Я так долго хочу перенести все свои операции на K8S, но все еще сомневаюсь в этом. Этот вопрос, вероятно, будет широким, но потерпите меня. Позвольте мне сначала описать существующую систему.

У меня размещено много разных веб-сайтов (> 30). Многое из этого для моих собственных экспериментов, но некоторые для реальных клиентов. У меня есть 1 виртуальная машина в Нью-Йорке (я использую DigitalOcean) с несколькими контейнерами Docker, которыми часто управляют с помощью docker-compose . Для каждого сайта есть 1 контейнер. Сначала запрос поступает в front контейнер под управлением HAProxy. Это удаляет SSL, а затем перенаправляет запрос на 2 proxy контейнера, в которых работает Nginx. Затем эти 2 контейнера пересылают запрос всем другим контейнерам для их обслуживания. Все мои сертификаты поступают из LetsEncrypt и должны обновляться каждые 3 месяца. Для этого я останавливаюсь front , запускаю certbot --apache , чтобы он привязался к порту 80. Он получает сертификаты, затем я останавливаю apache, затем воссоздаю front контейнер.

Есть несколько причин, почему я делаю это таким образом:

  • Я часто меняю конфигурации сайта и то, как все они соединены вместе. front Ожидается, что So будет работать вечно, если я не получаю сертификаты, и proxy ожидается, что s сильно изменится. Я меняю proxy изображение, затем останавливаю и воссоздаю 1-й контейнер, затем останавливаю и воссоздаю 2-й контейнер, так что простоев вообще не будет.
  • Я действительно не знаю, как получить сертификаты при наличии нескольких узлов. На самом деле, я полный новичок во всем, что касается сертификатов, и LetsEncrypt это практически единственный известный мне способ сделать это.
  • Я хочу напрямую редактировать файлы на удаленном сервере. У меня плохая практика прямого редактирования производственного кода, главным образом потому, что я теряю терпение при настройке сред разработки, промежуточной и производственной. Это занимает слишком много времени, и выигрыш кажется небольшим. Что касается клиентов, то это, как правило, небольшие предприятия с числом сотрудников менее 10, и они регулярно хотят внести некоторые эстетические изменения в веб-сайты. Я могу провести с ними видеовызов, они точно сообщают мне, что они хотят, я кодирую это, оно немедленно загружается на сервер, и они сразу видят изменения. Затем они могут критиковать дизайн, и мы можем выполнять итерации взад и вперед. Если бы я настраивал разные среды, они не могли бы сразу это увидеть, и должен быть долгий процесс перехода к git, развертывания на промежуточный этап, а затем на производство. Это занимает много времени, и я не думаю, что это оправдано.

Я понимаю, что мои системы не так хорошо поддерживаются. Изображения не получают обновлений безопасности, я не знаю, работают ли они все еще или нет, если я не проверю их вручную, что утомительно, поэтому я их вообще не делаю. Кроме того, у меня азиатское происхождение, а это значит, что у меня есть клиенты как из США, так и из Азии, что в значительной степени максимально удалено друг от друга, что значительно увеличивает задержку. Это означает, что клиенту в Азии приходится ждать около 1-2 секунд, чтобы страница действительно загрузилась, что является вечным. На прошлой неделе я также переехал в Азию, так что теперь доступ к нью-йоркскому серверу через ssh невероятно медленный, и моя производительность просто падает. Так что сейчас, возможно, самое время все обновить и перейти на K8S раз и навсегда. Однако в процессе планирования есть серьезные проблемы, и в настоящее время в K8S, похоже, не хватает многого, что для меня просто прерывает сделку. Поэтому, пожалуйста, критикуйте мои планы и улучшайте их, как считаете нужным.

Сейчас я планирую сделать следующее: будет 2 сервера, 1 в Нью-Йорке, 1 в Сингапуре. Эти 2 сервера будут иметь 2 разных IP-адреса. На этих 2 будут запущены модули K8S. Желательно, чтобы у них были одинаковые конфигурации, контейнеры веб-сайтов, контейнеры баз данных и т. Д. Затем для каждой записи DNS веб-сайта я изменю записи A и AAAA так, чтобы они содержали 2 IP-адреса для 2 серверов.

Мой вопрос:

  1. Будет ли DNS всегда перенаправляться в Сингапур, если пользователь находится в Китае, и всегда перенаправляться в Нью-Йорк, если пользователь находится в Англии?
  2. Как на самом деле получить сертификаты для 2 узлов? Насколько я понимаю, когда certbot выдает сертификат, он связывает доменное имя с IP-адресом узла. Это означает, что 2 узла не могут иметь один и тот же сертификат для одного и того же доменного имени. Правильно ли это? Если вы можете получить сертификаты для 2 узлов, то как это сделать?
  3. Как синхронизировать файлы между серверами? Допустим, я редактирую дерево файлов на сингапурском сервере, я хочу, чтобы этот файл также был изменен в Нью-Йорке через несколько секунд. Для баз данных у меня может быть главная база данных в Сингапуре или Нью-Йорке, а затем подчиненные базы данных в обоих местах, которые обновляются при каждом обновлении главного узла, а подчиненные устройства могут служить базой данных с низкой задержкой для каждого сервера.
  4. Как на самом деле направлять запросы от серверов к контейнерам внутри. Изначально я планирую использовать NodePort, чтобы направлять запросы в front модули, а затем распространять запросы на другие модули, но я был убит горем, когда NodePort не может подключиться к портам ниже 30000. Единственный другой вариант, о котором я знаю, — это иметь внешнюю службу балансировки нагрузки, которая направляет трафик на 2 сервера. Но это стоит около 15 долларов США / сайт / месяц, и поскольку у меня> 30 сайтов, это обанкротит меня. У меня также может быть всего 4 сервера, 2 для кластера K8S, а 2 служат в качестве балансировщика нагрузки, который будет перенаправлять на NodePort. Будет ли этот план работать? Как здесь вообще будет работать автоматическое обновление сертификатов?

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

Ответ №1:

прочитайте свой вопрос, чтобы записать весь материал, но половина материала бесполезна.

Ответы на ваш вопрос :

  1. Можем ли мы добавить одну и ту же или несколько записей в DNS? example.com с возможностью записи несколько раз?
  2. Вам может потребоваться настроить региональный кластер K8s с региональной поддержкой входа. вы можете использовать certmanager с letsencrypt, который будет управлять вашим сертификатом на уровне LB и завершать его спереди.

    Если вы хотите использовать две виртуальные машины, поместите один LB перед обеими и установите SSL там.

  3. если вы используете K8s с модулями без состояния, прямое редактирование файла внутри контейнера невозможно. лучше управлять обновлением Github внутри, и контейнер будет развернут на обоих кластерах одновременно, для этого вы можете настроить CI / CD. Вы правы в случае настройки сервера базы данных с концепцией master slave, вы можете использовать реплики чтения.
  4. Чтобы перенаправить трафик с сервера на внутреннее приложение K8s, вы можете использовать внутренние службы LB или exposing services node ports (выше 30000, но измените целевой порт в SVC) и маршрутизировать порт, если вы хотите перенаправлять запросы на определенный порт, используя целевой порт.

тем не менее, я не понимаю «У меня также может быть всего 4 сервера, 2 для кластера K8S, а 2 служат в качестве балансировщика нагрузки, который будет перенаправлять на NodePort. Будет ли этот план работать? Как здесь вообще будет работать автоматическое продление сертификатов?» какой сервер будет впереди, а какой в бэкэнде.

Комментарии:

1. 1. Да, возможно несколько записей, но, насколько я понимаю, DNS будет выполнять циклический перебор, что означает, что пользователь в Японии будет 50% времени ездить в Нью-Йорк и 50% времени — в Сингапур. Я хочу, чтобы пользователи в Японии всегда ездили в Сингапур. Возможно ли это с DNS? Я слышал кое-что о anycast, но это довольно сложно и (может) стоить слишком дорого. Я также слышал о GEODN, но, видимо, с ними сложно иметь дело, а поддержка невелика. Так есть ли что-то еще?

2. я не уверен в этом, я с нетерпением ждал предложения маршрутизации LB на основе геолокации, если у вас есть статический контент, используйте CDN.

Ответ №2:

Если все ваши сервисы являются веб-сайтами (запускаются через http), вы можете использовать k8s ingress для маршрутизации трафика в модули на основе заголовка хоста (доменное имя) и использовать только один LB с одним IP-адресом. Самым популярным входным контроллером, по-видимому, является входной контроллер Nginx

Если вы не хотите использовать LB, вы можете использовать hostPort для доступа к nginx, но как только у вас есть кластер k8s с более чем одним узлом, используйте LB, потому что hostPort обычно не рекомендуется использовать, если у вас нет очень веских причин для этого.

Говоря о DNS, вы можете использовать sth, такие как политики маршрутизации AWS route53, для маршрутизации местоположения. Вам не обязательно использовать AWS. Я просто хочу показать вам, что есть решения этой проблемы, но используйте все, что вам нравится.

Для сертификатов используйте cetrmanager с вызовом DNS-01. Из документов letsencrypt о вызове DNS-01:

  • Он хорошо работает, даже если у вас несколько веб-серверов.

cetrmanager также будет обрабатывать обновление сертификата для вас.

О синхронизации файлов между серверами; Это зависит от файлов, но для статического содержимого лучше всего использовать CDN, который будет реплицировать содержимое из одного источника в другие места.

Для одновременного развертывания в 2 отдельных кластерах вы можете использовать некоторый конвейер CI / CD, например, действия github.