Постановка проблеми
Чи може 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?
- Читання конфігурації проекту
На першому етапі нам необхідно створити файл конфігурації DevSpace з ім'ям devspace.yaml (при встановленні та використанні команди цей файл буде створено автоматично). Ми можемо редагувати вміст файлу відповідно до вимог і особливостей проекту. DevSpace прочитає файл конфігурації. - Використовує інструменти зборки для створення образів
DevSpace використовує інструменти зборки для створення образів. Деякі з інструментів зборки, які підтримуються DevSpace, включають: docker, kaniko,… - Відправляє образи в реєстри
Після створення образів DevSpace відправляє їх в такі реєстри, як Docker Hub, Github Registry, … або в самостійні реєстри. - Використовує контекст kube
DevSpace використовує контекст kube, доступ до якого здійснюється через конфігурацію в $HOME/.kube/config - Розгортання проекту в Kubernetes
На цьому етапі DevSpace розгорне проект у кластері Kubernetes на основі конфігурації в devspace.yaml. - Запускає 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
- Налаштуйте кластер Kubernetes, контекст
Необхідно виконати команду для вибору контексту, а також простору імен для створення додатка в кластері Kubernetes.
devspace use context # щоб вибрати правильний кластер Kubernetes
devspace use namespace my-namespace # буде автоматично створено під час розгортання
Я вже створив конфігурацію з контекстом tibi-dev, простір імен я встановив php (devspace буде створено, якщо простір імен відсутній), тому команда буде записана наступним чином:
devspace use tibi-dev
devspace use namespace php
- Запустіть контейнер для розробки
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/ і побачити результат 🏁.
Налаштуйте devspace.yaml і розгорніть.
- Налаштуйте 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
- Розгортання образів, схема управління
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 одразу ж виконає гарячу перезагрузку 😄.
Перекладено з: Использовали ли вы DevSpace для развертывания приложений Kubernetes в среде разработки?