HTML Diff
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 &lt;pod-name&gt;</p>
76 <p>kubectl logs &lt;pod-name&gt;</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