1 added
1 removed
Original
2026-01-01
Modified
2026-02-19
1
<ul><li>/</li>
1
<ul><li>/</li>
2
<li>/</li>
2
<li>/</li>
3
</ul><ul><li>Kubernetes • 11 июня • 10 мин чтения</li>
3
</ul><ul><li>Kubernetes • 11 июня • 10 мин чтения</li>
4
</ul><p>Контейнеризация давно стала стандартом для разработки, а Kubernetes - ключевым инструментом управления. Но когда речь заходит о production-ready системах, всё усложняется: появляются YAML-манифесты, ingress-контроллеры, Helm-чарты и CI/CD пайплайны. Простое развертывание превращается в стратегию, где важна каждая команда и структура кластера.</p>
4
</ul><p>Контейнеризация давно стала стандартом для разработки, а Kubernetes - ключевым инструментом управления. Но когда речь заходит о production-ready системах, всё усложняется: появляются YAML-манифесты, ingress-контроллеры, Helm-чарты и CI/CD пайплайны. Простое развертывание превращается в стратегию, где важна каждая команда и структура кластера.</p>
5
<p>В этой статье мы разберем, каким образом развернуть приложение в кластере Kubernetes, когда конфигурация выходит за рамки "один контейнер - один pod". Вы узнаете, как подготовить Dockerfile, собрать и протестировать образ, автоматизировать доставку и масштабировать сервис с учетом реальных условий эксплуатации. А еще - получите примеры production-ready решений, которые можно адаптировать под свои задачи.</p>
5
<p>В этой статье мы разберем, каким образом развернуть приложение в кластере Kubernetes, когда конфигурация выходит за рамки "один контейнер - один pod". Вы узнаете, как подготовить Dockerfile, собрать и протестировать образ, автоматизировать доставку и масштабировать сервис с учетом реальных условий эксплуатации. А еще - получите примеры production-ready решений, которые можно адаптировать под свои задачи.</p>
6
<p>Хотите быстро разобраться в Kubernetes и начать работать с продвинутыми настройками? Освойте основы на стартовом курсе<a>"Kubernetes: База"</a>всего за 6 недель - и вы уверенно запустите свои приложения в кластерной среде.</p>
6
<p>Хотите быстро разобраться в Kubernetes и начать работать с продвинутыми настройками? Освойте основы на стартовом курсе<a>"Kubernetes: База"</a>всего за 6 недель - и вы уверенно запустите свои приложения в кластерной среде.</p>
7
<h2><strong>Стратегии развертывания сложных приложений</strong></h2>
7
<h2><strong>Стратегии развертывания сложных приложений</strong></h2>
8
<p>При работе с приложениями Kubernetes критически важно выбрать подходящую стратегию развертывания. Она определяет не только стабильность и отказоустойчивость, но и гибкость масштабирования, скорость обновлений и удобство отладки.</p>
8
<p>При работе с приложениями Kubernetes критически важно выбрать подходящую стратегию развертывания. Она определяет не только стабильность и отказоустойчивость, но и гибкость масштабирования, скорость обновлений и удобство отладки.</p>
9
<p>Разработчики часто начинают с простых решений - например, прямого деплоя через kubectl apply. Однако при работе с микросервисной архитектурой и многокомпонентными системами этого недостаточно. Здесь вступают в игру инструменты автоматизации и продвинутые подходы.</p>
9
<p>Разработчики часто начинают с простых решений - например, прямого деплоя через kubectl apply. Однако при работе с микросервисной архитектурой и многокомпонентными системами этого недостаточно. Здесь вступают в игру инструменты автоматизации и продвинутые подходы.</p>
10
<h3><strong>Rolling Update и Blue/Green</strong></h3>
10
<h3><strong>Rolling Update и Blue/Green</strong></h3>
11
<p><strong><em>Rolling update</em></strong>- стандартная стратегия в Kubernetes. Она позволяет обновлять pods поочередно, минимизируя простой. Однако если новый релиз вызывает сбои, возвращение к предыдущей версии займет время.</p>
11
<p><strong><em>Rolling update</em></strong>- стандартная стратегия в Kubernetes. Она позволяет обновлять pods поочередно, минимизируя простой. Однако если новый релиз вызывает сбои, возвращение к предыдущей версии займет время.</p>
12
-
<p><strong>Альтернатива - blue/green deployment</strong>. Вы создаете две версии приложения: текущую и новую. Переключение происходит н�� уровне ingress-контроллера. Этот подход упрощает откат и тестирование.</p>
12
+
<p><strong>Альтернатива - blue/green deployment</strong>. Вы создаете две версии приложения: текущую и новую. Переключение происходит на уровне ingress-контроллера. Этот подход упрощает откат и тестирование.</p>
13
<h3><strong>Canary deployment</strong></h3>
13
<h3><strong>Canary deployment</strong></h3>
14
<p>Еще один способ снизить риски - canary deployment. Новая версия доставляется ограниченному числу пользователей. Если всё работает корректно, охват расширяется. Часто эта стратегия реализуется в паре с CI/CD пайплайнами.</p>
14
<p>Еще один способ снизить риски - canary deployment. Новая версия доставляется ограниченному числу пользователей. Если всё работает корректно, охват расширяется. Часто эта стратегия реализуется в паре с CI/CD пайплайнами.</p>
15
<p><strong>Проверьте свои знания по Kubernetes - пройдите тест!</strong>Тест поможет определить сильные стороны и получить рекомендации для роста.</p>
15
<p><strong>Проверьте свои знания по Kubernetes - пройдите тест!</strong>Тест поможет определить сильные стороны и получить рекомендации для роста.</p>
16
<h3><strong>Helm и шаблонизация</strong></h3>
16
<h3><strong>Helm и шаблонизация</strong></h3>
17
<p>При работе с множеством сервисов удобно использовать Helm. Он позволяет параметризовать манифесты, управлять зависимостями и упрощает развёртывание сложных конфигураций.</p>
17
<p>При работе с множеством сервисов удобно использовать Helm. Он позволяет параметризовать манифесты, управлять зависимостями и упрощает развёртывание сложных конфигураций.</p>
18
<p>Дополнительно можно подключить Kustomize для оверлеев или использовать собственные скрипты в связке с GitOps-подходом.</p>
18
<p>Дополнительно можно подключить Kustomize для оверлеев или использовать собственные скрипты в связке с GitOps-подходом.</p>
19
<p>Независимо от стратегии, ключевым моментом остаётся понимание архитектуры кластера Kubernetes, сетевой топологии и зависимости между компонентами. Именно эти факторы определяют, каким образом развернуть приложение в кластере Kubernetes без потерь в производительности и надёжности.</p>
19
<p>Независимо от стратегии, ключевым моментом остаётся понимание архитектуры кластера Kubernetes, сетевой топологии и зависимости между компонентами. Именно эти факторы определяют, каким образом развернуть приложение в кластере Kubernetes без потерь в производительности и надёжности.</p>
20
<p>Курс<a>"Kubernetes Мега"</a>- для тех, кто хочет освоить продвинутые техники, CI/CD и масштабируемые архитектуры. Разберитесь с Helm, ingress и rollout-стратегиями за считанные недели - начните сегодня.</p>
20
<p>Курс<a>"Kubernetes Мега"</a>- для тех, кто хочет освоить продвинутые техники, CI/CD и масштабируемые архитектуры. Разберитесь с Helm, ingress и rollout-стратегиями за считанные недели - начните сегодня.</p>
21
<h2><strong>Подготовка Dockerfile</strong></h2>
21
<h2><strong>Подготовка Dockerfile</strong></h2>
22
<p>Любое приложение Kubernetes начинается с контейнера. А контейнер - с Dockerfile. Это отправная точка, влияющая на скорость сборки, безопасность и устойчивость всего деплоймента.</p>
22
<p>Любое приложение Kubernetes начинается с контейнера. А контейнер - с Dockerfile. Это отправная точка, влияющая на скорость сборки, безопасность и устойчивость всего деплоймента.</p>
23
<p>Правильный Dockerfile минимален и структурирован. Основной принцип: использовать облегчённые образы, исключать лишние зависимости и избегать ненужных слоёв. Например, если вы работаете с Python, отдайте предпочтение:</p>
23
<p>Правильный Dockerfile минимален и структурирован. Основной принцип: использовать облегчённые образы, исключать лишние зависимости и избегать ненужных слоёв. Например, если вы работаете с Python, отдайте предпочтение:</p>
24
<p>FROM python:3.11-slim</p>
24
<p>FROM python:3.11-slim</p>
25
<p>вместо</p>
25
<p>вместо</p>
26
<p>FROM python:3.11</p>
26
<p>FROM python:3.11</p>
27
<p>Такой выбор уменьшает итоговый размер контейнера и ускоряет загрузку в кластер.</p>
27
<p>Такой выбор уменьшает итоговый размер контейнера и ускоряет загрузку в кластер.</p>
28
<h3><strong>Структура слоёв и кэширование</strong></h3>
28
<h3><strong>Структура слоёв и кэширование</strong></h3>
29
<p>Старайтесь сначала копировать файлы зависимостей, а затем - исходный код. Это позволит Docker использовать кэш, если код не изменился:</p>
29
<p>Старайтесь сначала копировать файлы зависимостей, а затем - исходный код. Это позволит Docker использовать кэш, если код не изменился:</p>
30
<p>COPY requirements.txt . RUN pip install -r requirements.txt COPY . .</p>
30
<p>COPY requirements.txt . RUN pip install -r requirements.txt COPY . .</p>
31
<p>Такой порядок сокращает время сборки при частых обновлениях.</p>
31
<p>Такой порядок сокращает время сборки при частых обновлениях.</p>
32
<h3><strong>Определение точки входа</strong></h3>
32
<h3><strong>Определение точки входа</strong></h3>
33
<p>Укажите CMD или ENTRYPOINT, чтобы задать запуск приложения. Пример:</p>
33
<p>Укажите CMD или ENTRYPOINT, чтобы задать запуск приложения. Пример:</p>
34
<p>CMD ["python", "app.py"]</p>
34
<p>CMD ["python", "app.py"]</p>
35
<p>Добавьте HEALTHCHECK, чтобы Kubernetes мог отслеживать, работает ли приложение корректно:</p>
35
<p>Добавьте HEALTHCHECK, чтобы Kubernetes мог отслеживать, работает ли приложение корректно:</p>
36
<p>HEALTHCHECK CMD curl --fail http://localhost:8000/health || exit 1</p>
36
<p>HEALTHCHECK CMD curl --fail http://localhost:8000/health || exit 1</p>
37
<p>Такой Dockerfile станет надёжной базой для сборки и доставки приложения в Kubernetes.</p>
37
<p>Такой Dockerfile станет надёжной базой для сборки и доставки приложения в Kubernetes.</p>
38
<h2><strong>Сборка и проверка образа контейнера</strong></h2>
38
<h2><strong>Сборка и проверка образа контейнера</strong></h2>
39
<p>После подготовки Dockerfile наступает момент сборки. Здесь важно не только получить рабочий образ, но и убедиться, что он корректно функционирует - особенно перед загрузкой в кластер Kubernetes.</p>
39
<p>После подготовки Dockerfile наступает момент сборки. Здесь важно не только получить рабочий образ, но и убедиться, что он корректно функционирует - особенно перед загрузкой в кластер Kubernetes.</p>
40
<h3><strong>Сборка</strong></h3>
40
<h3><strong>Сборка</strong></h3>
41
<p>Для начала собираем образ локально:</p>
41
<p>Для начала собираем образ локально:</p>
42
<p>docker build -t my-app:latest .</p>
42
<p>docker build -t my-app:latest .</p>
43
<p>Обратите внимание: тег latest стоит использовать только на этапе тестирования.</p>
43
<p>Обратите внимание: тег latest стоит использовать только на этапе тестирования.</p>
44
<p>Для деплоя в production задавайте версионированные теги, например</p>
44
<p>Для деплоя в production задавайте версионированные теги, например</p>
45
<p>my-app:v1.0.3.</p>
45
<p>my-app:v1.0.3.</p>
46
<p>Проверить, что образ собрался корректно, можно командой:</p>
46
<p>Проверить, что образ собрался корректно, можно командой:</p>
47
<p>docker images</p>
47
<p>docker images</p>
48
<h3><strong>Локальное тестирование</strong></h3>
48
<h3><strong>Локальное тестирование</strong></h3>
49
<p>Перед отправкой образа в кластер важно удостовериться, что приложение запускается:</p>
49
<p>Перед отправкой образа в кластер важно удостовериться, что приложение запускается:</p>
50
<p>docker run -p 8000:8000 my-app:latest</p>
50
<p>docker run -p 8000:8000 my-app:latest</p>
51
<p>Проверьте, доступен ли интерфейс, работает ли API, корректно ли загружается фронтенд. Убедитесь, что переменные окружения передаются корректно - они обычно задаются через -e:</p>
51
<p>Проверьте, доступен ли интерфейс, работает ли API, корректно ли загружается фронтенд. Убедитесь, что переменные окружения передаются корректно - они обычно задаются через -e:</p>
52
<p>docker run -e ENV=production my-app:latest</p>
52
<p>docker run -e ENV=production my-app:latest</p>
53
<h3><strong>Автоматизация: linters и тесты</strong></h3>
53
<h3><strong>Автоматизация: linters и тесты</strong></h3>
54
<p>На этапе CI/CD стоит внедрить статический анализ и тесты. Используйте hadolint для проверки Dockerfile:</p>
54
<p>На этапе CI/CD стоит внедрить статический анализ и тесты. Используйте hadolint для проверки Dockerfile:</p>
55
<p>hadolint Dockerfile</p>
55
<p>hadolint Dockerfile</p>
56
<p>Подключите юнит-тесты и e2e-тесты - особенно если образ содержит несколько зависимостей или включает сложную логику.</p>
56
<p>Подключите юнит-тесты и e2e-тесты - особенно если образ содержит несколько зависимостей или включает сложную логику.</p>
57
<p>Если вы используете GitHub Actions, GitLab CI или другой пайплайн - добавьте шаги проверки, чтобы не пропускать дефектные сборки.</p>
57
<p>Если вы используете GitHub Actions, GitLab CI или другой пайплайн - добавьте шаги проверки, чтобы не пропускать дефектные сборки.</p>
58
<p>Контейнер должен быть не просто рабочим, а стабильным, масштабируемым и предсказуемым. Это фундамент для любого приложения Kubernetes.</p>
58
<p>Контейнер должен быть не просто рабочим, а стабильным, масштабируемым и предсказуемым. Это фундамент для любого приложения Kubernetes.</p>
59
<p>Делимся с вами файлом в Telegram-боте с подробным разбором долгоживущих подключений в k8s. Внутри - описание особенностей и ограничений, рекомендации по решению проблемы и разбор на практике с фрагментами кода.</p>
59
<p>Делимся с вами файлом в Telegram-боте с подробным разбором долгоживущих подключений в k8s. Внутри - описание особенностей и ограничений, рекомендации по решению проблемы и разбор на практике с фрагментами кода.</p>
60
<p><strong>Заголовок: Работа с долгоживущими подключениями</strong></p>
60
<p><strong>Заголовок: Работа с долгоживущими подключениями</strong></p>
61
<h2><strong>Развертывание образа в Kubernetes</strong></h2>
61
<h2><strong>Развертывание образа в Kubernetes</strong></h2>
62
<p>Когда контейнер готов, пора перенести его в кластер Kubernetes. На этом этапе важно правильно настроить манифесты и определить взаимодействие между компонентами: pod, service, ingress и секретами.</p>
62
<p>Когда контейнер готов, пора перенести его в кластер Kubernetes. На этом этапе важно правильно настроить манифесты и определить взаимодействие между компонентами: pod, service, ingress и секретами.</p>
63
<h3><strong>YAML-манифесты: основа конфигурации</strong></h3>
63
<h3><strong>YAML-манифесты: основа конфигурации</strong></h3>
64
<p>Каждое приложение Kubernetes начинается с Deployment:</p>
64
<p>Каждое приложение Kubernetes начинается с Deployment:</p>
65
<p>apiVersion: apps/v1kind: Deploymentmetadata:name: my-appspec:replicas: 3selector:matchLabels:app: my-apptemplate:metadata:labels:app: my-appspec:containers:- name: appimage: my-app:v1.0.3ports:- containerPort: 8000</p>
65
<p>apiVersion: apps/v1kind: Deploymentmetadata:name: my-appspec:replicas: 3selector:matchLabels:app: my-apptemplate:metadata:labels:app: my-appspec:containers:- name: appimage: my-app:v1.0.3ports:- containerPort: 8000</p>
66
<p>Для доступа к pod создаётся Service:</p>
66
<p>Для доступа к pod создаётся Service:</p>
67
<p>apiVersion: v1kind: Servicemetadata: name: my-app-servicespec: selector: app: my-app ports: - port: 80 targetPort: 8000 type: ClusterIP</p>
67
<p>apiVersion: v1kind: Servicemetadata: name: my-app-servicespec: selector: app: my-app ports: - port: 80 targetPort: 8000 type: ClusterIP</p>
68
<p>Если вы планируете внешний доступ, добавьте ingress-контроллер. Пример на базе NGINX:</p>
68
<p>Если вы планируете внешний доступ, добавьте ingress-контроллер. Пример на базе NGINX:</p>
69
<p>apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: my-app-ingressspec: rules: - host: myapp.example.com http: paths: - path: / pathType: Prefix backend: service: name: my-app-service port: number: 80</p>
69
<p>apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: my-app-ingressspec: rules: - host: myapp.example.com http: paths: - path: / pathType: Prefix backend: service: name: my-app-service port: number: 80</p>
70
<p><strong>kubectl: разворачиваем приложение</strong></p>
70
<p><strong>kubectl: разворачиваем приложение</strong></p>
71
<p>Загрузите манифесты:</p>
71
<p>Загрузите манифесты:</p>
72
<p>kubectl apply -f deployment.yaml</p>
72
<p>kubectl apply -f deployment.yaml</p>
73
<p>Проверьте статус:</p>
73
<p>Проверьте статус:</p>
74
<p>kubectl get pods</p>
74
<p>kubectl get pods</p>
75
<p>Посмотрите логи:</p>
75
<p>Посмотрите логи:</p>
76
<p>kubectl logs <pod-name></p>
76
<p>kubectl logs <pod-name></p>
77
<p>Ошибка при деплое? Используйте kubectl describe pod - он покажет, почему pod не стартует.</p>
77
<p>Ошибка при деплое? Используйте kubectl describe pod - он покажет, почему pod не стартует.</p>
78
<p>Освоить все тонкости работы с YAML, ingress-контроллерами и CI/CD можно на курсе<a>"Kubernetes Мега"</a>. Он создан для тех, кто хочет уверенно управлять кластером и запускать production-ready приложения. Присоединяйтесь - и получите навыки, которые применяются в реальных проектах.</p>
78
<p>Освоить все тонкости работы с YAML, ingress-контроллерами и CI/CD можно на курсе<a>"Kubernetes Мега"</a>. Он создан для тех, кто хочет уверенно управлять кластером и запускать production-ready приложения. Присоединяйтесь - и получите навыки, которые применяются в реальных проектах.</p>
79
<h2><strong>Примеры production-ready конфигураций</strong></h2>
79
<h2><strong>Примеры production-ready конфигураций</strong></h2>
80
<p>Настроить приложение Kubernetes - это не только запустить его, но и подготовить к настоящей эксплуатации: отказоустойчивости, безопасности и масштабированию. Ниже - несколько примеров решений, которые используют в реальных проектах.</p>
80
<p>Настроить приложение Kubernetes - это не только запустить его, но и подготовить к настоящей эксплуатации: отказоустойчивости, безопасности и масштабированию. Ниже - несколько примеров решений, которые используют в реальных проектах.</p>
81
<h3><strong>1. Применение Helm-чартов</strong></h3>
81
<h3><strong>1. Применение Helm-чартов</strong></h3>
82
<p>Helm помогает управлять многокомпонентными приложениями через шаблонизацию. Вместо десятков YAML-файлов вы описываете переменные в values.yaml, а затем запускаете:</p>
82
<p>Helm помогает управлять многокомпонентными приложениями через шаблонизацию. Вместо десятков YAML-файлов вы описываете переменные в values.yaml, а затем запускаете:</p>
83
<p>helm install my-app ./my-app-chart</p>
83
<p>helm install my-app ./my-app-chart</p>
84
<p>Такой подход позволяет легко переиспользовать конфигурации, обновлять версии и быстро переключаться между окружениями.</p>
84
<p>Такой подход позволяет легко переиспользовать конфигурации, обновлять версии и быстро переключаться между окружениями.</p>
85
<h3><strong>2. Настройка readiness и liveness probes</strong></h3>
85
<h3><strong>2. Настройка readiness и liveness probes</strong></h3>
86
<p>Для мониторинга и автоисправления стоит задать проверки:readinessProbe:</p>
86
<p>Для мониторинга и автоисправления стоит задать проверки:readinessProbe:</p>
87
<p>httpGet: path: /health port: 8000 initialDelaySeconds: 10 periodSeconds: 5</p>
87
<p>httpGet: path: /health port: 8000 initialDelaySeconds: 10 periodSeconds: 5</p>
88
<p>livenessProbe: httpGet: path: /health port: 8000 initialDelaySeconds: 30 periodSeconds: 10</p>
88
<p>livenessProbe: httpGet: path: /health port: 8000 initialDelaySeconds: 30 periodSeconds: 10</p>
89
<p>Эти настройки помогают Kubernetes автоматически перезапускать зависшие контейнеры и не направлять трафик на ещё не готовые экземпляры.</p>
89
<p>Эти настройки помогают Kubernetes автоматически перезапускать зависшие контейнеры и не направлять трафик на ещё не готовые экземпляры.</p>
90
<p>Знаете ли вы как работают requests/limits изнутри? Переходите в Telegram-бота и забирайте файл в подарок.</p>
90
<p>Знаете ли вы как работают requests/limits изнутри? Переходите в Telegram-бота и забирайте файл в подарок.</p>
91
<p><strong>Заголовок: Получите бесплатный гайд по Kubernetes</strong></p>
91
<p><strong>Заголовок: Получите бесплатный гайд по Kubernetes</strong></p>
92
<h3><strong>3. Горизонтальное масштабирование (HPA)</strong></h3>
92
<h3><strong>3. Горизонтальное масштабирование (HPA)</strong></h3>
93
<p>Чтобы адаптироваться под нагрузку, используйте автоскейлер:</p>
93
<p>Чтобы адаптироваться под нагрузку, используйте автоскейлер:</p>
94
<p>apiVersion: autoscaling/v2kind: HorizontalPodAutoscalermetadata: name: my-app-hpaspec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: my-app minReplicas: 2 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 70</p>
94
<p>apiVersion: autoscaling/v2kind: HorizontalPodAutoscalermetadata: name: my-app-hpaspec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: my-app minReplicas: 2 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 70</p>
95
<p>Это позволяет системе автоматически увеличивать или уменьшать число реплик в зависимости от загрузки CPU.</p>
95
<p>Это позволяет системе автоматически увеличивать или уменьшать число реплик в зависимости от загрузки CPU.</p>
96
<p>Production-ready конфигурации строятся на проверенных практиках: изоляции, автоматизации, мониторинге и чётком разделении ролей в кластере Kubernetes. Освоив эти подходы, вы сможете развернуть любое приложение - от стартапа до высоконагруженного сервиса.</p>
96
<p>Production-ready конфигурации строятся на проверенных практиках: изоляции, автоматизации, мониторинге и чётком разделении ролей в кластере Kubernetes. Освоив эти подходы, вы сможете развернуть любое приложение - от стартапа до высоконагруженного сервиса.</p>
97
<p>Убедитесь в своих силах - начните обучение прямо сейчас. Запишитесь на курс<a>"Kubernetes Мега"</a>и разверните свои первые production-конфигурации уже на втором модуле.</p>
97
<p>Убедитесь в своих силах - начните обучение прямо сейчас. Запишитесь на курс<a>"Kubernetes Мега"</a>и разверните свои первые production-конфигурации уже на втором модуле.</p>
98
<h3><strong>Статью подготовили</strong></h3>
98
<h3><strong>Статью подготовили</strong></h3>
99
<p>Понравилась статья? Будем рады вашему лайку и репосту - вдруг кому-то тоже пригодится:)</p>
99
<p>Понравилась статья? Будем рады вашему лайку и репосту - вдруг кому-то тоже пригодится:)</p>
100
<h3><strong>Читайте также:</strong></h3>
100
<h3><strong>Читайте также:</strong></h3>
101
101