Чи використовували ви DevSpace для розгортання додатків Kubernetes у середовищі розробки?

Постановка проблеми

pic

Чи може Kubernetes добре працювати з Docker?

Kubernetes — це система оркестрації контейнерів, тому вона не може функціонувати без контейнерної середовища, такої як Docker. Однак без Docker Kubernetes може працювати з багатьма іншими контейнерними середовищами, такими як RunC, cri-o,… При цьому Kubernetes розроблений для хорошої роботи з Docker. І велика частина документації Kubernetes також написана для Docker… Паралельно Docker прийняв Kubernetes і навіть надає свій власний вбудований Kubernetes. Створювач також згадував про відмову від Docker Swarm (який має схожі функції з Kubernetes) і використання Kubernetes як системи оркестрації за замовчуванням для Docker.

З версії Kubernetes 1.24 і вище, Docker більше не підтримується 🤔 ?

Dockershim видалено в Kubernetes 1.24 і новіших версіях. Тому Docker не підтримується в Kubernetes 1.24 і новіших версіях. Однак ви можете продовжувати використовувати образи Docker. При створенні нових вузлів ми рекомендуємо використовувати containerd як середовище виконання контейнерів.

2 грудня 2020 року в анонсі, що супроводжував випуск Kubernetes v1.20, компанія Kubernetes оголосила про припинення підтримки Docker в наступних випусках. Це також означає, що Dockershim (шар, який підтримує стандарт CRI Kubernetes) буде видалено.

Це означає, що при оновленні версії Kubernetes до версії 1.24 ваше виробниче додаток більше не зможе використовувати Dockershim. Тому мені доведеться провести рефакторинг додатка перед розгортанням нової версії в робочій середовищі. Для успішного виконання рефакторингу додатка перед його розгортанням у виробничому середовищі, потрібно буде створити середовище розробки K8s замість використання docker і docker-compose, як раніше.

👉️ Ви використовували DevSpace для розгортання додатків Kubernetes у середовищі розробки?

О DevSpace

DevSpace — це інструмент Kubernetes з відкритим вихідним кодом, призначений лише для клієнта і чудово підтримує розробку додатків Kubernetes, зокрема:
· Збірка, тестування і відладка безпосередньо в Kubernetes.
· Функція гарячого перезавантаження: оновлення контейнерів без необхідності перезбирати образи або перезапускати контейнери.
· Уніфікація процесу розгортання: всередині команди та в середовищах розробки, підготовки та виробництва.
· Автоматизація повторюваних задач: при створенні та розгортанні образів.

Як працює DevSpace?

pic

  1. Читання конфігурації проекту
    На першому етапі нам необхідно створити файл конфігурації DevSpace з ім'ям devspace.yaml (при встановленні та використанні команди цей файл буде створено автоматично). Ми можемо редагувати вміст файлу відповідно до вимог і особливостей проекту. DevSpace прочитає файл конфігурації.
  2. Використовує інструменти зборки для створення образів
    DevSpace використовує інструменти зборки для створення образів. Деякі з інструментів зборки, які підтримуються DevSpace, включають: docker, kaniko,…
  3. Відправляє образи в реєстри
    Після створення образів DevSpace відправляє їх в такі реєстри, як Docker Hub, Github Registry, … або в самостійні реєстри.
  4. Використовує контекст kube
    DevSpace використовує контекст kube, доступ до якого здійснюється через конфігурацію в $HOME/.kube/config
  5. Розгортання проекту в Kubernetes
    На цьому етапі DevSpace розгорне проект у кластері Kubernetes на основі конфігурації в devspace.yaml.
  6. Запускає DEV MODE
    · Гаряче перезавантаження через синхронізацію файлів: оновлення контейнерів без повторного розгортання.
    · Доступ до локального хосту через переадресацію портів: доступ до контейнера через локальний хост.
    · Повний контроль через термінал і журнали: взаємодія через термінали або потік журналів.
    · Відлагодження за допомогою віддаленого відлагоджувача: встановлення точок зупину безпосередньо в IDE.

Встановлення та використання Devspace

Налаштування Devspace

Встановіть для Linux за допомогою наступної команди:

curl -L -o devspace "https://github.com/loft-sh/devspace/releases/latest/download/devspace-linux-amd64" && sudo install -c -m 0755 devspace /usr/local/bin

Для інших операційних систем див.:
https://www.devspace.sh/docs/getting-started/installation?x0=5

Перевірте, чи доступне середовище розробки на вашому комп'ютері:

devspace version  

DevSpace version : 6.3.2

Створення прикладу проекту

Якщо у вас ще немає проекту, ви можете клонувати репозиторій прикладів. Тут я вибрав PHP як мову програмування.

git clone https://github.com/loft-sh/devspace-quickstart-php  
cd devspace-quickstart-php

Щоб використовувати devspace для свого репозиторію, виконайте наступну команду для створення файлу devspace.yaml:

devspace init
%########%   
 %###########% ____ _____   
 %#########% | _ \ ___ __ __ / ___/ ____ ____ ____ ___   
 %#########% | | | | / _ \\ \ / / ___ \ | _ \ / _ | / __// _ \  
 %#############% | |_| |( __/ \ V / ____) )| |_) )( (_| |( (__( __/  
 %#############% |____/ ___| _/ ____/ | __/ __,_| ___\___|  
 %###############% |_|  
 %###########%  


info Detecting programming language...

Devspace підтримує багато популярних мов. Оскільки я вибираю середовище для PHP, я вибираю мову PHP.

? Select the programming language of this project [Use arrows to move, type to filter]  
 c# (dotnet)  
 go  
 java-gradle  
 java-maven  
 javascript  
> php  
 python

При виборі інструмента розгортання часто використовують Helm Chart для управління пакетами додатків для Kubernetes, координації завантажень, установок і розгортань додатків. Тут у мене встановлений Helm, тому я вибираю Helm як інструмент розгортання для Kubernetes.

? How do you want to deploy this project? [Use arrows to move, type to filter]  
> helm  
 kubectl  
 kustomize

Виберіть конфігурацію Helm. Якщо ви відповісте yes, Devspace автоматично згенерує конфігурацію на льоту, в іншому випадку вам доведеться вибрати конфігурацію Helm. Тут я вибрав Quickstart від Devspace для швидкості.

? Is this a DevSpace Quickstart project? [Use arrows to move, type to filter]  
> Yes  
 No
? Do you want to develop this project with DevSpace or just deploy it? [Use arrows to move, type to filter] [Use arrows to move, type to filter]  
> I want to develop this project and my current working dir contains the source code  
 I just want to deploy this project
? How should DevSpace build the container image for this project? [Use arrows to move, type to filter]  
> Use this existing Dockerfile: ./Dockerfile  
 Use a different Dockerfile (e.g. ./backend/Dockerfile)  
 Use alternative build tool (e.g. jib, bazel)  
 Skip / I don't know
? If you were to push any images, which container registry would you want to push to? [Use arrows to move, type to filter]  
> Skip Registry  
 Use hub.docker.com  
 Use GitHub image registry  
 Use other registry

Результат буде таким 😀:

done Project successfully initialized  
info Configuration saved in devspace.yaml - you can make adjustments as needed  

You can now run:  
1. devspace use namespace - to pick which Kubernetes namespace to work in  
2. devspace dev - to start developing your project in Kubernetes  

Run `devspace -h` or `devspace [command] -h` to see a list of available commands and flags

Після успішної ініціалізації Devspace в папці проекту ви побачите 3 зміни:
· 1 новий файл devspace.yaml: завдяки якому всі операції по зборці, розгортанню та розробці будуть виконуватися Devspace.
· 1 новий файл devspacestart.sh: використовується для надання інформації, коли користувач використовує термінал для відкриття контейнерів.
· Додати _.devspace/
в .gitignore

Вміст файлу devspace.yaml буде таким:

version: v2beta1  
name: devspace-quickstart-php  

# Це список `pipelines`, які DevSpace може виконати (ви можете визначити свої власні)  
pipelines:  
 # Це pipeline для основної команди: `devspace dev` (або `devspace run-pipeline dev`)  
 dev:  
 run: |-  
 run_dependencies --all # 1. Розгорнути всі проекти, які потрібні цьому проекту (див. "dependencies")  
 ensure_pull_secrets --all # 2. Перевірити pull secrets  
 create_deployments --all # 3. Розгорнути Helm charts та manifests, вказані як "deployments"  
 start_dev app # 4. Запустити режим розробки "app" (див. розділ "dev")  
 # Ви можете запустити цей pipeline за допомогою `devspace deploy` (або `devspace run-pipeline deploy`)  
 deploy:  
 run: |-  
 run_dependencies --all # 1. Розгорнути всі проекти, які потрібні цьому проекту (див. "dependencies")  
 ensure_pull_secrets --all # 2. Перевірити pull secrets  
 build_images --all -t $(git describe --always) # 3. Зібрати, тегувати (git commit hash) та завантажити всі образи (див. "images")  
 create_deployments --all # 4. Розгорнути Helm charts та manifests, вказані як "deployments"  

# Це список `images`, які DevSpace може створити для цього проекту  
# Рекомендується пропускати створення образів під час розробки (devspace dev), наскільки це можливо  
images:  
 app:  
 image: my-image-registry.tld/username/app  
 dockerfile: ./Dockerfile  

# Це список `deployments`, які DevSpace може створити для цього проекту  
deployments:  
 app:  
 # Цей deployment використовує `helm`, але ви також можете визначити `kubectl` deployments або kustomizations  
 helm:  
 # Ми розгортаємо цей проект за допомогою Helm chart, який ви надали  
 chart:  
 name: component-chart  
 repo: https://charts.devspace.sh  
 # В розділі `values` ми можемо визначити значення для цього Helm chart під час `helm install/upgrade`  
 # Також можна використовувати `valuesFiles`, щоб завантажити значення з файлів, напр. valuesFiles: ["values.yaml"]  
 values:  
 containers:  
 - image: my-image-registry.tld/username/app  
 service:  
 ports:  
 - port: 80  

# Це список `dev` контейнерів, які базуються на контейнерах, створених вашими deployments  
dev:  
 app:  
 # Шукаємо контейнер, який працює з цим образом  
 imageSelector: my-image-registry.tld/username/app  
 # Заміняємо контейнер на цей dev-оптимізований образ (дозволяє пропустити створення образів під час розробки)  
 devImage: ghcr.io/loft-sh/devspace-containers/php:8-apache  
 # Синхронізуємо файли між локальною файловою системою та контейнером для розробки  
 sync:  
 - path: ./  
 uploadExcludeFile: .dockerignore  
 # Відкриваємо термінал і використовуємо наступну команду для його запуску  
 terminal:  
 command: ./devspace_start.sh  
 # Впроваджуємо легкий SSH сервер в контейнер (щоб ваш IDE міг підключитись до віддаленого середовища розробки)  
 ssh:  
 enabled: true  
 # Доступ до наступних команд з моєї локальної машини всередині контейнера для розробки  
 proxyCommands:  
 - command: devspace  
 - command: kubectl  
 - command: helm  
 - gitCredentials: true  
 # Перенаправляємо наступні порти, щоб мати змогу отримати доступ до вашого додатку через localhost  
 ports:  
 - port: 8080:80  
 # Відкриваємо наступні URL-адреси після того, як вони повернуть статус HTTP, відмінний від 502 або 503  
 open:  
 - url: http://localhost:8080  

# Використовуйте розділ `commands`, щоб визначити повторювані робочі процеси для цього проекту   
commands:  
 migrate-db:  
 command: |-  
 echo 'Це крос-платформова, спільна команда, яку можна використовувати для будь-якої задачі розробки.'  
 echo 'Кожен, хто використовує цей проект, може виконати її через "devspace run migrate-db"'  

# Визначте залежності від інших проектів у devspace.yaml  
# dependencies:  
# api:  
# git: https://...
## Залежності на основі Git  
## тег: v1.0.0  
## ui:  
## path: ./ui # Залежності на основі шляху (для монорепозиторіїв)

Запустіть додаток за допомогою devspace

  1. Налаштуйте кластер Kubernetes, контекст
    Необхідно виконати команду для вибору контексту, а також простору імен для створення додатка в кластері Kubernetes.
devspace use context # щоб вибрати правильний кластер Kubernetes  
devspace use namespace my-namespace # буде автоматично створено під час розгортання

Я вже створив конфігурацію з контекстом tibi-dev, простір імен я встановив php (devspace буде створено, якщо простір імен відсутній), тому команда буде записана наступним чином:

devspace use tibi-dev   
devspace use namespace php
  1. Запустіть контейнер для розробки
devspace dev

Виконуватиметься команда запуску для всіх конвеєрів (pipelines), визначених в розділі dev файлу devspace.yaml.

# Це список `pipelines`, які DevSpace може виконати (ви можете визначити свої власні)  
pipelines:  
 # Це pipeline для основної команди: `devspace dev` (або `devspace run-pipeline dev`)  
 dev:  
 run: |-  
 run_dependencies --all # 1. Розгорнути всі проекти, які потрібні цьому проекту (див. "dependencies")  
 create_deployments --all # 2. Розгорнути Helm charts та manifests, вказані як "deployments"  
 start_dev app

Тепер ви можете перейти на http://localhost:8080/ і побачити результат 🏁.

pic

Налаштуйте devspace.yaml і розгорніть.

  1. Налаштуйте devspace.yaml
    Вміст зображень у файлі devspace.yaml:
    · Образ: реєстр образів можна замінити на Dockerhub, Gitlab Registry, власний реєстр.
    · Dockerfile: Файл Dockerfile для побудови образу, цей файл створюється при ініціалізації DevSpace відповідно до обраного нами мови.
# Це список `images`, які DevSpace може створити для цього проекту  
# Рекомендується пропускати створення образів під час розробки (devspace dev), наскільки це можливо  
images:  
 app:  
 image: my-image-registry.tld/username/app  
 dockerfile: ./Dockerfile

Вміст розгортань у devspace.yaml: ви можете змінити ім'я чарта, репозиторій чарта, образ контейнера, якщо вам потрібно більше дій по розгортанню. Якщо ви просто розробник, то вам не потрібно нічого змінювати.

# Це список `deployments`, які DevSpace може створити для цього проекту  
deployments:  
 app:  
 # Цей deployment використовує `helm`, але ви також можете визначити `kubectl` deployments або kustomizations  
 helm:  
 # Ми розгортаємо цей проект за допомогою Helm chart, який ви надали  
 chart:  
 name: component-chart  
 repo: https://charts.devspace.sh  
 # У розділі `values` ми можемо визначити значення для цього Helm chart під час `helm install/upgrade`  
 # Також можна використовувати `valuesFiles`, щоб завантажити значення з файлів, напр. valuesFiles: ["values.yaml"]  
 values:  
 containers:  
 - image: my-image-registry.tld/username/app  
 service:  
 ports:  
 - port: 80
  1. Розгортання образів, схема управління
devspace deploy

Виконуватиметься команда запуску для всіх конвеєрів, визначених у розгортанні в файлі devspace.yaml, включаючи побудову, завантаження образу та розгортання Helm chart.

# Ви можете запустити цей pipeline за допомогою `devspace deploy` (або `devspace run-pipeline deploy`)  
 deploy:  
 run: |-  
 run_dependencies --all # 1. Розгорнути всі проекти, які потрібні цьому проекту (див. "dependencies")  
 ensure_pull_secrets --all # 2. Перевірити pull secrets  
 build_images --all -t $(git describe --always) # 3. Побудувати, тегувати (git commit hash) та завантажити всі образи (див. "images")  
 create_deployments --all

З урахуванням конкретних вимог і особливостей у процесі розробки проекту. Ви можете змінювати та редагувати файл devspace.yaml, DevSpace одразу ж виконає гарячу перезагрузку 😄.

pic

Перекладено з: Использовали ли вы DevSpace для развертывания приложений Kubernetes в среде разработки?

Leave a Reply

Your email address will not be published. Required fields are marked *