Fixed grammar issues and logo.

Signed-off-by: Pavel Kirilin <win10@list.ru>
This commit is contained in:
2021-12-10 11:54:53 +04:00
parent 68dcb8da74
commit c24d0917fe
8 changed files with 65 additions and 65 deletions

View File

@ -9,12 +9,12 @@ category: DevOps
# Разделение докера на среды # Разделение докера на среды
Должен ли ты разделять среды докера в несколько `docker-compose` файлов? Должен ли ты разделять среды докера в несколько `docker-compose` файлов?
Определенно! В некоторых случаях невозможно разобраться что разработчики хотели сделать или почему ничего не работает. Настройка раздельных сред может стать настоязей мешанино. В этой статье я покажу как настроить `docker-compose` и избежать миллиона проблем. Определенно! В некоторых случаях невозможно разобраться что разработчики хотели сделать или почему ничего не работает. Настройка раздельных сред может стать настояшей мешаниной. В этой статье я покажу как настроить `docker-compose` и избежать миллиона проблем.
Как мы вообще можем разделить среды для локальной разработки и продовые? Как мы вообще можем разделить среды для локальной разработки и продовые?
Отет прост: Требуется декомпозировать проект и создать отдельные файлы под каждую из сред или даже сервисов. Отет прост: Требуется декомпозировать проект и создать отдельные файлы под каждую из сред или даже сервисов.
Это нормально, если у тебя будет больше 2-ч `docker-compose` файлов. Это нормально, если у тебя будет больше 2-х `docker-compose` файлов.
Например: Например:
``` ```
@ -33,9 +33,9 @@ deploy
``` ```
### Как это работает? ### Как это работает?
Докер умеет работать с множеством `docker-compose` файлов одновременно.И мы можем использовать это для разделения сред. Докер умеет работать с множеством `docker-compose` файлов одновременно. И мы можем использовать это для разделения сред.
Выглядит это следующим образом. Запуск таких конфигураций выглядит следующим образом:
```bash ```bash
docker-compose \ docker-compose \
-f "deploy/docker-compose.yml" \ -f "deploy/docker-compose.yml" \
@ -46,12 +46,11 @@ docker-compose \
В каждом из этих файлов определен какой-то кусок конфигурации, который не пересекается. Например в `docker-compose.yml` определено приложение и некоторые необходимые сервисы, а в остальных файлах добавляются сервисы или меняются значения предыдущих. В каждом из этих файлов определен какой-то кусок конфигурации, который не пересекается. Например в `docker-compose.yml` определено приложение и некоторые необходимые сервисы, а в остальных файлах добавляются сервисы или меняются значения предыдущих.
Наверное, тут проще на примере пояснить. Наверное, тут проще показать на примере.
Допустим у нас есть проект, у которого поднимается бекенд с параметрами, которые отличаются на проде и локально. Допустим у нас есть проект, у которого поднимается бекенд с параметрами, которые отличаются на проде и локально.
Для простоты создадим простецикий проект со следующей структурой. Для простоты примера создадим простецкий проект со следующей структурой:
``` ```
proj proj
├── deploy ├── deploy
@ -66,7 +65,7 @@ proj
from sys import argv # это аргуметы переданные в скрипт from sys import argv # это аргуметы переданные в скрипт
def main(): def main():
print("; ".join(argv[1:])) # выводитна экран все аргументы программы print("; ".join(argv[1:])) # выводит на экран все аргументы программы
if __name__ == "__main__": if __name__ == "__main__":
main() main()

View File

@ -6,9 +6,12 @@ category: 'DevOps'
--- ---
# Makefiles для чайников # Makefiles для чайников
Если описывать в двух словах, то это просто описание команд для упрощения работы с проектом. Изначально делались для того, чтобы удобно компилировать всякие проекты на любых языках. Что такое мейкфайлы? Вы наверняка их встречали,
если собирали проекты из ихсодных файлов.
Если описывать в двух словах, то это просто описание команд для упрощения работы
с проектом. Изначально делались для того, чтобы удобно компилировать всякие проекты на любых языках.
## Как они работают ## Как они работают?
Достаточно просто. Достаточно просто.
Вот пример `Makefile`: Вот пример `Makefile`:
@ -37,7 +40,7 @@ Hi!
## Зависимости таргетов ## Зависимости таргетов
На строчке объявления таргета `run` видно, что объявлен `test.gen`. Это зависимость данного таргета и она будет вызвана до того, как выполнится скрипт описываемого таргета. Таких зависимостей может быть много, перечисляются они чере пробел. На строчке объявления таргета `run` видно, что объявлен `test.gen`. Это зависимость данного таргета и она будет вызвана до того, как выполнится скрипт описываемого таргета. Таких зависимостей может быть много, перечисляются они через пробел.
Например: Например:
```makefile{}[Makefile] ```makefile{}[Makefile]
@ -96,7 +99,7 @@ memes
## Валидация сгенерированных файлов ## Валидация сгенерированных файлов
Зачастую `Makefile` используют для компиляции С и зачастую требуется Зачастую `Makefile` используют для компиляции С и зачастую требуется
собрать какую-либо часть проект и пропустить сборку этой части, если эта часть уже собрана. собрать какую-либо часть проекта в файл и пропустить сборку этого файла, если он уже собран.
Раскрою секрет, в Makefile это базовый функционал. Раскрою секрет, в Makefile это базовый функционал.
Давайте немного поменяем первый Makefile и запустим дважды. Давайте немного поменяем первый Makefile и запустим дважды.

View File

@ -7,15 +7,15 @@ position: 4
# Проблема в изучении кубернетес # Проблема в изучении кубернетес
Многие люди, кто задавались вопросом как начать работать с Многие люди, кто задавались вопросом "Как начать работать с
кубернетесом сталкивались с тем, что документация крайне кубернетес?", сталкивались с тем, что документация крайне
большая сложная и нет нормального описания как большая сложная и нет нормального описания как
завернуть маленький проект из одного проекта в свой кластер или завернуть маленький проект из одного контейнра в свой кластер или
как развернуть свой кластер без боли. как развернуть сам кластер без боли.
А всё потому что вся документация нацелена на большие А всё потому что вся документация нацелена на большие
production-ready системы с большим rps и тому подобным. production-ready системы с большим rps и тому подобным.
<br>
В данной статье я попробую исправить это вселенское В данной статье я попробую исправить это вселенское
недопонимание используя k3s, свой комплюктер и немного знаний по кодингу. недопонимание используя k3s, свой комплюктер и немного знаний по кодингу.
@ -28,12 +28,12 @@ production-ready системы с большим rps и тому подобны
# Что такое кубернетес и почему это лучше докера # Что такое кубернетес и почему это лучше докера
Многие ребята, кто хорошо знаком с докером и его Многие ребята, кто хорошо знаком с докером и его
возможностями могут задаваться таким вопросом. возможностями, могут задаваться таким вопросом.
Для тех кто в танке, напомню, что докер Для тех кто в танке, напомню, что докер
имеет вариант запуска в режиме кластера. имеет вариант запуска в режиме кластера.
Этот функционал называется docker swarm. Этот функционал называется [docker swarm](https://docs.docker.com/engine/swarm/).
В целом, swarm отдалённо напоминает kubernetes, В целом, swarm отдалённо напоминает kubernetes,
так как в этом режиме докер, худо-бедно но умеет так как в этом режиме докер худо-бедно умеет
автоскейлится и запускаться в кластере, автоскейлится и запускаться в кластере,
но это всё равно немного не то. но это всё равно немного не то.
@ -54,7 +54,7 @@ production-ready системы с большим rps и тому подобны
Так как я в этой статье хотел затронуть Так как я в этой статье хотел затронуть
совсем базовые и практические вещи, то рассматривать совсем базовые и практические вещи, то рассматривать
мы будем только крайне полезные компоненты. мы будем только самые часто используемые компоненты.
- Container - Container
- Pod - Pod
@ -65,12 +65,12 @@ production-ready системы с большим rps и тому подобны
- Secret - Secret
- ConfigMap - ConfigMap
А теперь рассмотрим немного поподробнее. А теперь рассмотрим каждый ресурс немного поподробнее.
## Container ## Container
Контейнеры не то чтобы часть специфичная для кубернетес. Контейнеры не являются чем-то специфичным для кубернетес.
С контейнерами вы можете быть знакомы из кучи систем. С контейнерами вы можете быть знакомы из кучи других систем.
В контексте кубера они не обладают никакими дополнительными В контексте кубера они не обладают никакими дополнительными
свойствами. Это ровно то же, что и контейнеры `containerd` свойствами. Это ровно то же, что и контейнеры `containerd`
или те, с которыми вы возились с докером. Ничего нового. или те, с которыми вы возились с докером. Ничего нового.
@ -80,9 +80,9 @@ production-ready системы с большим rps и тому подобны
<b-message type="is-warning" has-icon> <b-message type="is-warning" has-icon>
Важная ремарка. Кубер начиная с 2021 кубернетес не поддерживает Важная ремарка. Кубер, начиная с 2021 года, не поддерживает
докер как бэкенд. Теперь кубер будет общаться с докер как бэкенд. Теперь он будет общаться с
containerd напрямую. Это значит, что теперь перед использованием containerd напрямую. Это значит, что перед использованием
контейнеров собранных на локальной машине надо будет импортировать их контейнеров собранных на локальной машине надо будет импортировать их
в `containerd` используя `ctr image import`. в `containerd` используя `ctr image import`.
@ -101,9 +101,9 @@ production-ready системы с большим rps и тому подобны
В поде находится от одного до множества контейнеров. В поде находится от одного до множества контейнеров.
Интересная особенность пода в том, что все контейнеры Интересная особенность пода в том, что все контейнеры
делят один сетевой адресс. Другими словами, делят один сетевой адрес. Другими словами,
если у вас один из контейнеров открыл порт `3000`, если у вас один из контейнеров открыл порт `3000`,
то другие контейнеры из пода эти порты использовать не смогут. то другие контейнеры из пода этот порт использовать не смогут.
То есть, если вы хотите логически связанные приложения То есть, если вы хотите логически связанные приложения
поместить в под, то они могут ходить друг к другу через лупбек поместить в под, то они могут ходить друг к другу через лупбек
@ -120,10 +120,10 @@ production-ready системы с большим rps и тому подобны
<br> <br>
Deployment нужна именно для описания подов и создания Deployment нужен именно для описания подов и создания
некоторых ресурсов, нужных для скейлинга. некоторых ресурсов, нужных для скейлинга.
Также с помощью деплойментов можно делать откаты приложения через Также с помощью деплойментов можно делать откаты приложения через
механиз роллбеков. Я это рассматривать не буду. Тут только база. механиз роллбеков. Я это рассматривать не буду. В этой статье только база.
## Service ## Service
@ -147,7 +147,7 @@ Deployment нужна именно для описания подов и соз
Также сервис выступает как балансировщик. Также сервис выступает как балансировщик.
<b-message type="is-info" has-icon> <b-message type="is-info" has-icon>
Если вы хотите сделать запрос от одного пода до дргого внутри кластера, то Если вы хотите сделать запрос от одного пода до дргого, внутри кластера, то
вам придётся использовать сервис. вам придётся использовать сервис.
<br> <br>
Если вы попробуете сделать запрос напрямую по IP пода, то у вас, конечно же, Если вы попробуете сделать запрос напрямую по IP пода, то у вас, конечно же,
@ -157,7 +157,7 @@ Deployment нужна именно для описания подов и соз
## Ingress ## Ingress
Ингрессы это сервис описывающий куда пускать трафик, Ингресс - это сервис описывающий куда пускать трафик,
который поступает снаружи кластера. который поступает снаружи кластера.
<div align="center"> <div align="center">
@ -168,9 +168,9 @@ Deployment нужна именно для описания подов и соз
Принцип работы ингресса следующий: Принцип работы ингресса следующий:
Вы указываете хост ингресса и различные регексы пути. Вы указываете хост ингресса и различные пути.
В зависимости от входящего запроса ингресс выбирает в какой сервис В зависимости от входящего запроса ингресс выбирает в какой сервис
направить его и в какой порт. направить запрос и в какой порт.
Настройка ингресса достаточно гибкая и я не думаю, Настройка ингресса достаточно гибкая и я не думаю,
что вы можете столкнуться с какими либо проблемами. что вы можете столкнуться с какими либо проблемами.
@ -218,10 +218,10 @@ Deployment нужна именно для описания подов и соз
- minikube - minikube
На первый взгляд minikube может показаться лучшим вариантом. На первый взгляд minikube может показаться лучшим вариантом.
И он действительно хорош тем, что его легко почистить после И он действительно хорош тем, что его легко развернуть и почистить после
своих экспериментов. Однако, там есть проблемы с ингрессами. своих экспериментов. Однако, там есть проблемы с ингрессами.
По факту они не работают и там надо окольными путями получать По факту они не работают и там надо окольными путями получать
адреса приложения. адреса.
<br> <br>
@ -238,11 +238,10 @@ k3s - это легковесная production-ready реализация k8s. I
## Подключение кластера ## Подключение кластера
После установки в домашней дериктории должен был быть После установки `kubectl` в домашней дериктории должен был быть
сгенерирован файл `.kube/config`. Этот файл содержит данные для сгенерирован файл `.kube/config`. Этот файл содержит данные для
подключения к различным кластерам. `minikube` Сам добавляет подключения к различным кластерам. `minikube` Сам добавляет
ключи для подключения к .kube/config. `K3S` не изменяет ключи для подключения к .kube/config. `K3S` никак не изменяет `.kube/config`, поэтому надо будет это сделать вручную.
никаким образом `.kube/config`, поэтому надо будет это сделать вручную.
Для того, чтобы это сделать сначала разберёмся как выглядит конфиг. Для того, чтобы это сделать сначала разберёмся как выглядит конфиг.
@ -298,27 +297,28 @@ current-context: "k3s"
можете передать параметр `--context $CONTEXT_NAME`, где `$CONTEXT_NAME` это название контекста. можете передать параметр `--context $CONTEXT_NAME`, где `$CONTEXT_NAME` это название контекста.
Чтобы достать данные для подключения к `k3s` надо посмотреть его конфиг Чтобы достать данные для подключения к `k3s` надо посмотреть его конфиг
и скопировать данные. Либо выставить переменную среды, которая будет и скопировать данные. Либо выставить переменную среды `KUBECONFIG`, которая будет
указывать конфиг k3s. Конфиг подключения `k3s` лежит в файле `/etc/rancher/k3s/k3s.yaml`. указывать конфиг k3s. Конфиг подключения `k3s` лежит в файле `/etc/rancher/k3s/k3s.yaml`.
Можете выполнить команду, которая будет просить kubectl использовать указанный конфиг: Можете выполнить команду, которая будет просить kubectl использовать указанный конфиг:
`export KUBE_CONFIG=/etc/rancher/k3s/k3s.yaml` `export KUBECONFIG=/etc/rancher/k3s/k3s.yaml`
<br> <br>
Либо скопируйте нужные данные для подключения себе в `.kube/config`. Либо скопируйте нужные данные для подключения себе в `.kube/config`.
После настройки выполните команду и проверьте что вам вернулось После настройки выполните команду и проверьте что вам вернулось
что-то подобное. Это значит, что никаких ресурсов пока в что-то подобное.
кластере нет. Это мы исправим позже. Пока что можно сказать,
что подключение прошло успешно.
```bash ```bash
$ kubectl --context "my-context" get pods $ kubectl --context "my-context" get pods
No resources found in default namespace. No resources found in default namespace.
``` ```
Если же у вас выпадает ошибка, например такая. Это значит, что никаких ресурсов пока в
кластере нет. Это мы исправим чуть позже. Пока что можно сказать,
что подключение прошло успешно.
Если же у вас выпадает ошибка, например такая:
``` ```
The connection to the server localhost:8080 was refused - did you specify the right host or port? 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](https://k8slens.dev/). Это крайне
удобный интерфейс для управления своим кластером. удобный интерфейс для управления своим кластером.
Также там есть очень клёвая настрока, которая сама включит мониторинг Также там есть очень клёвая настройка, которая сама включит мониторинг
потребления памяти и процессора для всех подов и кластера в общем. потребления памяти и процессора для всех подов и кластера в общем.
На локальной машине это не очень много смысла имеет, На локальной машине это не имеет смысла,
а вот в проде было бы очень полезно. а вот в проде было бы очень полезно.
Выглядит Lens примерно так: Выглядит Lens примерно так:
@ -437,7 +438,7 @@ app.listen(port, host, () => {
Это всё. Сервер готов. Это всё. Сервер готов.
<hr> <hr>
Протестируем запуск сервера выполнив команду ниже и открыв в Протестируем запуск сервера, выполнив команду ниже и открыв в
своём любимом браузере http://localhost:8080. своём любимом браузере 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/) и использовать его. - Вы можете запушить собранное приложение в [Docker HUB](https://hub.docker.com/) и использовать его.
- Можете использовать мой образ `s3rius/req-counter-express:latest` - Можете использовать мой образ `s3rius/req-counter-express:latest`
- Импортировать собранный образ как tar файл и импортировать его в containerd напрямую. - Сохранить собранный образ как tar файл и импортировать его в containerd напрямую.
Как это сделать почитать можно в [этой статье](https://cwienczek.com/2020/06/import-images-to-k3s-without-docker-registry/). Как это сделать почитать можно в [этой статье](https://cwienczek.com/2020/06/import-images-to-k3s-without-docker-registry/).
### Деплой в k8s ### Деплой в k8s
@ -645,7 +646,7 @@ service/req-counter-service created
Готово. Теперь вы можете зайти в lens, выбрать свой кластер из списка Готово. Теперь вы можете зайти в lens, выбрать свой кластер из списка
и посмотреть как там поживает ваше приложение. и посмотреть как там поживает ваше приложение.
Также не забудьте указать неймспей, в который вы беплоиди приложение. Также не забудьте указать неймспейс, в который вы деплоили приложение.
Выглядит это чудо примерно так: Выглядит это чудо примерно так:
@ -694,7 +695,7 @@ ingress.networking.k8s.io/req-counter-ingress unchanged
service/req-counter-service 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` на линуксе или в `C:\Windows\System32\drivers\etc\hosts` на windows,
дописав в конец файла следующее: дописав в конец файла следующее:
``` ```[/etc/hosts]
...
127.0.0.1 req-couter.local 127.0.0.1 req-couter.local
``` ```

View File

@ -3,7 +3,7 @@
<b-navbar type="is-primary w-100" :fixed-top="true"> <b-navbar type="is-primary w-100" :fixed-top="true">
<template #brand> <template #brand>
<NuxtLink to="/" class="navbar-item"> <NuxtLink to="/" class="navbar-item">
<img src="/icon.png" alt="Logo" /> Dev blog <img src="/logo.png" alt="Logo" /> Dev blog
</NuxtLink> </NuxtLink>
</template> </template>
<template #end> <template #end>

View File

@ -13,8 +13,12 @@ export default {
{ name: 'viewport', content: 'width=device-width, initial-scale=1' }, { name: 'viewport', content: 'width=device-width, initial-scale=1' },
{ hid: 'description', name: 'description', content: '' }, { hid: 'description', name: 'description', content: '' },
{ name: 'format-detection', content: 'telephone=no' }, { 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' }], 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 // Global CSS: https://go.nuxtjs.dev/config-css

View File

@ -48,12 +48,6 @@ export default defineComponent({
name: 'og:image', name: 'og:image',
content: doc.image, content: doc.image,
}) })
} else {
meta_data.push({
hid: 'og:image',
name: 'og:image',
content: 'https://s3rius.blog/logo.png',
})
} }
meta.value = meta_data meta.value = meta_data
}) })

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 40 KiB

BIN
static/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB