Люди, которые делают программное обеспечение: «Хороший опыт работы принесет вам хорошие результаты».
С августа по октябрь 2023 года я потратил 3 месяца на самостоятельное изучение docker и k8. Пройдя через множество ловушек, 22 октября я наконец развернул веб-приложение списка покупок с интерфейсом vue.js 3, серверной частью Spring Boot и базой данных Postgres в сервисном облаке Azure K8s, и оно работало нормально.
Причина, по которой я говорю, что я наступил на все ловушки, заключается в том, что все примеры развертывания веб-приложений k8, опубликованные в Интернете, развертывают веб-сервис. Хотя пример входного контроллера nginx включает в себя два микросервиса, в этом сценарии веб-микросервиса, где запросы распределяются по двум мирам hello на основе настроек пути, между двумя микросервисами нет интерфейсной и серверной частей. Кроме того, как решить проблему совместного использования ресурсов CORS между внешними и внешними системами, я не могу найти никакой прямой информации в сценарии веб-приложения, где передняя и задняя части разделены, как у меня, поэтому я могу только изучить это. сам.
После того, как я выбрался из ямы, я готов написать серию статей, посвященных предотвращению ямы, чтобы поделиться со всеми. Хотя я не знаю, захотят ли это читать мои друзья, мне очень хочется превратить эту серию статей в лучшие статьи в Интернете о начале работы с docker и k8s на практических примерах и обновлять их хотя бы раз в год. .
Целевыми читателями этой серии статей являются разработчики программного обеспечения, которые не знакомы с docker или k8s, включая не только программистов, которые часто пишут код, но также инженеров по тестированию, а также инженеров по эксплуатации и техническому обслуживанию, которые не часто пишут код, как показано на рисунке 1. .
Какие болевые точки разработчиков программного обеспечения могут решить K8s и Docker? Вот почему я потратил так много времени на написание этой серии статей. Потому что k8s и Docker позволяют нам, разработчикам программного обеспечения, улучшить процесс разработки программного обеспечения.
«Хороший опыт работы принесет вам хорошие результаты».
Подумайте о следующих предложениях, которые часто произносят те из нас, кто занимается разработкой программного обеспечения.
«У меня все работает нормально, почему у вас не работает?»docker Image может упаковать все зависимые библиотеки кода вместе и позволить коду работать независимо в контейнере. Таким образом, вы можете понять, что образ, который вы тестируете в тестовой среде, — это тот же образ, который вы развертываете в производственной среде, что может в значительной степени решить проблему, связанную с тем, что он может работать здесь и не может работать там из-за различий в зависимых библиотеки в разных средах.
«Кто изменил конфигурацию, не сказав всем?»Dockerиk8sОба подчеркивают инфраструктуру как код,То есть конфигурация не выполняется разработчиком программного обеспечения вручную.,Вместо этого он полагается на написание файлов конфигурации, имеющих тот же статус, что и код.,Пройти командную проверку кода,Сохранить в репозиторий,и позвольте машине сделать это. Это позволяет широко рекламировать изменения конфигурации.,Выполнение конфигурации хорошо документировано. Машинам также легко читать,Автоматическое исполнение,Нет необходимости вручную вводить одну и ту же команду снова и снова.
«Тестовая среда слишком мала, чтобы стоять в очереди».Понятноместный докер Compose, разработчики программного обеспечения могут воспользоваться его небольшим объемом памяти и высокой скоростью работы для использования Docker на локальном компьютере. метод изображения, который в максимальной степени имитирует производственную среду и тестирует выпускаемое программное обеспечение без необходимости ждать в очереди в общую тестовую среду компании. Это позволяет обнаруживать ошибки раньше и снижает затраты на доработку, вызванную поздним обнаружением. Аналогично, предприятия, которые используют облачные кластеры k8s внутри себя, также могут использовать мультитенантные характеристики облака для быстрого выделения тестовых сред разработчикам программного обеспечения, которым нужна тестовая среда, тем самым решая проблему небольшого количества тестовых сред.
Видно, что Docker и k8s могут дать нам, разработчикам программного обеспечения, лучший опыт работы, и хорошие вещи будут происходить легче.
«Зачем выбирать веб-приложение «Список покупок» в качестве примера проекта?» Этот пример основан на примере приложения со списком дел, который я узнал, когда самостоятельно изучал vue.js, как показано на рисунке 2. Я превратил список дел в список покупок. Функции обоих аналогичны: оба предоставляют пользователям список заметок и имеют веб-интерфейс для добавления, удаления, изменения и проверки. Это легко понять. Кроме того, этот образец может представлять типичную архитектуру веб-приложения с отдельными интерфейсной и серверной частью. Кроме того, в этом примере могут быть показаны минимальные зависимости между облачными микрослужбами. Например, интерфейсная микрослужба зависит от внутренней микрослужбы, а серверная микрослужба зависит от микрослужбы базы данных. Это облегчает изучение того, как использовать новые экспериментальные инструменты внедрения ошибок в практике хаос-инжиниринга.
«Я не знаком с Java и vue.js. Могу ли я понять эту серию статей?» Да. Поскольку кодовое нейминг в статье достаточно выразительный, его можно понять с первого взгляда. Кроме того, эта серия статей не предполагает специального программирования фронтенда и бэкэнда, а посвящена тому, как использовать docker для преобразования разработанного кода в образ и развертывания его в локальных docker Compose и облачных кластерах k8s. Они имеют мало общего с языками программирования, используемыми во фронтенде и бэкэнде, поэтому содержание этой статьи применимо ко всем стекам технологий веб-приложений, использующих протокол JSON/HTTP и имеющих отдельный фронтенд. и бэкэнд.
«Я не умею программировать, смогу ли я понять эту серию статей?» Да. Поскольку статья не включает в себя кодирование функций внешнего и внутреннего интерфейса, а в основном предполагает использование файлов конфигурации и инструментов командной строки, она подходит для чтения программистам, инженерам по тестированию, а также инженерам по эксплуатации и техническому обслуживанию.
«Я занимаюсь тестированием или эксплуатацией и обслуживанием. Нужно ли мне запускать его в локальной среде разработки, как описано в статье?» Да. Потому что в процессе обхода ошибок, описанных в этой статье, вы обнаружите, что в предыдущем коде есть проблема с настройкой. Когда вам нужно изменить конфигурацию в исходном коде и пересобрать образ докера, вам нужно знать, как это сделать.
В первой статье этой серии статей будут представлены три версии для трех операционных систем: macOS, Windows10 и Ubuntu.
Эту серию статей можно разделить на три части. Названия этих трех статей следующие:
Одно из серии руководств, позволяющих избежать ошибок при развертывании веб-приложений K8 с отдельными интерфейсной и серверной частью: запуск приложений списка покупок в локальной среде разработки, локальное создание докера и облачный кластер k8s (написано отдельно для macOS/Windows10/Ubuntu). -2023 версия)
Часть 2 из серии руководств, позволяющих избежать ошибок при развертывании веб-приложений K8 с разделением клиентской и серверной части: интерпретация файлов Dockerfile приложения списка покупок и файлов docker-compose.yml.
Третье руководство из серии о том, как избежать ошибок при развертывании веб-приложений K8s с разделением клиентской и внутренней частей: Интерпретация файлов развертывания, обслуживания и входных конфигурационных файлов k8s для приложений списков покупок.
Исходный код этой серии руководств можно скачать здесь.:https://github.com/wubin28/shopping-list-web-app。
Чтобы найти последнюю версию этой серии статей, вы можете выполнить поиск по столбцу «Улучшенное программное обеспечение».
Обратите внимание, что эта статья состоит из тринадцати тысяч слов. Поделились 8 руководствами по предотвращению ловушек. Вам нужно держать Mac, чтобы читать и практиковаться одновременно. У меня нет решимости продолжать. Входите осторожно.
Веб-приложение, выбранное для этой серии статей, представляет собой веб-приложение со списком покупок. Его пользователи — клиенты с потребностями в покупках. Однажды Сяо Ву обнаружил, что вода в бутылках дома почти закончилась, поэтому он подумал о том, чтобы купить несколько бутылок, проходя мимо супермаркета вечером после работы. Но затем босс пришел в WeChat, чтобы пригласить его на встречу. Он быстро забыл о покупке бутилированной воды. Проходя мимо супермаркета после работы, он пошел купить шоколадные конфеты со скидкой для своей жены. Когда я пришел домой и захотел попить воды, я обнаружил, что не купил воды. Наше веб-приложение со списком покупок может решить вышеуказанные проблемы для Xiaowu. Когда он хочет купить воду, он может сразу же добавить товар для покупки воды в приложение. Через некоторое время мне захотелось купить еще бананов, поэтому я добавил еще один. Добравшись до супермаркета, он еще раз проверит список, чтобы не забыть, что хочет купить.
Теперь у нас есть исходный код для этой серии руководств. Как его развернуть на k8s?
Его можно разделить на три этапа:
Первый шаг — запустить его в локальной среде разработки;
Второй шаг — запустить его в локальном Docker Compose;
Третий шаг — запустить его в облачном кластере k8s.
Почему его нельзя развернуть прямо из исходного кода на k8s за один раз? Конечно, вы можете это сделать, но предполагается, что вы уверены, что после развертывания в будущем больше не будет новых требований или исправлений ошибок для изменения исходного кода и повторного развертывания. Как вы думаете, возможно ли это на тернистом пути обучения Docker и K8s?
Поэтому вам нужно знать, как отлаживать измененный код в локальной среде разработки, когда приходят новые требования или необходимо исправить ошибки. Это первый этап самотестирования. В конце концов, локальный компьютер — это ваша территория. Отладка программ на локальном компьютере гораздо удобнее, чем в облачном кластере k8w. В этом смысл первого шага.
После этого вам нужно знать, как собрать код, прошедший первый этап самотестирования, в образ Docker, запустить его в локальной компоновке Docker, а затем выполнить второй этап самотестирования для развертывания образа Docker на k8s. . В конце концов, локальный docker-compose тоже находится на вашей территории. В этом смысл второго шага.
Наконец, вам нужно знать, как развернуть образ Docker, прошедший второй этап самотестирования, в облачном кластере k8s и запустить его, а затем выполнить третий этап самотестирования для развертывания в производственном облачном кластере k8s. среда. Для облачного кластера k8s этого проекта я выбрал службу Microsoft azure k8s, которая предоставляется бесплатно в течение одного месяца. Это тоже моя территория. Самотестирование здесь будет гораздо удобнее, чем в среде производственного облачного кластера k8s на территории группы эксплуатации и обслуживания. В этом значение третьего шага.
2.3.1 Архитектура в местной среде разработки
Shopping List Web Архитектура приложения в локальной среде разработки, если используется c4. model(https://c4model.com/)Законченная картина,Как показано на рисунке 3 и рисунке 4.
На рисунке 3 представлена контекстная диаграмма, стоящая на границе всего веб-приложения и смотрящая наружу. Вне системы есть два пользователя: пользователь и администратор. Пользователь использует систему для управления списками покупок. Администратор использует систему для управления данными списка покупок.
На рис. 4 показана диаграмма контейнера, стоящая на границе всего веб-приложения и смотрящая внутрь. В системе имеется 4 контейнера. Обратите внимание, что концепция контейнера в модели c4 отличается от концепции контейнера в Docker. Первый представляет приложение или систему хранения данных, работающую на диаграмме архитектуры, а второй представляет собой программный модуль, который инкапсулирует все коды и зависимые библиотеки и может работать независимо. Пользователь просматривает и изменяет список покупок через внешний интерфейс списка покупок. Внешний интерфейс списка покупок отправляет запрос пользователя на операцию со списком покупок во внутренний API списка покупок. Затем серверный API списка покупок обращается к базе данных Postgres для запроса и обновления данных. Администратор напрямую управляет данными в базе данных postgres с помощью инструмента управления базой данных pgadmin.
2.3.2 Подготовка локальной среды разработки
Я использую Mac — Apple M1 Pro с 32 ГБ памяти. Для локального запуска Docker Compose, а также интерфейсных и серверных приложений, если intellij idea и Webstorm не включены одновременно, памяти 8G должно быть достаточно.
[Остерегайтесь ловушек! Не используйте официальный инструмент установки установочного пакета веб-сайта напрямую]
Моя предыдущая привычка при установке jdk заключалась в том, чтобы сначала определить, какую версию jdk установить, например jdk11, затем найти страницу загрузки jdk11 на официальном сайте oracle, загрузить установочный пакет для соответствующей операционной системы, а затем разархивировать или установить его. .
Но позже я обнаружил, что версия jdk обновляется очень часто. Если вы хотите использовать текущую основную версию jdk17, вам необходимо загрузить и установить jdk17 с официального сайта, а затем вручную изменить переменные среды JAVA_HOME и PATH в ~/.zshrc или ~/.bashrc. Таким образом вы можете переключиться с jdk11 на jdk17. Если у вас старый проект и вам нужно использовать jdk11, вам придется вручную изменить переменные среды. Это так утомительно.
Для таких инструментов, как git, хотя версии обновляются не так часто, если вы также загрузите установочный пакет с официального сайта, подождите несколько месяцев и захотите обновить версию, вы часто забудете, как его установить в первую очередь, что затрудняет его удаление и установку.
Поэтому для таких инструментов, как jdk, node.js и даже git, обычно не рекомендуется загружать и устанавливать установочный пакет непосредственно с официального сайта. Вместо этого используйте для его установки популярный менеджер пакетов. Это делает его намного более удобным, когда вы хотите переключаться между разными версиями одного и того же инструмента, обновлять его и удалять.
Если вы установили git, jdk и node.js/npm в macOS напрямую, используя официальный установочный пакет веб-сайта, без использования менеджера пакетов, рекомендуется сначала попытаться удалить их, а затем использовать следующий менеджер пакетов для установки. В противном случае вы рискуете столкнуться со всевозможными проблемами, вызванными версиями инструментов, отличными от той, которую я использую. Версия инструмента, которую я описываю ниже, была протестирована мной.
Используйте доморощенный менеджер пакетов, чтобы установить инструмент управления версиями файлов git 2.42.0 и загрузить код этого проекта.
УстановитьhomebrewСм. метод:https://brew.sh/。Я используюhomebrewверсия4.1.16。
Установите git:`brew install git`,Видеть:https://formulae.brew.sh/formula/git。
Убедитесь, что git работает: выполните команду `git -v`. Я использую версию git — 2.42.0.
Код загрузки: запустите `git clone https://github.com/wubin28/shopping-list-web-app.git`,Вы можете загрузить код в папку проекта «shopping-list-web-app».
С этого момента мы будем называть `shopping-list-web-app` *папку проекта*.
Войдите в эту папку и выполните команду `ls -alF`. Вы увидите, что в этой папке есть 3 подпапки.
drwx------ 15 binwu staff 480 Oct 23 16:22 back-end/
drwx------ 23 binwu staff 736 Oct 23 13:47 front-end/
drwx------ 3 binwu staff 96 Oct 23 08:27 infrastructure/
в,
В папке инфраструктуры хранятся файлы конфигурации для запуска docker compose и k8s, например docker-compose.yml.
серверная часть хранит внутренний код, внутренний Dockerfile и другие файлы конфигурации.
front-end хранит код внешнего интерфейса, Dockerfile внешнего интерфейса и другие файлы конфигурации.
Dockerfile — это файл конфигурации, используемый для сборки исходного кода в образ Docker для развертывания в контейнере.
Используйте диспетчер пакетов sdkman, чтобы установить инструмент разработки серверной части jdk 17.0.8.1-tem для локальных сборок серверной части.
УстановитьsdkmanСм. метод:https://sdkman.io/install。Я используюsdkmanизверсияscript: 5.18.2,native: 0.4.2。
Установите jdk: `sdk install java`.
Проверьте установленную версию jdk: `sdk list java`.
Используйте установленную версию jdk: `sdk use java 17.0.8.1-tem`,Видеть:https://sdkman.io/usage。
Убедитесь, что jdk работает: `java -version`. Я использую версию jdk openjdk «17.0.8.1» от 24 августа 2023 г.
Используйте менеджер пакетов nvm для установки инструментов внешнего интерфейса node.js и npm для локальных сборок внешнего интерфейса.
УстановитьnvmСм. метод:https://github.com/nvm-sh/nvm。Я используюnvmверсия0.39.5。
Установите node.js/npm: `nvm install --lts`.
Убедитесь, что интерфейсный инструмент node.js работает: `node -v`. Я использую версию node.js — v18.18.0.
Убедитесь, что инструмент внешней сборки npm работает: `npm -v`. Я использую версию npm 9.8.1.
Установите рабочий стол Docker для запуска базы данных Postgres и ее инструментов управления в режиме контейнера.
Видеть:https://docs.docker.com/desktop/install/mac-install/。Я используюdocker desktop for Версия macOS — v4.24.2.
Проверьте, работает ли рабочий стол Docker: посмотрите, может ли рабочий стол Docker запускаться нормально.
2.3.3 Запуск веб-приложения списка покупок в локальной среде разработки
Запустить рабочий стол докера
Запустите базу данных postgres в контейнере и pgadmin, который сможет просматривать данные в базе данных для запуска сборок и тестов Gradle в локальной среде разработки.
[Остерегайтесь ловушек! Не используйте официальный установочный пакет веб-сайта для установки базы данных и инструментов управления]
При внедрении новых функций и исправлении ошибок,Если вы можете запустить базу данных и инструменты управления базами данных локально,Вы можете легко провести самотестирование. Конечно, вы можете скачать установочный пакет базы данных и средств управления с официального сайта.,Установите на свой локальный компьютер. Но это похоже на установку jdk раньше,Удалите или обновите в будущем,Это будет более хлопотно. В эпоху контейнеризации,Если вы хотите использовать базу данных и инструменты ее управления,Вы можете полностью начать сhttp://hub.docker.com(позвони еще разDocker хаб), скачайте докер базы данных и инструменты управления файл изображения, а затем с помощью простой однострочной команды на локальном компьютере запустите соответствующий контейнер для использования базы данных и ее инструментов управления. Удаление или обновление в будущем — это просто запуск однострочной команды, что очень удобно.
Некоторые люди могут спросить: если база данных запускается в контейнере, если контейнер закрыть или удалить, не будут ли потеряны данные? На самом деле, не волнуйтесь: вы можете настроить том на локальном жестком диске для контейнера базы данных для хранения постоянных данных. Пока вы не удалите этот том, вы все равно сможете получить предыдущие данные после закрытия и перезапуска контейнера базы данных.
Чтобы запустить веб-приложение списка покупок в локальной среде разработки, необходимо сначала запустить базу данных postgres и инструмент управления pgadmin. Потому что, когда серверное приложение позже будет создано с использованием gradle, оно будет запускать автоматические тесты и ему потребуется доступ к базе данных. Если база данных postgres не запускается при сборке серверного приложения, сборка Gradle завершится неудачно.
Чтобы запустить эти два контейнера, вам необходимо скачать код. В терминале локального компьютера войдите в папку проекта и выполните команду «cd Infrastructure», чтобы войти в эту подпапку. Затем запустите команду docker compose up postgres pgadmin, чтобы запустить базу данных postgres и инструмент управления pgadmin. Эта команда прочитает службы postgres и pgadmin в файле docker-compose.yml в текущей папке и запустит их. Я объясню файл docker-compose.yml во второй статье серии.
Проверьте контейнер: в интерфейсе контейнера рабочего стола Docker вы можете увидеть два работающих контейнера, как показано на рисунке 5.
Проверьте базу данных:
Откройте браузер, чтобы получить доступ к ссылке на инструмент управления базой данных pdadmin `http://localhost:5050/`, имя пользователя: admin@gmail.com, пароль: admin@gmail.com. Это имя пользователя и пароль задаются в службе pdadmin в файле docker-compose.yml.
Щелкните правой кнопкой мыши Серверы -> Register -> Server… -> Имя в целом: Просто напишите что-нибудь, например список покупок. -> Хост на связи name/address: postgres -> Port: 5432 -> Maintenance database: postgres -> Username: postgres -> Password: postgres -> Разрешить Сохранить password -> Нажмите кнопку «Сохранить». -> Нажмите на сервер списка покупок, который вы только что создали, чтобы просмотреть данные в базе данных в случае возникновения проблемы с базой данных, как показано на рисунке 6. Имя пользователя и пароль здесь также задаются в службе postgres в файле docker-compose.yml.
Запустите серверное приложение в локальной среде разработки.
Снова откройте терминал, войдите в папку проекта, а затем введите папку внутреннего кода: `cd back-end`. Запустите серверное приложение: `./gradlew bootRun`.
Проверьте серверное приложение: откройте браузер и посетите http://localhost:8081/swagger-ui.html. Если вы видите страницу определения OpenAPI, это означает, что серверная часть запущена. Вы можете попробовать интерфейс `GET /api/v1/shopping-items` на этой странице. Он должен вернуть пустую запись `[]`.
Запустите интерфейсное приложение в локальной среде разработки.
Снова откройте терминал, войдите в папку проекта, а затем введите папку с кодом внешнего интерфейса: `cd front-end`. Сначала запустите команду npm install, чтобы установить зависимые библиотеки, установленные в файле package.json.
Только после установки зависимых библиотек вы можете запустить команду npm run dev, чтобы запустить интерфейсное приложение. После этого на экране появится сообщение типа «Local: http://localhost:5173/».
Проверьте интерфейсное приложение: откройте браузер и посетите http://localhost:5173, вы увидите страницу ShoppingList. Введите «банан» в поле ввода «Элемент» и нажмите кнопку «Добавить». Что произойдет? «банан» не отображается в списке ниже!
[Остерегайтесь ловушек! Проблема CORS не позволяет интерфейсу получить доступ к серверу]
Почему я не могу вставить данные сейчас? Вы можете использовать сочетание клавиш Cmd+Option+I, чтобы открыть интерфейс инструментов разработчика. На вкладке «Консоль сети» вы можете увидеть сообщение об ошибке CORS «Доступ к XMLHttpRequest по адресу «http://localhost:8081/api». появляется, когда внешний интерфейс обращается к серверной части. /v1/shopping-items» из источника «http://localhost:5173» заблокирован политикой CORS: нет «Access-Control-Allow-Origin». заголовок присутствует в запрошенном ресурсе.`
CORS (Cross-Origin Resource Sharing) — это настройка безопасности браузера. Если серверное приложение настроено с использованием CORS, то серверное приложение может сообщить браузеру: «Хотя запрос на доступ ко мне исходит от внешнего приложения, я доверяю ему, поэтому вы можете безопасно загружать и отображать информацию. Я предоставил.» Таким образом, браузер может плавно отображать данные, полученные интерфейсным приложением, обращающимся к серверному приложению. Приведенное выше сообщение об ошибке указывает на то, что пользователь получил доступ к информации в URL-адресе внутреннего приложения (http://localhost:8081) из URL-адреса внешнего приложения (http://localhost:5173), но был перехвачен браузером. . Это показывает, что серверное приложение не настроило разрешения, специфичные для CORS, чтобы сообщить браузеру: «Этот запрос от внешнего интерфейса разрешен, и вы можете принять его с уверенностью».
Как проверить конфигурацию CORS серверного приложения? В настоящее время вы можете просмотреть файл ShoppingListApplicationConfig.java в папке back-end/src/main/java/com/wuzhenben/shoppinglist внутреннего кода. `allowedOrigins("http://localhost:8080")` этого файла позволяет серверному приложению разрешить интерфейсному приложению доступ к нему из источника `http://localhost:8080`. Для других источников браузер сообщит пользователю указанную выше ошибку CORS и откажет в доступе.
Что нам следует сделать, чтобы решить эту проблему в настоящее время? Теперь, когда серверная часть разрешила внешнему приложению доступ из источника `http://localhost:8080`, будет ли проблема решена, если внешний интерфейс будет запущен на порту 8080?
На этом этапе вы можете нажать Ctrl+C, чтобы завершить работу внешнего приложения. Затем выполните следующую команду, чтобы запустить интерфейсное приложение на порту 8080: `npm run dev -- --port 8080`. На экране появится приглашение «Локальный: http://localhost:8080/».
Еще раз проверьте интерфейсное приложение: откройте браузер и посетите `http://localhost:8080`, снова введите «банан» в поле ввода «Элемент» и нажмите кнопку «Добавить». И действительно, в списке ниже появляется «банан»! Вы также можете попробовать нажать кнопку-переключатель справа от банана, чтобы установить этот товар как купленный, или нажать кнопку «Удалить», чтобы удалить этот товар.
В настоящее время вы также можете использовать сочетание клавиш Cmd+Option+I, чтобы открыть интерфейс инструментов разработчика. На вкладке «Консоль сети» вы не увидите никаких сообщений об ошибках.
Вы также можете использовать браузер для доступа к `http://localhost:5050/` и использовать ранее настроенный инструмент управления базой данных pgadmin, чтобы проверить, хранятся ли элементы покупок, которые вы добавили во внешнем приложении, в базе данных ShoppingList.
[Остерегайтесь ловушек! Конфигурация рабочего стола Docker в Kubernetes вызовет проблемы]
Однажды я использовал описанные выше шаги, чтобы запустить интерфейсное приложение на порту 8080. Но когда браузер открывается для доступа к `http://localhost:8080`, передняя часть не может получить доступ к внутренней части. Откройте «Разработчик» в браузере Chrome. Просмотрев Инструменты, я обнаружил, что консоль в сети сообщила о следующей ошибке: `Доступ to XMLHttpRequest at 'http://shopping-list-api-ingress:8081/api/v1/shopping-items' from origin 'http://localhost:8080' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested ресурс.`. Похоже, еще одна проблема с CORS.
Я хочу попробовать, работает ли конфигурация CORS на серверной части. Поэтому я ввел команду `fetch("http://localhost:8081/api/v1/shopping-items").then(a => a.text()).then(console.log)`, чтобы получить все данные о покупках из серверного приложения. Оказывается, их можно получить, и возвращаемый результат — `[{"id":1. ,"item":"а банан","purchased":true}]`. Поскольку я запустил команду выборки из консоли страницы `http://localhost:8080`, это объясняет настройку CORS в классе `ShoppingListApplicationConfig` back- конечный код. Это сработало.
Так что же именно вызывает проблему CORS? Внимательно прочитайте сообщение об ошибке,Допустим, запрос поступает из внешнего интерфейса,Чтобы получить доступ к бэкэнду`http://shopping-list-api-ingress:8081/api/v1/shopping-items`путь к интерфейсу,Возникла проблема CORS. Но путь внутреннего интерфейса явно `http://localhost:8081/api/v1/shopping-items`. Что происходит? кроме того,в моем коде,Не существует такой строки, как «shopping-list-api-ingress». Тогда почему интерфейсное приложение обращается к серверному приложению?,но используется`http://shopping-list-api-ingress:8081/api/v1/shopping-items`Такой странный путь?
Вспомнив это внимательно, я вспомнил, что два дня назад попробовал функцию кластера kubernetes (сокращенно k8s) локального компьютера в Docker Desktop и настроил в нем входную конфигурацию с именем `shopping-list-api-ingress`. Объяснение ингресса см. в 2.5.2 настоящей статьи.
Похоже, что внешний интерфейс использует этот вход при доступе к серверной части, вызывая ошибку CORS. Если я отключу Kubernetes на рабочем столе Docker, все будет в порядке? Поэтому в настройках рабочего стола Docker выберите Kubernetes, снимите флажок с параметра «Включить Kubernetes» и перезапустите рабочий стол Docker. Это удаляет вход. На всякий случай очистите кеш браузера. Посетите интерфейс еще раз. Всё хорошо!
если вам интересно,Вы можете использовать Insomnia или Postman для проверки внутреннего интерфейса приложения. В коде, который был клонирован ранее,Существует файл Insomnia_2023-10-06.json.,Может УстановитьInsomnia(Видеть:https://insomnia.rest/),Создать коллекцию,И импортируйте этот файл внутрь, чтобы проверить интерфейс внутреннего приложения. По сравнению с почтальоном,Insomnia более легкая и ее проще использовать новичкам.
На этом этапе веб-приложение списка покупок запущено в локальной среде разработки.
Очистить сцену
Если нет Очистить Вероятно, постоянная работа двух контейнеров и двух служб требует немного больше ресурсов памяти. На этом этапе вы можете запускать местный интерфейс на переднем конце, на заднем конце и докер В интерфейсе терминала команды создания нажмите Ctrl+C, чтобы завершить работу этих трех программ. Наконец запустите локальный докер В интерфейсе терминала команды Compose выполните команду `docker compose down`, чтобы завершить и удалить контейнеры postgres и pgadmin и связанные сетевые ресурсы, а затем использовать docker Проверьте это в интерфейсе рабочего стола. И действительно, два контейнера исчезли.
2.4.1 Архитектура в локальном Docker Compose
Диаграмма архитектуры не изменилась, по-прежнему см. рис. 3 и рис. 4. Хотя архитектура веб-приложения «Список покупок» в локальном Docker Compose такая же, как архитектура в локальной среде разработки, метод рисования на диаграмме архитектуры модели c4 это то же самое, но на уровне реализации есть различия. Интерфейсные и серверные приложения первого работают в контейнерах докеров. Последний запускается в службах, запускаемых командами npm и gradle.
2.4.2 Подготовка локальной среды создания докера
В macOS, если установлен рабочий стол Docker, у вас будет готова локальная рабочая среда Docker Compose. Вы можете просмотреть контейнеры, запущенные с помощью Docker Compose, и соответствующие изображения в интерфейсе рабочего стола Docker.
2.4.3 Запуск веб-приложения списка покупок в локальном Docker Compose
Зарегистрируйте бесплатную учетную запись Docker Hub, чтобы отправлять образы Docker для подготовки к развертыванию K8s.
Docker Hub — это общедоступный центр реестра, управляемый компанией Docker, в котором хранятся образы Docker. После того, как Docker сделал контейнеризацию популярной, многие компании-разработчики программного обеспечения превратили свои программные продукты в образы Docker и разместили их в Docker Hub. Все образы postgres и pgadmin, которые вы использовали ранее, были взяты из этого центра. После регистрации учетной записи в Docker Hub вы также можете отправить созданный вами образ Docker в Docker Hub.
Каковы преимущества этого? Потому что таким образом покупки можно будет осуществлять через облачный кластер k8s. list web приложение, облачный кластер k8s можно загрузить из Docker Извлеките докер интерфейсного и серверного приложения, которое вы создали из хаба. изображение. Зарегистрируйте Докер бесплатно хаб-аккаунт,Видеть:https://hub.docker.com/。
Создайте серверный образ Docker и отправьте его в Docker Hub.
Создание внутреннего образа Docker делится на три этапа.
Первый шаг — использовать gradle для создания серверного приложения и создания пакета jar.
Преимущество сначала создания пакета jar, а затем создания образа Docker заключается в том, что образ может содержать только пакеты jar, необходимые для запуска серверной части. Это позволит сохранить файл изображения как можно меньшим.
Войдите в папку проекта и выполните команду «cd Infrastructure», чтобы войти в эту подпапку. Затем запустите команду docker compose up postgres pgadmin, чтобы запустить базу данных postgres и инструмент управления pgadmin.
Затем откройте новое окно терминала, войдите в папку проекта, запустите `cd ../back-end` и войдите во внутреннюю папку.
Запустите команду `./gradlew clean build`, чтобы создать серверное приложение. После этого вы можете найти сгенерированный jar-пакет в папке «build/libs». Имя файла — Shoppinglist-0.0.1-SNAPSHOT.jar.
Второй шаг — создание образа Docker.
Запустите команду `docker buildx build --build-arg JAR_FILE=build/libs/shoppinglist-0.0.1-SNAPSHOT.jar -t <docker-hub-username>/shopping-list-api:v1.0.docker-compose .` для создания внутреннего докера image。Может Запустите команду `docker image ls`, чтобы увидеть только что созданную версию с `v1.0.docker-compose` изображение тега.
В этой команде `docker buildx build` является расширением старой команды `docker build`, обеспечивающим кэшированный импорт и экспорт, которого нет у последней, а также функцию одновременной сборки нескольких образов.
В параметре `-t <docker-hub-username>/shopping-list-api:v1.0.docker-compose`середина,`-t` означает добавление тега к изображению. Этот тег — `v1.0.docker-compose` в параметре,используется для идентификации этогоimage。ты хочешь<docker-hub-username>Замените на свойDocker hubимя пользователя。И весь`<docker-hub-username>/shopping-list-api`,Указывает, что этот образ будет отправлен в Docker в будущем.
[Остерегайтесь ловушек! Не забудьте десятичную точку в конце команды docker buildx]
В конце приведенной выше команды есть незаметная десятичная точка. Никогда не забывайте об этом. Это означает использование текущей папки в качестве контекста сборки для поиска ресурсов сборки, таких как файлы jar.
[Остерегайтесь ловушек! Как узнать, какому коду в кодовой базе соответствует строящееся изображение? ]
Мы знаем, что код в базе кода постоянно меняется при постоянных представлениях. Если однажды в образе, который вы отправили в Docker Hub, обнаружится ошибка, вы захотите открыть соответствующий исходный код и посмотреть. Но прошло несколько дней с тех пор, как вы создали этот образ, и вы также отправили в базу кода много кода. Код, который изначально создавал это изображение, также сильно изменился. Как на этом этапе восстановить код, который изначально создал это изображение, в базе кода? Решение состоит в том, чтобы запустить указанную выше команду docker buildx. После создания образа Docker немедленно выполните команду `git tag -a v1.0.docker-compose -m "v1.0.docker-compose"`. то же имя в библиотеке git. Таким образом, идентифицировав этот тег, вы сможете сопоставить изображение с кодом. Наконец, не забудьте запустить команду «git push origin v1.0.docker-compose», чтобы отправить этот тег в удаленный репозиторий git.
Третий шаг — отправить образ Docker в Docker Hub.
Запустите команду `docker login`Войти в Docker hub。Затем Запустите команду `docker push <docker-hub-username>/shopping-list-api:v1.0.docker-compose`,Будет ли построенное изображение отправлено в Docker центр. Вы можете войти в Docker хаб, проверьте, есть ли на нем уже образ с тегом `v1.0.docker-compose` в бэкэнде.
Создайте внешний образ Docker и отправьте его в Docker Hub.
Создание внешнего образа Docker делится на два этапа.
Первым шагом является создание образа Docker.
Кто-то может спросить, почему бы сначала не использовать команду npm run build для сборки клиентского приложения? Ответ — эта команда, и она включена в файл Dockerfile внешнего интерфейса. Я объясню этот документ во второй статье.
Запустите `cd ../front-end`, введите папку внешнего интерфейса. Запустите команду `docker buildx build -t <docker-hub-username>/shopping-list-front-end:v1.0.docker-compose .` для создания внутреннего докера изображение. Интерпретация параметра здесь такая же, как упоминалось ранее. Можно Запустить команду `docker image ls`, чтобы увидеть только что созданную версию с `v1.0.docker-compose` изображение тега.
Второй шаг — отправить образ докера в хаб Docker.
Запустите команду `docker push <docker-hub-username>/shopping-list-front-end:v1.0.docker-compose`,Будет ли построенное изображение отправлено в Docker центр. Вы можете войти в Docker хаб, проверьте, существует ли уже образ с тегом `v1.0.docker-compose` во внешнем интерфейсе.
Запустите веб-приложение списка покупок в локальном Docker Compose
Докер локально Команда для запуска в Compose очень проста. Войдите в папку проекта и выполните команду `cd. инфраструктура`Войдите в подпапку инфраструктуры, затем Запустите команду `docker compose up`, чтобы запустить четыре контейнера postgres, pgadmin, Shopping-list-api и Shopping-List-Front-End. На этом этапе вы можете докерить Проверьте рабочий статус этих четырех контейнеров на рабочем столе. Вы также можете посетить http://localhost:8080/` в браузере, чтобы опробовать веб-список покупок. app。
Пока что шоппинг list web appДокер локально Это работает в режиме композиции.
Очистить сцену
Войдите в папку проекта и выполните команду `cd инфраструктура`Войдите в подпапку инфраструктуры, затем Запустите команду `docker compose down` может остановить и удалить 4 контейнера.
Существует два варианта запуска веб-приложения с отдельным интерфейсом и сервером в облачном кластере k8s.
Первый — использовать бесплатную пробную услугу, предоставляемую поставщиком облака.
Второй вариант — использовать одноузловую службу, такую как minikube, работающую на локальном компьютере.
Поскольку мне хотелось по-настоящему испытать миграцию в облако, я выбрал первый вариант.
Все крупные поставщики облачных услуг предоставят бесплатные пробные версии облачных кластеров k8s сроком от 1 до 3 месяцев. В этой статье используется служба Microsoft Azure K8s. Бесплатная пробная версия на 1 месяц, предоставляются 2 ноды. По привычке, описанной выше, в это время должна отображаться архитектура веб-приложения списка покупок в облачном кластере k8s. Но чтобы воспроизвести свои подводные камни и сделать объяснение более интересным, я планирую оставить архитектуру на конец.
2.5.1 Подготовка среды облачного кластера K8s
Зарегистрируйте учетную запись облачной платформы службы Azure k8s.
Azure k8s сервисная облачная платформа Бесплатная регистрация См. метод:https://azure.microsoft.com/。
После регистрации вы можете создать k8s с именем `my-k8s-cluster-1`. сервис и ресурс с именем my-azure-resource-group-1. group。Затем Главная страница входа в систему`https://portal.azure.com/#home`,Вы можете увидеть ресурсы, которые у вас есть,Как показано на рисунке 7.
Откройте Docker Desktop Kubernetes, чтобы kubectl мог работать правильно.
Далее вам необходимо установить инструмент kubectl для подключения к облачному кластеру k8s из macOS. Метод находится в докере На рабочем столе нажмите «Настройки», выберите «Kubernetes», а затем включите Установите флажок слева от Kubernetes. Затем нажмите «Применить». & кнопка сброса.
Убедитесь, что рабочий стол docker k8s может работать нормально: после завершения сброса вы можете увидеть небольшую горизонтальную полосу с зеленым фоном над маленьким значком кита в левом нижнем углу основного интерфейса рабочего стола docker со значком рулевого колеса k8s. это. Зеленый фон указывает на то, что Docker Desktop K8s работает нормально. Кроме того, вы можете открыть окно терминала и ввести команду `kubectl version -o yaml`. Если вы видите clientVersion и serverVersion, это означает, что команда kubectl для управления k8s может работать нормально.
Подключитесь к облачной платформе службы Azure K8s.
Хотите Подключитесь со своего Mac к облачной платформе службы Azure K8s., вам необходимо изменить файл конфигурации. Этот файл представляет собой файл конфигурации в папке ~/.kube на вашем компьютере Mac. Вы можете открыть этот файл в своем любимом редакторе. Внутри только ваш докер Кластер k8s, предоставляемый настольным компьютером, называется docker-desktop. Вам нужно подключиться к Azure k8s сервис облачной платформы, вам необходимо заменить этот файл на azure k8s Одноименный файл конфигурации сервисной облачной платформы. Или в этот файл добавьте azure k8s Настройка облачной платформы сервиса. То есть в этом файле могут быть конфигурации для нескольких кластеров k8s. На данный момент вы можете использовать команду kubectl для переключения между двумя кластерами k8s. Потому что в этой статье мы не используем docker desktop k8s предоставляет локальный кластер с одним узлом, поэтому для простоты вы можете сначала создать резервную копию файла ~/.kube/config на своем Mac, а затем использовать Azure. k8s Замените его на одноименный файл конфигурации сервисной облачной платформы.
Как получить файл конфигурации облачной платформы службы Azure K8s? Суть метода заключается в том, что вам необходимо войти в свою облачную платформу службы Azure K8s в браузере. В правой части окна поиска вверху страницы находится значок облачной оболочки. Щелкните этот значок, и вы увидите интерфейс командной строки с черным фоном в нижней части экрана. Щелкните значок двух скобок {} «Открыть редактор» над интерфейсом командной строки, чтобы открыть дерево файлов слева. В дереве файлов найдите папку .kube и откройте ее, затем щелкните файл конфигурации. Содержимое этого файла появится справа. Вы копируете все содержимое этого файла, сохраняете его в конец файла `~/.kube/config` на своем компьютере Mac и удаляете исходное содержимое этого файла. Опять же, обязательно сделайте резервную копию исходного контента перед его удалением.
После изменения файла конфигурации вы сможете подключиться к облачной платформе службы Azure k8s.
Запустите команду kubectl config get-contexts, чтобы увидеть облачную платформу службы Azure k8s, к которой вы подключены.
Запустите команду kubectl get nodes, и вы увидите, что облачная платформа службы Azure k8s выделила вам два узла, и оба находятся в состоянии готовности.
2.5.2 Есть подводные камни при запуске через веб-приложение списка покупок в облачном кластере k8s
Как я наступил на капкан
При первом развертывании веб-приложения с разделением внешнего и внутреннего интерфейса на k8s наиболее естественным способом является его развертывание в соответствии с архитектурой, развернутой в Docker Compose. Но если вы так думаете, вы попали в яму. Прежде чем обсуждать подводные камни, давайте сначала посмотрим на разницу между запуском в облачном кластере k8s и локальным запуском.
Совершайте покупки в облачном кластере k8s list web app,и Докер локально Какая разница при запуске через Compose? Есть 3 отличия.
Первое отличие заключается в том, что имя хоста базы данных, от которого зависит серверное приложение, больше не является localhost, а является внутренним именем службы базы данных postgres в облачном кластере k8s. Для этого необходимо изменить файл back-end/src/main/resources/application.properties и заменить localhost на ${DB_HOST}. То есть имя службы базы данных postgres определяется с помощью переменной среды DB_HOST, установленной в файле конфигурации развертывания, представленном ниже.
Второе отличие заключается в том, что разрешенные источники в внутренней конфигурации CORS больше не являются `http://localhost:8080`, а должны быть именем внешнего домена и номером порта интерфейсного приложения в облачном кластере k8s.
Третье отличие заключается в том, что имя хоста и порт серверного приложения, от которого зависит интерфейсное приложение, больше не являются localhost:8081, а также стали именем службы серверного приложения в облачном кластере k8s. Для этого необходимо изменить 3 файла внешнего кода. Во-первых, localhost:8081 в файле front-end/src/comComponents/ShoppingList.vue необходимо изменить на %%API_URL%%. Это также делается с помощью переменной среды API_URL, установленной в файле конфигурации развертывания, представленном ниже, для определения имени службы серверного приложения. Чтобы заменить имя службы серверного приложения в js-коде, вам необходимо изменить файл front-end/Dockerfile и добавить файл front-end/entrypoint.sh.
Второе отличие — подводный камень. Как настроить разрешенные источники в внутренней конфигурации CORS для настройки имени внешнего домена и номера порта внешнего приложения в облачном кластере k8s? Я не подавал заявку на доменное имя для этого проекта. Имя домена нельзя записать как внутреннее имя службы, поскольку внутреннее имя нельзя использовать для внешнего доступа. Можете ли вы написать имя домена как IP-адрес? В облачных кластерах IP-адреса часто меняются. Это так хлопотно менять конфигурацию каждый раз при смене IP. Как выбраться из этой ямы?
На самом деле я развернул postgres, серверное API-интерфейс списка покупок и внешнее веб-приложение списка покупок в облачном кластере k8s и предоставил внешнему интерфейсу внешний IP-адрес. Оказалось, что когда я использовал браузер для доступа к порту 8080 внешнего IP-адреса внешнего интерфейса, браузер действительно сообщил об ошибке CORS: Access to XMLHttpRequest at ‘http://shopping-list-api/api/v1/shopping-items' from origin ‘http://20.72.168.185:8080’ has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resources.
Позже я проверил много информации и попросил помощи в кругу друзей. После напоминаний моих друзей и опробования я обнаружил, что настройка входа для веб-приложения списка покупок может решить эту проблему.
В k8s вход — это набор правил и конфигураций, которые могут помочь внешним сетевым запросам находить сервисы в кластере и получать к ним доступ. Думайте об этом как о регулировщике, который знает, как направлять входящие транспортные средства (сетевые запросы) на правильные парковочные места (услуги) в соответствии с определенными правилами.
2.5.3 Архитектура облачного кластера k8s
В облачном кластере k8s сложно использовать инструмент управления базой данных pgadmin. Следовательно, на диаграмме контекстной архитектуры на рисунке 8 есть только пользователь.
В нашем веб-приложении пользователи больше не имеют прямого доступа к внешнему IP-адресу и порту интерфейсного приложения, а получают прямой доступ к внешнему IP-адресу и порту входного контроллера nginx. После этого входной контроллер nginx распределит запрос пользователя во внешнее и серверное приложение в соответствии с путем запроса. Интерфейсным и серверным приложениям не обязательно иметь внешние IP-адреса и порты.
Поскольку браузер, используемый пользователем, видит только IP-адрес и порт, предоставленные входным контроллером nginx, тогда, когда интерфейсное приложение обращается к серверному приложению для получения данных, оно будет находиться под тем же IP-адресом и портом, предоставленными входным контроллером. Таким образом, для браузера не существует междоменной проблемы CORS. Как показано на рисунке 9.
2.5.4 Как выбраться из ямы
Чтобы выбраться из ямы, вам необходимо добавить файлы конфигурации развертывания, обслуживания и входа k8s, чтобы можно было использовать команду kubectl для развертывания трех микросервисов входа и постгреса, Shopping-list-api и Shopping-list-front. -конец к k8s.
Обратите внимание, что ингресс — это не микросервис, а набор правил в k8s.
Кроме того, для развертывания каждого микросервиса в k8s обычно требуются файл развертывания и файл службы. Первый используется k8s для создания модулей для этого микросервиса, а второй используется k8s для назначения стабильных IP-адресов и DNS-имен модулям этого микросервиса. Даже если экземпляр контейнера будет заменен, IP-адрес и DNS-имя не изменятся.
Pod — это самый маленький модуль, управляемый k8s. Рекомендуется запускать только один докер-контейнер, который считается микросервисом.
Для настройки входящего трафика требуется файл конфигурации входящего трафика. Поскольку в k8s необходимо настроить 3 микросервиса, необходимо добавить 3 файла развертывания и 3 служебных файла.
Кроме того, инструмент управления базой данных pgadmin, первоначально использовавшийся локально, больше не используется в облачном кластере k8s.
Список измененных файлов кода следующий:
back-end/src/main/resources/application.properties(изменять)
Back-end/src/main/ShoppingListApplicationConfig.java (изменить)
интерфейс/Dockerfile (изменение)
интерфейс/src/компоненты/ShoppingList.vue (изменить)
интерфейс/entrypoint.sh (новый)
инфраструктура/развертывание-postgres.yml(Новый)
инфраструктура/ingress.yml (новый)
инфраструктура/развертывание-shopping-list-api.yml(Новый)
инфраструктура/развертывание-shopping-list-front-end.yml(Новый)
инфраструктура/сервис-postgres.yml (новый)
инфраструктура/service-shopping-list-api.yml (новый)
инфраструктура/список-покупок-услуг-front-end.yml(Новый)
Чтобы облегчить вам бремя написания кода, я сохранил эти изменения и дополнения в ветку for-azure-k8s-service. Запустите команду git checkout for-azure-k8s-service, чтобы увидеть код после этих изменений и дополнений.
Поскольку изменения кода затрагивают серверную часть и внешний интерфейс, необходимо перестроить образы Docker серверной части и внешнего интерфейса.
Создайте серверный образ Docker и отправьте его в Docker Hub.
Сначала запустите базу данных,для запуска тестов при построении кода. Войдите в папку проекта и выполните команду «cd Infrastructure», чтобы войти в эту подпапку. Затем запустите команду docker compose up postgres pgadmin, чтобы запустить базу данных postgres и инструмент управления pgadmin.
Затем откройте новое окно терминала, войдите в папку проекта, запустите `cd ../back-end` и войдите во внутреннюю Поскольку имя хоста базы данных, от которого зависит серверное приложение, теперь изменено на переменную среды ${DB_HOST}, поэтому перед сборкой вам необходимо запустить команду `export в окне терминала. DB_HOST=localhost` для установки переменных среды.
После этого вы можете запустить команду `./gradlew clean build`, чтобы сгенерировать внутренний jar-пакет.
Затем Запустите команду `docker buildx build --build-arg JAR_FILE=build/libs/shoppinglist-0.0.1-SNAPSHOT.jar -t <docker-hub-username>/shopping-list-api:v1.1.k8s .` для создания внутреннего докера изображение. Обратите внимание, что до и до докера Compose создает изображение для различения, а тег в приведенной выше команде меняется на `v1.1.k8s`. Можно Запустить команду `docker image ls`, чтобы увидеть новую сборку с `v1.1.k8s` изображение тега.
Запустите команду `docker login`Войти в Docker hub。Затем Запустите команду `docker push <docker-hub-username>/shopping-list-api:v1.1.k8s`,Будет ли построенное изображение отправлено в Docker центр. Вы можете войти в Docker Хаб, проверьте, есть ли уже на нем изображение с тегом `v1.1.k8s` во внутреннем интерфейсе Shopping-list-api.
Создайте внешний образ Docker и отправьте его в Docker Hub.
[Остерегайтесь ловушек! Что произойдет, если вы создадите образ Mac с архитектурой Arm64 без настройки архитектуры? ]
Раньше я нажимал на докер composeСоздание внешнего докера способ изображения, для лазури k8s сервис создал интерфейсный докер изображение. Но когда я применяю файл внешнего развертывания к облачному кластеру k8s, модуль при запуске всегда сообщает о странной ошибке: exec /usr/local/bin/docker-entrypoint.sh: exec format error。
Снесите этот образ, запустите контейнер, а затем зайдите и посмотрите содержимое файла docker-entrypoint.sh, но не можете понять почему. После длительной проверки я выяснил, что причина была в том, что когда я использовал для сборки образа Mac с архитектурой Arm64, я не указал, что собираемый образ должен быть с архитектурой amd64.
Если вы используете Mac с архитектурой Arm64 для создания образа без установки архитектуры в команде, построенный образ можно использовать только в операционной системе контейнера с архитектурой Arm64. Именно поэтому я смог нормально запустить его в Docker Compose на Mac. раньше Причина, по которой контейнер образа создается без настроек архитектуры. Но ресурсы, на которые я подаю заявку в облачном кластере службы Azure k8s, обычно представляют собой контейнеры, которые могут работать только с архитектурой amd64.
Чтобы выбраться из этой дыры, нужны две вещи.
Во-первых, вам необходимо добавить следующую конфигурацию в файл ~/.docker/config.json, чтобы docker buildx мог поддерживать создание образов архитектуры amd64 на компьютерах Mac с архитектурой Arm64.
`{ "experimental": "enabled" }`
Во-вторых, в докере В команде buildx добавьте параметры для указанной архитектуры. Его можно найти в папке проекта, Запустите `cd ../front-end`, введите папку внешнего интерфейса. Запустите команду `docker buildx build --platform linux/amd64 -t <docker-hub-username>/shopping-list-front-end:v1.1.k8s.amd64 .`Приходить Создание внешнего докера image。Может Запустите команду `docker image ls`, чтобы увидеть новую сборку с `v1.1.k8s.amd64` изображение тега.Также Запустите команду `docker inspect wubin28/shopping-list-front-end:v1.1.k8s.amd64 | grep «Архитектура»`Проверьте, действительно ли это изображение является архитектурой AMD64.
Запустите команду `docker push <docker-hub-username>/shopping-list-front-end:v1.1.k8s.amd64`,Будет ли построенное изображение отправлено в Docker центр. Вы можете войти в Docker Хаб, проверь, есть ли уже на нем изображение с тегом `v1.1.k8s.amd64` во внешнем интерфейсе Shopping-list-front-end.
Настройте три микросервиса postgres, Shopping-list-api и Shopping-List-Front End, а также вход в облачный кластер k8s и запустите их.
Чтобы подключиться к службе azure k8s в терминале Mac для работы, необходимо установить инструмент azure-cli. Для установки вы можете запустить «brew update» и «brew install azure-cli». После установки вы можете запустить команду `az --version`, чтобы проверить, прошла ли установка успешно. Затем вы можете запустить az login, чтобы войти в облачную платформу службы Azure k8s.
Мы строим эту сеть в облачном кластере k8s. Лучше всего поместить все ресурсы, созданные приложением, в пространство имен для удобства управления. Если в будущем вам больше не понадобятся облачные сервисы, вам нужно будет удалить все ресурсы в пространстве имен, чтобы сэкономить деньги, для чего достаточно выполнить команду. Подробнее о том, как это сделать, читайте ниже «Очистить». сцену”。
Поскольку каждая команда обычно имеет $NAMESPACE, удобнее установить ее в переменной среды: `export NAMESPACE=shopping-list-web-app`. Затем вы можете запустить kubectl create namespace $NAMESPACE, чтобы создать это пространство имен.
Как упоминалось ранее, при установке инструментов в операционную систему лучше всего использовать менеджер пакетов. Это упрощает поддержку версий инструментов. Для операционной системы облачных вычислений k8s таким инструментом управления пакетами является helm. Мы можем использовать helm для установки ingress-nginx:
helm repo add ingress-nginx-repo https://kubernetes.github.io/ingress-nginx
helm repo update
helm install ingress-nginx-release ingress-nginx-repo/ingress-nginx \
-n $NAMESPACE \
--set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-health-probe-request-path"=/healthz
После установки вы можете запустить `helm list -n $NAMESPACE`, чтобы проверить его.
Затем вы можете использовать kubectl и выполнить следующие команды для развертывания postgres, Shopping-list-api, Shopping-List-Front-End и входа в облачный кластер k8s и обратно.
`cd ../infrastructure`
Разверните развертывание postgres: `kubectl apply -f ./deployment-postgres.yml --namespace $NAMESPACE`
Убедитесь, что изображение правильное: `kubectl get deployments -o wide -n $NAMESPACE`
Убедитесь, что модуль запускается нормально: `kubectl get pods -o wide -n $NAMESPACE`
Разверните службу postgres: `kubectl apply -f ./service-postgres.yml --namespace $NAMESPACE`
Убедитесь, что служба запускается нормально: `kubectl get services -o wide -n $NAMESPACE`
Развертывание API списка покупок: `kubectl apply -f ./deployment-shopping-list-api.yml --namespace $NAMESPACE`
Убедитесь, что изображение правильное: `kubectl get deployments -o wide -n $NAMESPACE`
Убедитесь, что модуль запускается нормально: `kubectl get pods -o wide -n $NAMESPACE`
Разверните сервис списка покупок-api: `kubectl apply -f ./service-shopping-list-api.yml --namespace $NAMESPACE`
Убедитесь, что служба запускается нормально: `kubectl get services -o wide -n $NAMESPACE`
Развертывание интерфейса списка покупок: `kubectl apply -f ./deployment-shopping-list-front-end.yml --namespace $NAMESPACE`
Убедитесь, что изображение правильное: `kubectl get deployments -o wide -n $NAMESPACE`
Убедитесь, что модуль запускается нормально: `kubectl get pods -o wide -n $NAMESPACE`
Разверните интерфейсную службу списка покупок: `kubectl apply -f ./service-shopping-list-front-end.yml --namespace $NAMESPACE`
Убедитесь, что служба запускается нормально: `kubectl get services -o wide -n $NAMESPACE`
Развертывание входа: `kubectl apply -f ./ingress.yml --namespace $NAMESPACE`
Проверьте статус входа: kubectl get ingresses -n $NAMESPACE
Просмотр подробностей входа: kubectl describe ingress <ingress name> -n $NAMESPACE
Если все идет хорошо и ошибок нет, вы можете запустить команду `kubectl get Services -o Wide -n $NAMESPACE`, чтобы просмотреть IP-адрес и порт, предоставленные входным контроллером nginx, чтобы мы могли опробовать веб-приложение. Предположим, что мы видим IP 20.72.130.209. Порт обычно 80.
Открыть браузер,доступ`http://20.72.130.209/`。если все в порядке,Вы можете с радостью управлять покупками на нем.
Очистить сцену
Запустите команду kubectl delete namespace $NAMESPACE, чтобы удалить все ресурсы в этом пространстве имен.
Если срок действия бесплатной пробной версии облачной службы Azure k8s истекает, не забудьте удалить следующие ресурсы: my-k8s-cluster-1, my-azure-resource-group-1 и подписку Azure 1.
[Остерегайтесь ловушек! Не забудьте удалить все ресурсы в облачном кластере k8s до истечения бесплатного периода]
Если вы подаете заявку на учетную запись с бесплатным пробным периодом на облачных платформах, таких как Microsoft, Google, Amazon, Alibaba и Tencent, и если вы не используете ее временно, вы должны не забыть удалить все ресурсы в облачном кластере k8s перед пробной версией. Срок истекает, иначе это будет слишком дорого. Вы встретите Облачного Убийцы.
Эта статья предназначена для Windows 10 и Ubuntu. Я напишу ее, когда у меня будет время.
Из-за ограничений по объему в этой статье не объясняются используемые файлы конфигурации docker compose и k8s. Я объясню это в следующих двух статьях. Следите за обновлениями.
Чтобы найти последнюю версию этой серии статей, вы можете выполнить поиск по столбцу «Улучшенное программное обеспечение».
Если вам нравится эта серия статей, пожалуйста, поставьте лайк и сохраните их, а также напишите, почему они вам нравятся, в области сообщений, чтобы я мог написать больше статей, которые вам понравятся в будущем.
Если вам это не нравится, вы можете оставить сообщение и сказать мне, где я могу его улучшить.