Автор оригинала: Sravan Cynixit.
Вступление
Я провел довольно много времени, в последнее время пытаясь полировать мою настройку и рабочий процесс для рельсов веб-разработки; Многие изменились с тех пор, как я начал работать с контейнерами и Куберанетами, поэтому я должен был адаптировать. Я очень доволен конечным результатом, и я хотел бы поделиться в этом сообщении, что я сейчас делаю, так как я уверен, что это может сэкономить время другим и отвечать на некоторые вопросы, которые могут увидеть больше информации о Рубин на рельсы онлайн обучение
Когда-то за то, что для меня разрабатывает Rails для меня означало установку всех зависимостей моего приложения на моем Mac, включая Ruby, базы данных, такие вещи, как Redis и многое другое. Это в основном сработало, но это также означало развиваться на платформе, которая иногда может быть совершенно отличной от платформы, которую я развернул, и я случайно сбежал к вопросам несколько раз из-за этого. Там много нравится о контейнерах, но я люблю их особенно, потому что они позволяют мне развиваться в среде, которая почти идентична для производства, а также из-за простоты, с которой я могу настроить среды. Контейнеры позволяют очень легко упаковать все библиотеки и компоненты, которое необходимо запустить приложение, убедившись, что приложение всегда работает точно так же, как он, независимо от того, где он работает. И контейнеры могут быть использованы для запуска внешних зависимостей, а также писать здесь …
Dockerfile.
Первый шаг — это «контейнеризировать» приложение. Как вы пишете, что ваш DockerFile довольно важен, потому что «неотпечатанный» докер может привести к очень большим изображениям, которые должны быть перестроены с нуля, замедляя вещи. Вместо этого, поскольку Docker строит изображения как «слои», — где каждый слой создается с определенной инструкцией в DockerFile — хороший докер может использовать кэширование слоев, а также значительно уменьшить конечный размер изображения. Для приложений Rails есть рубиновое изображение, которое поставляется в различных ароматах. Наиболее удобным является тот, который на основе Alpine Linux Distro, поскольку очень очень мало по сравнению с изображением по умолчанию, которое основано на Debian. Существует важный аспект альпийских изображений для учета: Alpine использует Musl вместо Glibc Так что некоторое программное обеспечение может иметь проблемы, работающие в Alpine. Однако с большинством приложений это не проблема, поэтому, используя Alpine, вы можете воспользоваться меньшими изображениями, которые быстрее построить, нажать и развернуть.
Это мой текущий докерфайл:
ARG RUBY_VERSION=2.6.1 FROM ruby:$RUBY_VERSION-alpine as development RUN apk add --no-cache \ git build-base yarn nodejs mariadb-dev imagemagick \ chromium-chromedriver chromium tzdata \ && rm -rf /var/cache/apk/* ENV RAILS_ENV=development ENV RACK_ENV=development ENV RAILS_LOG_TO_STDOUT=true ENV RAILS_ROOT=/app ENV LANG=C.UTF-8 ENV GEM_HOME=/bundle ENV BUNDLE_PATH=$GEM_HOME ENV BUNDLE_APP_CONFIG=$BUNDLE_PATH ENV BUNDLE_BIN=$BUNDLE_PATH/bin ENV PATH=/app/bin:$BUNDLE_BIN:$PATH WORKDIR /app
Давайте подробно пройдем этот файл. Сначала мы указываем, что хотим основывать наш образ на альпийской версии Ruby Image:
ARG RUBY_VERSION=2.6.1 FROM ruby:$RUBY_VERSION-alpine as development
Также обратите внимание, что мы называем этот этап «Развитие». На самом деле мы собираемся построить «многоступенчатое» изображение с двумя этапами, одним для изображения, которое содержит все, что нужно во время разработки, и окончательная версия, меньшая, чем оригинальная, которая будет использоваться в производстве.
Следующая командная инструкция устанавливает некоторые пакеты, необходимые для вещей для работы.
RUN apk add --no-cache \ git build-base yarn nodejs mariadb-dev imagemagick \ chromium-chromedriver chromium tzdata \ && rm -rf /var/cache/apk/*
Итак, мы устанавливаем:
• Git, так что Bundler может получить и установить Ruby Gems • Base-base, необходимый для компиляции некоторых вещей также для Ruby Gems • Nodejs для компиляции активов и «пакеты» с WebPacker • Mariadb-dev, чтобы мы могли установить и использовать Mysql Ruby Gem; Конечно, это может быть изменено на эквивалент для PostgreSQL или другой базы данных в использовании • ImageMagick — необязательно — для управления изображениями с помощью ActiveStorage • Chromium-Chromedriver и Chromium для прохождения системных тестов с Capybara • Tzdata для проведения часовых поясов, также требуемых рельсами или какой-то драгоценный камень (не может вспомнить). Обратите внимание, что после установки этих пакетов мы очищаем кэш APK, который поможет уменьшить окончательный размер изображения.
Затем мы по умолчанию некоторые переменные среды для развития и Bundler:
ENV RAILS_ENV=development ENV RACK_ENV=development ENV RAILS_LOG_TO_STDOUT=true ENV RAILS_ROOT=/app ENV LANG=C.UTF-8 ENV GEM_HOME=/bundle ENV BUNDLE_PATH=$GEM_HOME ENV BUNDLE_APP_CONFIG=$BUNDLE_PATH ENV BUNDLE_BIN=$BUNDLE_PATH/bin ENV PATH=/app/bin:$BUNDLE_BIN:$PATH
Следующая вещь, которую мы делаем, это копировать драгоценные данные и установить драгоценные камни с Bundler:
WORKDIR /app COPY Gemfile Gemfile.lock ./ RUN gem install bundler \ && bundle install -j "$(getconf _NPROCESSORS_ONLN)" \ && rm -rf $BUNDLE_PATH/cache/*.gem \ && find $BUNDLE_PATH/gems/ -name "*.c" -delete \ && find $BUNDLE_PATH/gems/ -name "*.o" -delete
Если вы хотите получить углубленные знания о Kubernetes, пройдите эту ссылку Kubernetes онлайн обучение
Создание разработки кластера Kubernetes с K3S
Существуют различные способы настроить кластер Kubernetes, которые мы можем использовать для разработки, но мой любимый использует распределение Rancher K3S Kubernetes, потому что он сертифицирован (всего несколько различий от вышеупомянутых kubernetes, которые необходимо учитывать) и невероятно легкий! Это полная кубернана дистрибутива в одном маленьком двоичном двоике. Благодаря низкому использованию CPU/RAM K3S для разработки я могу использовать один кластер узла только с 2 ядрами и 4 ГБ ОЗУ, который действительно дешевый (я использую облако Hetzner, и это стоит мне 6 евро в месяц).
Установка K3S является супер легким, используя официальный скрипт:
curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--no-deploy=traefik" sh -
Обратите внимание, что в команде выше я убедитесь, что контроллер Traefik Inhenter не устанавливается автоматически (потому что в противном случае он установлен по умолчанию), потому что я предпочитаю Nginx в качестве контроллера входа. Вы можете удалить этот параметр, если вы довольны Traefik. Как только K3S работает и работает, вам нужно скопировать файл kubeconfig на ваш механизм dev, чтобы вы могли управлять кластером с помощью kubectl:
ssh"sudo cat /etc/rancher/k3s/k3s.yaml" > ~/.kube/config- sed -i -e "s/localhost/ /g" ~/.kube/config- sed -i -e "s/default/ /g" ~/.kube/config-
Развертывание в Куберанес с рулем и шельфилом
Чтобы развернуть наше приложение к кластеру, конечно, мы будем использовать HELM, но вместе с другим инструментом под названием Helmfile, что позволяет использовать ту же диаграмму с несколькими средами, легче. Чтобы установить Helmfile на Mac, например, запустить:
brew install helmfile
Нам также необходимо установить плагин Secrets для Helm, чтобы мы могли управлять секретами для каждой среды:
helm plugin install https://github.com/futuresimple/helm-secrets
Теперь мы можем создать хелм-график. Мне нравится держать диаграмму в том же репозитории, что и код приложения, поэтому я создаю необходимые файлы в подкаталоге HELM с этой структурой:
helmfile.yaml helm ├── chart │ ├── Chart.yaml │ ├── templates │ │ ├── deployment-web.yaml │ │ ├── deployment-worker.yaml │ │ ├── ingress.yaml │ │ ├── secret.yml │ │ └── service-web.yaml │ └── values.yaml ├── helmfiles │ └── 00-my-app.yaml └── values └── my-app └── dev ├── secrets.yaml └── values.yamlhelmfile.yaml helm ├── chart │ ├── Chart.yaml │ ├── templates │ │ ├── deployment-web.yaml │ │ ├── deployment-worker.yaml │ │ ├── ingress.yaml │ │ ├── secret.yml │ │ └── service-web.yaml │ └── values.yaml ├── helmfiles │ └── 00-my-app.yaml └── values └── my-app └── dev ├── secrets.yaml └── values.yaml
Заключение
Я надеюсь, что я вспомнил, чтобы включить все актуальное для этого руководства. Как я уже сказал, я очень доволен этой настройкой и рада поделиться. Это немного работы авансом, но это то, что нужно сделать только раз в любом случае. Тогда я просто настроил веб-контейнеры для веб и рабочих мест на местах с телеприэтанцией и включись с разработкой как обычно! Благодаря этой установке и рабочему процессу я ничего не пропускаю от старого пути развития рельсов, хотя, хотя, конечно, некоторые дополнительные сложности в сравнении. Пожалуйста, не стесняйтесь, дайте мне знать в комментариях, если вы столкнетесь с проблемами во время репликации этой настройки, и я буду рад помочь, если смогу.
Оригинал: «https://www.codementor.io/@sravancynixit/awesome-rails-development-with-docker-kubernetes-149qsglfex»