Fixed grammar issues and logo.
Signed-off-by: Pavel Kirilin <win10@list.ru>
This commit is contained in:
@ -9,12 +9,12 @@ category: DevOps
|
||||
# Разделение докера на среды
|
||||
|
||||
Должен ли ты разделять среды докера в несколько `docker-compose` файлов?
|
||||
Определенно! В некоторых случаях невозможно разобраться что разработчики хотели сделать или почему ничего не работает. Настройка раздельных сред может стать настоязей мешанино. В этой статье я покажу как настроить `docker-compose` и избежать миллиона проблем.
|
||||
Определенно! В некоторых случаях невозможно разобраться что разработчики хотели сделать или почему ничего не работает. Настройка раздельных сред может стать настояшей мешаниной. В этой статье я покажу как настроить `docker-compose` и избежать миллиона проблем.
|
||||
|
||||
Как мы вообще можем разделить среды для локальной разработки и продовые?
|
||||
Отет прост: Требуется декомпозировать проект и создать отдельные файлы под каждую из сред или даже сервисов.
|
||||
|
||||
Это нормально, если у тебя будет больше 2-ч `docker-compose` файлов.
|
||||
Это нормально, если у тебя будет больше 2-х `docker-compose` файлов.
|
||||
|
||||
Например:
|
||||
```
|
||||
@ -35,7 +35,7 @@ deploy
|
||||
### Как это работает?
|
||||
Докер умеет работать с множеством `docker-compose` файлов одновременно. И мы можем использовать это для разделения сред.
|
||||
|
||||
Выглядит это следующим образом.
|
||||
Запуск таких конфигураций выглядит следующим образом:
|
||||
```bash
|
||||
docker-compose \
|
||||
-f "deploy/docker-compose.yml" \
|
||||
@ -46,12 +46,11 @@ docker-compose \
|
||||
|
||||
В каждом из этих файлов определен какой-то кусок конфигурации, который не пересекается. Например в `docker-compose.yml` определено приложение и некоторые необходимые сервисы, а в остальных файлах добавляются сервисы или меняются значения предыдущих.
|
||||
|
||||
Наверное, тут проще на примере пояснить.
|
||||
Наверное, тут проще показать на примере.
|
||||
|
||||
Допустим у нас есть проект, у которого поднимается бекенд с параметрами, которые отличаются на проде и локально.
|
||||
|
||||
Для простоты создадим простецикий проект со следующей структурой.
|
||||
|
||||
Для простоты примера создадим простецкий проект со следующей структурой:
|
||||
```
|
||||
proj
|
||||
├── deploy
|
||||
|
@ -6,9 +6,12 @@ category: 'DevOps'
|
||||
---
|
||||
|
||||
# Makefiles для чайников
|
||||
Если описывать в двух словах, то это просто описание команд для упрощения работы с проектом. Изначально делались для того, чтобы удобно компилировать всякие проекты на любых языках.
|
||||
Что такое мейкфайлы? Вы наверняка их встречали,
|
||||
если собирали проекты из ихсодных файлов.
|
||||
Если описывать в двух словах, то это просто описание команд для упрощения работы
|
||||
с проектом. Изначально делались для того, чтобы удобно компилировать всякие проекты на любых языках.
|
||||
|
||||
## Как они работают
|
||||
## Как они работают?
|
||||
Достаточно просто.
|
||||
|
||||
Вот пример `Makefile`:
|
||||
@ -37,7 +40,7 @@ Hi!
|
||||
|
||||
## Зависимости таргетов
|
||||
|
||||
На строчке объявления таргета `run` видно, что объявлен `test.gen`. Это зависимость данного таргета и она будет вызвана до того, как выполнится скрипт описываемого таргета. Таких зависимостей может быть много, перечисляются они чере пробел.
|
||||
На строчке объявления таргета `run` видно, что объявлен `test.gen`. Это зависимость данного таргета и она будет вызвана до того, как выполнится скрипт описываемого таргета. Таких зависимостей может быть много, перечисляются они через пробел.
|
||||
|
||||
Например:
|
||||
```makefile{}[Makefile]
|
||||
@ -96,7 +99,7 @@ memes
|
||||
|
||||
## Валидация сгенерированных файлов
|
||||
Зачастую `Makefile` используют для компиляции С и зачастую требуется
|
||||
собрать какую-либо часть проект и пропустить сборку этой части, если эта часть уже собрана.
|
||||
собрать какую-либо часть проекта в файл и пропустить сборку этого файла, если он уже собран.
|
||||
Раскрою секрет, в Makefile это базовый функционал.
|
||||
|
||||
Давайте немного поменяем первый Makefile и запустим дважды.
|
||||
|
@ -7,15 +7,15 @@ position: 4
|
||||
|
||||
# Проблема в изучении кубернетес
|
||||
|
||||
Многие люди, кто задавались вопросом как начать работать с
|
||||
кубернетесом сталкивались с тем, что документация крайне
|
||||
Многие люди, кто задавались вопросом "Как начать работать с
|
||||
кубернетес?", сталкивались с тем, что документация крайне
|
||||
большая сложная и нет нормального описания как
|
||||
завернуть маленький проект из одного проекта в свой кластер или
|
||||
как развернуть свой кластер без боли.
|
||||
завернуть маленький проект из одного контейнра в свой кластер или
|
||||
как развернуть сам кластер без боли.
|
||||
|
||||
А всё потому что вся документация нацелена на большие
|
||||
production-ready системы с большим rps и тому подобным.
|
||||
|
||||
<br>
|
||||
В данной статье я попробую исправить это вселенское
|
||||
недопонимание используя k3s, свой комплюктер и немного знаний по кодингу.
|
||||
|
||||
@ -28,12 +28,12 @@ production-ready системы с большим rps и тому подобны
|
||||
# Что такое кубернетес и почему это лучше докера
|
||||
|
||||
Многие ребята, кто хорошо знаком с докером и его
|
||||
возможностями могут задаваться таким вопросом.
|
||||
возможностями, могут задаваться таким вопросом.
|
||||
Для тех кто в танке, напомню, что докер
|
||||
имеет вариант запуска в режиме кластера.
|
||||
Этот функционал называется docker swarm.
|
||||
Этот функционал называется [docker swarm](https://docs.docker.com/engine/swarm/).
|
||||
В целом, swarm отдалённо напоминает kubernetes,
|
||||
так как в этом режиме докер, худо-бедно но умеет
|
||||
так как в этом режиме докер худо-бедно умеет
|
||||
автоскейлится и запускаться в кластере,
|
||||
но это всё равно немного не то.
|
||||
|
||||
@ -54,7 +54,7 @@ production-ready системы с большим rps и тому подобны
|
||||
|
||||
Так как я в этой статье хотел затронуть
|
||||
совсем базовые и практические вещи, то рассматривать
|
||||
мы будем только крайне полезные компоненты.
|
||||
мы будем только самые часто используемые компоненты.
|
||||
|
||||
- Container
|
||||
- Pod
|
||||
@ -65,12 +65,12 @@ production-ready системы с большим rps и тому подобны
|
||||
- Secret
|
||||
- ConfigMap
|
||||
|
||||
А теперь рассмотрим немного поподробнее.
|
||||
А теперь рассмотрим каждый ресурс немного поподробнее.
|
||||
|
||||
## Container
|
||||
|
||||
Контейнеры не то чтобы часть специфичная для кубернетес.
|
||||
С контейнерами вы можете быть знакомы из кучи систем.
|
||||
Контейнеры не являются чем-то специфичным для кубернетес.
|
||||
С контейнерами вы можете быть знакомы из кучи других систем.
|
||||
В контексте кубера они не обладают никакими дополнительными
|
||||
свойствами. Это ровно то же, что и контейнеры `containerd`
|
||||
или те, с которыми вы возились с докером. Ничего нового.
|
||||
@ -80,9 +80,9 @@ production-ready системы с большим rps и тому подобны
|
||||
|
||||
<b-message type="is-warning" has-icon>
|
||||
|
||||
Важная ремарка. Кубер начиная с 2021 кубернетес не поддерживает
|
||||
докер как бэкенд. Теперь кубер будет общаться с
|
||||
containerd напрямую. Это значит, что теперь перед использованием
|
||||
Важная ремарка. Кубер, начиная с 2021 года, не поддерживает
|
||||
докер как бэкенд. Теперь он будет общаться с
|
||||
containerd напрямую. Это значит, что перед использованием
|
||||
контейнеров собранных на локальной машине надо будет импортировать их
|
||||
в `containerd` используя `ctr image import`.
|
||||
|
||||
@ -101,9 +101,9 @@ production-ready системы с большим rps и тому подобны
|
||||
|
||||
В поде находится от одного до множества контейнеров.
|
||||
Интересная особенность пода в том, что все контейнеры
|
||||
делят один сетевой адресс. Другими словами,
|
||||
делят один сетевой адрес. Другими словами,
|
||||
если у вас один из контейнеров открыл порт `3000`,
|
||||
то другие контейнеры из пода эти порты использовать не смогут.
|
||||
то другие контейнеры из пода этот порт использовать не смогут.
|
||||
|
||||
То есть, если вы хотите логически связанные приложения
|
||||
поместить в под, то они могут ходить друг к другу через лупбек
|
||||
@ -120,10 +120,10 @@ production-ready системы с большим rps и тому подобны
|
||||
|
||||
<br>
|
||||
|
||||
Deployment нужна именно для описания подов и создания
|
||||
Deployment нужен именно для описания подов и создания
|
||||
некоторых ресурсов, нужных для скейлинга.
|
||||
Также с помощью деплойментов можно делать откаты приложения через
|
||||
механиз роллбеков. Я это рассматривать не буду. Тут только база.
|
||||
механиз роллбеков. Я это рассматривать не буду. В этой статье только база.
|
||||
|
||||
## Service
|
||||
|
||||
@ -147,7 +147,7 @@ Deployment нужна именно для описания подов и соз
|
||||
Также сервис выступает как балансировщик.
|
||||
|
||||
<b-message type="is-info" has-icon>
|
||||
Если вы хотите сделать запрос от одного пода до дргого внутри кластера, то
|
||||
Если вы хотите сделать запрос от одного пода до дргого, внутри кластера, то
|
||||
вам придётся использовать сервис.
|
||||
<br>
|
||||
Если вы попробуете сделать запрос напрямую по IP пода, то у вас, конечно же,
|
||||
@ -157,7 +157,7 @@ Deployment нужна именно для описания подов и соз
|
||||
|
||||
## Ingress
|
||||
|
||||
Ингрессы это сервис описывающий куда пускать трафик,
|
||||
Ингресс - это сервис описывающий куда пускать трафик,
|
||||
который поступает снаружи кластера.
|
||||
|
||||
<div align="center">
|
||||
@ -168,9 +168,9 @@ Deployment нужна именно для описания подов и соз
|
||||
|
||||
Принцип работы ингресса следующий:
|
||||
|
||||
Вы указываете хост ингресса и различные регексы пути.
|
||||
Вы указываете хост ингресса и различные пути.
|
||||
В зависимости от входящего запроса ингресс выбирает в какой сервис
|
||||
направить его и в какой порт.
|
||||
направить запрос и в какой порт.
|
||||
|
||||
Настройка ингресса достаточно гибкая и я не думаю,
|
||||
что вы можете столкнуться с какими либо проблемами.
|
||||
@ -218,10 +218,10 @@ Deployment нужна именно для описания подов и соз
|
||||
- minikube
|
||||
|
||||
На первый взгляд minikube может показаться лучшим вариантом.
|
||||
И он действительно хорош тем, что его легко почистить после
|
||||
И он действительно хорош тем, что его легко развернуть и почистить после
|
||||
своих экспериментов. Однако, там есть проблемы с ингрессами.
|
||||
По факту они не работают и там надо окольными путями получать
|
||||
адреса приложения.
|
||||
адреса.
|
||||
|
||||
<br>
|
||||
|
||||
@ -238,11 +238,10 @@ k3s - это легковесная production-ready реализация k8s. I
|
||||
|
||||
## Подключение кластера
|
||||
|
||||
После установки в домашней дериктории должен был быть
|
||||
После установки `kubectl` в домашней дериктории должен был быть
|
||||
сгенерирован файл `.kube/config`. Этот файл содержит данные для
|
||||
подключения к различным кластерам. `minikube` Сам добавляет
|
||||
ключи для подключения к .kube/config. `K3S` не изменяет
|
||||
никаким образом `.kube/config`, поэтому надо будет это сделать вручную.
|
||||
ключи для подключения к .kube/config. `K3S` никак не изменяет `.kube/config`, поэтому надо будет это сделать вручную.
|
||||
|
||||
Для того, чтобы это сделать сначала разберёмся как выглядит конфиг.
|
||||
|
||||
@ -298,27 +297,28 @@ current-context: "k3s"
|
||||
можете передать параметр `--context $CONTEXT_NAME`, где `$CONTEXT_NAME` это название контекста.
|
||||
|
||||
Чтобы достать данные для подключения к `k3s` надо посмотреть его конфиг
|
||||
и скопировать данные. Либо выставить переменную среды, которая будет
|
||||
и скопировать данные. Либо выставить переменную среды `KUBECONFIG`, которая будет
|
||||
указывать конфиг k3s. Конфиг подключения `k3s` лежит в файле `/etc/rancher/k3s/k3s.yaml`.
|
||||
|
||||
Можете выполнить команду, которая будет просить kubectl использовать указанный конфиг:
|
||||
`export KUBE_CONFIG=/etc/rancher/k3s/k3s.yaml`
|
||||
`export KUBECONFIG=/etc/rancher/k3s/k3s.yaml`
|
||||
|
||||
<br>
|
||||
|
||||
Либо скопируйте нужные данные для подключения себе в `.kube/config`.
|
||||
|
||||
После настройки выполните команду и проверьте что вам вернулось
|
||||
что-то подобное. Это значит, что никаких ресурсов пока в
|
||||
кластере нет. Это мы исправим позже. Пока что можно сказать,
|
||||
что подключение прошло успешно.
|
||||
что-то подобное.
|
||||
|
||||
```bash
|
||||
$ kubectl --context "my-context" get pods
|
||||
No resources found in default namespace.
|
||||
```
|
||||
|
||||
Если же у вас выпадает ошибка, например такая.
|
||||
Это значит, что никаких ресурсов пока в
|
||||
кластере нет. Это мы исправим чуть позже. Пока что можно сказать,
|
||||
что подключение прошло успешно.
|
||||
Если же у вас выпадает ошибка, например такая:
|
||||
|
||||
```
|
||||
The connection to the server localhost:8080 was refused - did you specify the right host or port?
|
||||
@ -331,18 +331,19 @@ sudo systemctl start k3s.service
|
||||
```
|
||||
|
||||
Либо у вас неверные данные для входа.
|
||||
Перепроверьте свой `.kube/config`.
|
||||
|
||||
### Мониторинг кластера
|
||||
|
||||
Для просматривания управления кластером используется cli утилита `kubectl`.
|
||||
Но для того, чтобы с ней работать нужно получше понять что вообще в кластере есть.
|
||||
Для просмотра ресурсов и управления кластером используется `kubectl`.
|
||||
Но для того, чтобы с ней работать нужно получше понять, что вообще в кластере есть.
|
||||
|
||||
Для этого я советую использовать [Lens](https://k8slens.dev/). Это крайне
|
||||
удобный интерфейс для управления своим кластером.
|
||||
Также там есть очень клёвая настрока, которая сама включит мониторинг
|
||||
Также там есть очень клёвая настройка, которая сама включит мониторинг
|
||||
потребления памяти и процессора для всех подов и кластера в общем.
|
||||
|
||||
На локальной машине это не очень много смысла имеет,
|
||||
На локальной машине это не имеет смысла,
|
||||
а вот в проде было бы очень полезно.
|
||||
|
||||
Выглядит Lens примерно так:
|
||||
@ -437,7 +438,7 @@ app.listen(port, host, () => {
|
||||
Это всё. Сервер готов.
|
||||
|
||||
<hr>
|
||||
Протестируем запуск сервера выполнив команду ниже и открыв в
|
||||
Протестируем запуск сервера, выполнив команду ниже и открыв в
|
||||
своём любимом браузере http://localhost:8080.
|
||||
|
||||
```
|
||||
@ -501,7 +502,7 @@ docker run --rm -it -p 3400:8000 "s3rius/req-counter-express:latest"
|
||||
|
||||
- Вы можете запушить собранное приложение в [Docker HUB](https://hub.docker.com/) и использовать его.
|
||||
- Можете использовать мой образ `s3rius/req-counter-express:latest`
|
||||
- Импортировать собранный образ как tar файл и импортировать его в containerd напрямую.
|
||||
- Сохранить собранный образ как tar файл и импортировать его в containerd напрямую.
|
||||
Как это сделать почитать можно в [этой статье](https://cwienczek.com/2020/06/import-images-to-k3s-without-docker-registry/).
|
||||
|
||||
### Деплой в k8s
|
||||
@ -645,7 +646,7 @@ service/req-counter-service created
|
||||
Готово. Теперь вы можете зайти в lens, выбрать свой кластер из списка
|
||||
и посмотреть как там поживает ваше приложение.
|
||||
|
||||
Также не забудьте указать неймспей, в который вы беплоиди приложение.
|
||||
Также не забудьте указать неймспейс, в который вы деплоили приложение.
|
||||
|
||||
Выглядит это чудо примерно так:
|
||||
|
||||
@ -694,7 +695,7 @@ ingress.networking.k8s.io/req-counter-ingress unchanged
|
||||
service/req-counter-service unchanged
|
||||
```
|
||||
|
||||
Как можно видеть изменился только наш `Deployment`.
|
||||
Как можно видеть, изменился только наш `Deployment`.
|
||||
Остальные ресурсы остались нетронутыми.
|
||||
|
||||
Давайте посмотрим на поды в нашем неймспейсе.
|
||||
@ -711,16 +712,15 @@ req-counter-deployment-764476db97-x28fr 1/1 Running 0 69s
|
||||
нашего приложения.
|
||||
|
||||
|
||||
Теперь я пойду и выполню кучу запросов по адресу http://req-counter.local/
|
||||
и получу балансировку между подами из коробки, без дополнительных
|
||||
Теперь можно выполнить кучу запросов по адресу http://req-counter.local/
|
||||
и получить балансировку между подами из коробки, без дополнительных
|
||||
конфигураций.
|
||||
|
||||
Если у вас не получается найти адрес. Добавьте данный хост себе в
|
||||
`/etc/hosts` на линуксе или в `C:\Windows\System32\drivers\etc\hosts` на windows,
|
||||
дописав в конец файла следующее:
|
||||
|
||||
```
|
||||
...
|
||||
```[/etc/hosts]
|
||||
127.0.0.1 req-couter.local
|
||||
```
|
||||
|
||||
|
@ -3,7 +3,7 @@
|
||||
<b-navbar type="is-primary w-100" :fixed-top="true">
|
||||
<template #brand>
|
||||
<NuxtLink to="/" class="navbar-item">
|
||||
<img src="/icon.png" alt="Logo" /> Dev blog
|
||||
<img src="/logo.png" alt="Logo" /> Dev blog
|
||||
</NuxtLink>
|
||||
</template>
|
||||
<template #end>
|
||||
|
@ -13,8 +13,12 @@ export default {
|
||||
{ name: 'viewport', content: 'width=device-width, initial-scale=1' },
|
||||
{ hid: 'description', name: 'description', content: '' },
|
||||
{ name: 'format-detection', content: 'telephone=no' },
|
||||
{ hid: "og:image", name: 'og:image', content: "https://s3rius.blog/icon.png"}
|
||||
],
|
||||
link: [{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }],
|
||||
headAttrs: {
|
||||
"prefix": "og: http://ogp.me/ns#"
|
||||
}
|
||||
},
|
||||
|
||||
// Global CSS: https://go.nuxtjs.dev/config-css
|
||||
|
@ -48,12 +48,6 @@ export default defineComponent({
|
||||
name: 'og:image',
|
||||
content: doc.image,
|
||||
})
|
||||
} else {
|
||||
meta_data.push({
|
||||
hid: 'og:image',
|
||||
name: 'og:image',
|
||||
content: 'https://s3rius.blog/logo.png',
|
||||
})
|
||||
}
|
||||
meta.value = meta_data
|
||||
})
|
||||
|
BIN
static/icon.png
BIN
static/icon.png
Binary file not shown.
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 40 KiB |
BIN
static/logo.png
Normal file
BIN
static/logo.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 38 KiB |
Reference in New Issue
Block a user