Initial commit: Complete Software Architecture course with 11 modules
- Added comprehensive course structure with 11 modules - Included theoretical content, practical examples, and tasks - Multi-language code examples (Java, Rust, Node.js, Python) - Detailed analysis of architectural approaches and trade-offs - Complete caching strategies documentation - Architecture examples from real-world systems (Twitter, Netflix, Uber) - Structured navigation and learning path - Ready for educational use
This commit is contained in:
commit
15e744da49
107 files changed
+61762
No files matched your search
@@ -0,0 +1,60 @@
|
||||
# Основы контейнеризации
|
||||
|
||||
## Навигация
|
||||
- [🏠 Главная страница курса](../../../README.md)
|
||||
- [📚 Модуль 3](../README.md)
|
||||
|
||||
---
|
||||
|
||||
## Что такое контейнеризация
|
||||
|
||||
**Контейнеризация** — это технология упаковки приложений и их зависимостей в легковесные, переносимые контейнеры.
|
||||
|
||||
## Преимущества контейнеризации
|
||||
|
||||
### 1. Портабельность
|
||||
- Одинаковая среда на всех платформах
|
||||
- "Работает на моей машине" больше не проблема
|
||||
- Легкая миграция между средами
|
||||
|
||||
### 2. Изоляция
|
||||
- Приложения изолированы друг от друга
|
||||
- Контроль ресурсов
|
||||
- Безопасность
|
||||
|
||||
### 3. Масштабируемость
|
||||
- Быстрое создание и удаление контейнеров
|
||||
- Горизонтальное масштабирование
|
||||
- Эффективное использование ресурсов
|
||||
|
||||
### 4. Консистентность
|
||||
- Одинаковая среда разработки, тестирования и продакшена
|
||||
- Предсказуемое поведение
|
||||
- Упрощение развертывания
|
||||
|
||||
## Контейнеры vs Виртуальные машины
|
||||
|
||||
| Аспект | Контейнеры | Виртуальные машины |
|
||||
|--------|------------|-------------------|
|
||||
| Изоляция | Процессная | Аппаратная |
|
||||
| Размер | МБ | ГБ |
|
||||
| Запуск | Секунды | Минуты |
|
||||
| Ресурсы | Общие | Выделенные |
|
||||
| Безопасность | Процессная | Аппаратная |
|
||||
|
||||
## Компоненты контейнеризации
|
||||
|
||||
### 1. Container Runtime
|
||||
- **containerd** — стандартный runtime
|
||||
- **runc** — низкоуровневый runtime
|
||||
- **CRI-O** — Kubernetes-специфичный runtime
|
||||
|
||||
### 2. Container Image
|
||||
- Неизменяемый образ приложения
|
||||
- Слоистая структура
|
||||
- Версионирование
|
||||
|
||||
### 3. Container Registry
|
||||
- Хранение образов
|
||||
- Версионирование
|
||||
- Безопасность
|
||||
@@ -0,0 +1,369 @@
|
||||
# Docker
|
||||
|
||||
## Навигация
|
||||
- [🏠 Главная страница курса](../../../README.md)
|
||||
- [📚 Модуль 3](../README.md)
|
||||
|
||||
---
|
||||
|
||||
## Основы Docker
|
||||
|
||||
**Docker** — платформа для разработки, доставки и запуска приложений в контейнерах.
|
||||
|
||||
## Архитектура Docker
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────┐
|
||||
│ Docker Client │
|
||||
├─────────────────────────────────────┤
|
||||
│ Docker Daemon │
|
||||
│ ┌─────────────┐ ┌─────────────────┐ │
|
||||
│ │ Images │ │ Containers │ │
|
||||
│ └─────────────┘ └─────────────────┘ │
|
||||
├─────────────────────────────────────┤
|
||||
│ Container Runtime │
|
||||
└─────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## Dockerfile
|
||||
|
||||
**Dockerfile** — текстовый файл с инструкциями для создания образа.
|
||||
|
||||
### Технический пример - Dockerfile для Spring Boot приложения:
|
||||
|
||||
```dockerfile
|
||||
# Многоэтапная сборка для оптимизации размера образа
|
||||
# Этап 1: Сборка приложения
|
||||
FROM maven:3.8.6-openjdk-17-slim AS build
|
||||
|
||||
# Установка рабочей директории
|
||||
WORKDIR /app
|
||||
|
||||
# Копирование файлов pom.xml для кэширования зависимостей
|
||||
COPY pom.xml .
|
||||
COPY src ./src
|
||||
|
||||
# Сборка приложения
|
||||
RUN mvn clean package -DskipTests
|
||||
|
||||
# Этап 2: Создание финального образа
|
||||
FROM openjdk:17-jre-slim
|
||||
|
||||
# Установка рабочей директории
|
||||
WORKDIR /app
|
||||
|
||||
# Создание пользователя для безопасности
|
||||
RUN groupadd -r appuser && useradd -r -g appuser appuser
|
||||
|
||||
# Копирование собранного JAR файла
|
||||
COPY --from=build /app/target/*.jar app.jar
|
||||
|
||||
# Изменение владельца файлов
|
||||
RUN chown -R appuser:appuser /app
|
||||
USER appuser
|
||||
|
||||
# Открытие порта
|
||||
EXPOSE 8080
|
||||
|
||||
# Переменные окружения
|
||||
ENV JAVA_OPTS="-Xmx512m -Xms256m"
|
||||
ENV SPRING_PROFILES_ACTIVE=production
|
||||
|
||||
# Health check
|
||||
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
|
||||
CMD curl -f http://localhost:8080/actuator/health || exit 1
|
||||
|
||||
# Запуск приложения
|
||||
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]
|
||||
```
|
||||
|
||||
### Dockerfile для микросервиса на Node.js:
|
||||
|
||||
```dockerfile
|
||||
# Базовый образ Node.js
|
||||
FROM node:18-alpine AS base
|
||||
|
||||
# Установка рабочей директории
|
||||
WORKDIR /app
|
||||
|
||||
# Установка системных зависимостей
|
||||
RUN apk add --no-cache \
|
||||
dumb-init \
|
||||
curl
|
||||
|
||||
# Создание пользователя для безопасности
|
||||
RUN addgroup -g 1001 -S nodejs && \
|
||||
adduser -S nextjs -u 1001
|
||||
|
||||
# Этап установки зависимостей
|
||||
FROM base AS deps
|
||||
COPY package*.json ./
|
||||
RUN npm ci --only=production && npm cache clean --force
|
||||
|
||||
# Этап сборки
|
||||
FROM base AS builder
|
||||
COPY package*.json ./
|
||||
RUN npm ci
|
||||
COPY . .
|
||||
RUN npm run build
|
||||
|
||||
# Финальный этап
|
||||
FROM base AS runner
|
||||
ENV NODE_ENV=production
|
||||
|
||||
# Копирование зависимостей
|
||||
COPY --from=deps /app/node_modules ./node_modules
|
||||
COPY --from=builder /app/dist ./dist
|
||||
COPY --from=builder /app/public ./public
|
||||
|
||||
# Копирование конфигурационных файлов
|
||||
COPY --from=builder /app/package.json ./package.json
|
||||
|
||||
# Изменение владельца файлов
|
||||
RUN chown -R nextjs:nodejs /app
|
||||
USER nextjs
|
||||
|
||||
# Открытие порта
|
||||
EXPOSE 3000
|
||||
|
||||
# Health check
|
||||
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
|
||||
CMD curl -f http://localhost:3000/health || exit 1
|
||||
|
||||
# Запуск приложения
|
||||
ENTRYPOINT ["dumb-init", "--"]
|
||||
CMD ["node", "dist/index.js"]
|
||||
```
|
||||
|
||||
## Docker Compose
|
||||
|
||||
**Docker Compose** — инструмент для определения и запуска многоконтейнерных приложений.
|
||||
|
||||
### Docker Compose для микросервисной архитектуры:
|
||||
|
||||
```yaml
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
# API Gateway
|
||||
api-gateway:
|
||||
build:
|
||||
context: ./api-gateway
|
||||
dockerfile: Dockerfile
|
||||
ports:
|
||||
- "8080:8080"
|
||||
environment:
|
||||
- SPRING_PROFILES_ACTIVE=docker
|
||||
- EUREKA_CLIENT_SERVICE_URL_DEFAULTZONE=http://eureka:8761/eureka/
|
||||
depends_on:
|
||||
- eureka
|
||||
- user-service
|
||||
- order-service
|
||||
- payment-service
|
||||
networks:
|
||||
- microservices-network
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
|
||||
# Service Discovery
|
||||
eureka:
|
||||
image: steeltoeoss/eureka-server:latest
|
||||
ports:
|
||||
- "8761:8761"
|
||||
environment:
|
||||
- EUREKA_CLIENT_REGISTER_WITH_EUREKA=false
|
||||
- EUREKA_CLIENT_FETCH_REGISTRY=false
|
||||
networks:
|
||||
- microservices-network
|
||||
|
||||
# User Service
|
||||
user-service:
|
||||
build:
|
||||
context: ./user-service
|
||||
dockerfile: Dockerfile
|
||||
ports:
|
||||
- "8081:8080"
|
||||
environment:
|
||||
- SPRING_PROFILES_ACTIVE=docker
|
||||
- SPRING_DATASOURCE_URL=jdbc:postgresql://user-db:5432/userdb
|
||||
- SPRING_DATASOURCE_USERNAME=user
|
||||
- SPRING_DATASOURCE_PASSWORD=password
|
||||
- EUREKA_CLIENT_SERVICE_URL_DEFAULTZONE=http://eureka:8761/eureka/
|
||||
depends_on:
|
||||
- user-db
|
||||
- eureka
|
||||
networks:
|
||||
- microservices-network
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
|
||||
# Databases
|
||||
user-db:
|
||||
image: postgres:15-alpine
|
||||
environment:
|
||||
- POSTGRES_DB=userdb
|
||||
- POSTGRES_USER=user
|
||||
- POSTGRES_PASSWORD=password
|
||||
volumes:
|
||||
- user_data:/var/lib/postgresql/data
|
||||
- ./init-scripts/user-db-init.sql:/docker-entrypoint-initdb.d/init.sql
|
||||
networks:
|
||||
- microservices-network
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U user -d userdb"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
# Message Queue
|
||||
rabbitmq:
|
||||
image: rabbitmq:3.11-management-alpine
|
||||
ports:
|
||||
- "5672:5672"
|
||||
- "15672:15672"
|
||||
environment:
|
||||
- RABBITMQ_DEFAULT_USER=admin
|
||||
- RABBITMQ_DEFAULT_PASS=admin
|
||||
volumes:
|
||||
- rabbitmq_data:/var/lib/rabbitmq
|
||||
networks:
|
||||
- microservices-network
|
||||
healthcheck:
|
||||
test: ["CMD", "rabbitmq-diagnostics", "ping"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
|
||||
# Monitoring
|
||||
prometheus:
|
||||
image: prom/prometheus:latest
|
||||
ports:
|
||||
- "9090:9090"
|
||||
volumes:
|
||||
- ./monitoring/prometheus.yml:/etc/prometheus/prometheus.yml
|
||||
- prometheus_data:/prometheus
|
||||
command:
|
||||
- '--config.file=/etc/prometheus/prometheus.yml'
|
||||
- '--storage.tsdb.path=/prometheus'
|
||||
- '--web.console.libraries=/etc/prometheus/console_libraries'
|
||||
- '--web.console.templates=/etc/prometheus/consoles'
|
||||
- '--storage.tsdb.retention.time=200h'
|
||||
- '--web.enable-lifecycle'
|
||||
networks:
|
||||
- microservices-network
|
||||
|
||||
grafana:
|
||||
image: grafana/grafana:latest
|
||||
ports:
|
||||
- "3000:3000"
|
||||
environment:
|
||||
- GF_SECURITY_ADMIN_PASSWORD=admin
|
||||
volumes:
|
||||
- grafana_data:/var/lib/grafana
|
||||
- ./monitoring/grafana/dashboards:/etc/grafana/provisioning/dashboards
|
||||
- ./monitoring/grafana/datasources:/etc/grafana/provisioning/datasources
|
||||
networks:
|
||||
- microservices-network
|
||||
|
||||
volumes:
|
||||
user_data:
|
||||
rabbitmq_data:
|
||||
prometheus_data:
|
||||
grafana_data:
|
||||
|
||||
networks:
|
||||
microservices-network:
|
||||
driver: bridge
|
||||
```
|
||||
|
||||
## Команды Docker
|
||||
|
||||
### Основные команды:
|
||||
```bash
|
||||
# Сборка образа
|
||||
docker build -t myapp:latest .
|
||||
|
||||
# Запуск контейнера
|
||||
docker run -p 3000:3000 myapp:latest
|
||||
|
||||
# Просмотр запущенных контейнеров
|
||||
docker ps
|
||||
|
||||
# Просмотр всех контейнеров
|
||||
docker ps -a
|
||||
|
||||
# Остановка контейнера
|
||||
docker stop <container_id>
|
||||
|
||||
# Удаление контейнера
|
||||
docker rm <container_id>
|
||||
|
||||
# Просмотр образов
|
||||
docker images
|
||||
|
||||
# Удаление образа
|
||||
docker rmi <image_id>
|
||||
```
|
||||
|
||||
### Продвинутые команды:
|
||||
```bash
|
||||
# Запуск в фоновом режиме
|
||||
docker run -d -p 3000:3000 myapp:latest
|
||||
|
||||
# Подключение к контейнеру
|
||||
docker exec -it <container_id> /bin/bash
|
||||
|
||||
# Просмотр логов
|
||||
docker logs <container_id>
|
||||
|
||||
# Мониторинг ресурсов
|
||||
docker stats <container_id>
|
||||
```
|
||||
|
||||
## Лучшие практики Docker
|
||||
|
||||
### 1. Оптимизация размера образа
|
||||
```dockerfile
|
||||
# Используйте многоэтапную сборку
|
||||
FROM node:18-alpine AS builder
|
||||
WORKDIR /app
|
||||
COPY package*.json ./
|
||||
RUN npm ci
|
||||
COPY . .
|
||||
RUN npm run build
|
||||
|
||||
FROM node:18-alpine AS production
|
||||
WORKDIR /app
|
||||
COPY package*.json ./
|
||||
RUN npm ci --only=production
|
||||
COPY --from=builder /app/dist ./dist
|
||||
CMD ["npm", "start"]
|
||||
```
|
||||
|
||||
### 2. Безопасность
|
||||
```dockerfile
|
||||
# Создайте пользователя без root прав
|
||||
RUN addgroup -g 1001 -S nodejs
|
||||
RUN adduser -S nextjs -u 1001
|
||||
USER nextjs
|
||||
```
|
||||
|
||||
### 3. Кэширование слоев
|
||||
```dockerfile
|
||||
# Копируйте package.json перед исходным кодом
|
||||
COPY package*.json ./
|
||||
RUN npm ci
|
||||
COPY . .
|
||||
```
|
||||
|
||||
### 4. Health Checks
|
||||
```dockerfile
|
||||
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
|
||||
CMD curl -f http://localhost:3000/health || exit 1
|
||||
```
|
||||
@@ -0,0 +1,486 @@
|
||||
# Kubernetes
|
||||
|
||||
## Навигация
|
||||
- [🏠 Главная страница курса](../../../README.md)
|
||||
- [📚 Модуль 3](../README.md)
|
||||
|
||||
---
|
||||
|
||||
## Что такое Kubernetes
|
||||
|
||||
**Kubernetes (K8s)** — система оркестрации контейнеров для автоматизации развертывания, масштабирования и управления приложениями.
|
||||
|
||||
## Архитектура Kubernetes
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────┐
|
||||
│ Control Plane │
|
||||
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────┐ │
|
||||
│ │ API Server │ │ Scheduler │ │ Controller Mgr │ │
|
||||
│ └─────────────┘ └─────────────┘ └─────────────────┘ │
|
||||
│ ┌─────────────┐ ┌─────────────┐ │
|
||||
│ │ etcd │ │ Cloud Ctlr │ │
|
||||
│ └─────────────┘ └─────────────┘ │
|
||||
└─────────────────────────────────────────────────────────┘
|
||||
│
|
||||
┌─────────────────────────────────────────────────────────┐
|
||||
│ Worker Nodes │
|
||||
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────┐ │
|
||||
│ │ kubelet │ │ kube-proxy │ │ Container Runtime│ │
|
||||
│ └─────────────┘ └─────────────┘ └─────────────────┘ │
|
||||
└─────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## Основные компоненты
|
||||
|
||||
### Плоскость управления:
|
||||
- **API Server** — центральный компонент управления
|
||||
- **etcd** — хранилище конфигурации
|
||||
- **Scheduler** — планировщик подов
|
||||
- **Controller Manager** — контроллеры системы
|
||||
|
||||
### Рабочие узлы:
|
||||
- **kubelet** — агент на каждом узле
|
||||
- **kube-proxy** — сетевой прокси
|
||||
- **Container Runtime** — Docker, containerd, CRI-O
|
||||
|
||||
## Объекты Kubernetes
|
||||
|
||||
### 1. Pod
|
||||
**Pod** — наименьшая единица развертывания в Kubernetes.
|
||||
|
||||
```yaml
|
||||
apiVersion: v1
|
||||
kind: Pod
|
||||
metadata:
|
||||
name: user-service-pod
|
||||
labels:
|
||||
app: user-service
|
||||
version: v1.0.0
|
||||
annotations:
|
||||
prometheus.io/scrape: "true"
|
||||
prometheus.io/port: "8080"
|
||||
prometheus.io/path: "/actuator/prometheus"
|
||||
spec:
|
||||
containers:
|
||||
- name: user-service
|
||||
image: user-service:latest
|
||||
ports:
|
||||
- containerPort: 8080
|
||||
name: http
|
||||
protocol: TCP
|
||||
env:
|
||||
- name: SPRING_PROFILES_ACTIVE
|
||||
value: "kubernetes"
|
||||
- name: SPRING_DATASOURCE_URL
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: user-db-secret
|
||||
key: url
|
||||
resources:
|
||||
requests:
|
||||
memory: "256Mi"
|
||||
cpu: "250m"
|
||||
limits:
|
||||
memory: "512Mi"
|
||||
cpu: "500m"
|
||||
livenessProbe:
|
||||
httpGet:
|
||||
path: /actuator/health/liveness
|
||||
port: 8080
|
||||
initialDelaySeconds: 30
|
||||
periodSeconds: 10
|
||||
timeoutSeconds: 5
|
||||
failureThreshold: 3
|
||||
readinessProbe:
|
||||
httpGet:
|
||||
path: /actuator/health/readiness
|
||||
port: 8080
|
||||
initialDelaySeconds: 5
|
||||
periodSeconds: 5
|
||||
timeoutSeconds: 3
|
||||
failureThreshold: 3
|
||||
volumeMounts:
|
||||
- name: config-volume
|
||||
mountPath: /app/config
|
||||
readOnly: true
|
||||
volumes:
|
||||
- name: config-volume
|
||||
configMap:
|
||||
name: user-service-config
|
||||
restartPolicy: Always
|
||||
terminationGracePeriodSeconds: 30
|
||||
```
|
||||
|
||||
### 2. Deployment
|
||||
**Deployment** — управляет репликами подов.
|
||||
|
||||
```yaml
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: user-service-deployment
|
||||
labels:
|
||||
app: user-service
|
||||
version: v1.0.0
|
||||
spec:
|
||||
replicas: 3
|
||||
strategy:
|
||||
type: RollingUpdate
|
||||
rollingUpdate:
|
||||
maxUnavailable: 1
|
||||
maxSurge: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
app: user-service
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: user-service
|
||||
version: v1.0.0
|
||||
annotations:
|
||||
prometheus.io/scrape: "true"
|
||||
prometheus.io/port: "8080"
|
||||
prometheus.io/path: "/actuator/prometheus"
|
||||
spec:
|
||||
containers:
|
||||
- name: user-service
|
||||
image: user-service:v1.0.0
|
||||
imagePullPolicy: IfNotPresent
|
||||
ports:
|
||||
- containerPort: 8080
|
||||
name: http
|
||||
protocol: TCP
|
||||
env:
|
||||
- name: SPRING_PROFILES_ACTIVE
|
||||
value: "kubernetes"
|
||||
- name: POD_NAME
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: metadata.name
|
||||
- name: POD_NAMESPACE
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: metadata.namespace
|
||||
resources:
|
||||
requests:
|
||||
memory: "256Mi"
|
||||
cpu: "250m"
|
||||
limits:
|
||||
memory: "512Mi"
|
||||
cpu: "500m"
|
||||
livenessProbe:
|
||||
httpGet:
|
||||
path: /actuator/health/liveness
|
||||
port: 8080
|
||||
initialDelaySeconds: 30
|
||||
periodSeconds: 10
|
||||
timeoutSeconds: 5
|
||||
failureThreshold: 3
|
||||
readinessProbe:
|
||||
httpGet:
|
||||
path: /actuator/health/readiness
|
||||
port: 8080
|
||||
initialDelaySeconds: 5
|
||||
periodSeconds: 5
|
||||
timeoutSeconds: 3
|
||||
failureThreshold: 3
|
||||
volumeMounts:
|
||||
- name: config-volume
|
||||
mountPath: /app/config
|
||||
readOnly: true
|
||||
- name: logs-volume
|
||||
mountPath: /app/logs
|
||||
volumes:
|
||||
- name: config-volume
|
||||
configMap:
|
||||
name: user-service-config
|
||||
- name: logs-volume
|
||||
emptyDir: {}
|
||||
restartPolicy: Always
|
||||
terminationGracePeriodSeconds: 30
|
||||
dnsPolicy: ClusterFirst
|
||||
securityContext:
|
||||
runAsNonRoot: true
|
||||
runAsUser: 1000
|
||||
fsGroup: 2000
|
||||
```
|
||||
|
||||
### 3. Service
|
||||
**Service** — обеспечивает сетевой доступ к подам.
|
||||
|
||||
```yaml
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: user-service
|
||||
labels:
|
||||
app: user-service
|
||||
annotations:
|
||||
prometheus.io/scrape: "true"
|
||||
prometheus.io/port: "8080"
|
||||
prometheus.io/path: "/actuator/prometheus"
|
||||
spec:
|
||||
selector:
|
||||
app: user-service
|
||||
ports:
|
||||
- name: http
|
||||
protocol: TCP
|
||||
port: 80
|
||||
targetPort: 8080
|
||||
- name: metrics
|
||||
protocol: TCP
|
||||
port: 9090
|
||||
targetPort: 9090
|
||||
type: ClusterIP
|
||||
sessionAffinity: None
|
||||
```
|
||||
|
||||
### 4. Ingress
|
||||
**Ingress** — управляет внешним доступом к сервисам.
|
||||
|
||||
```yaml
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: microservices-ingress
|
||||
annotations:
|
||||
kubernetes.io/ingress.class: "nginx"
|
||||
nginx.ingress.kubernetes.io/rewrite-target: /
|
||||
nginx.ingress.kubernetes.io/ssl-redirect: "true"
|
||||
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
|
||||
cert-manager.io/cluster-issuer: "letsencrypt-prod"
|
||||
spec:
|
||||
tls:
|
||||
- hosts:
|
||||
- api.example.com
|
||||
secretName: api-tls-secret
|
||||
rules:
|
||||
- host: api.example.com
|
||||
http:
|
||||
paths:
|
||||
- path: /api/users
|
||||
pathType: Prefix
|
||||
backend:
|
||||
service:
|
||||
name: user-service
|
||||
port:
|
||||
number: 80
|
||||
- path: /api/orders
|
||||
pathType: Prefix
|
||||
backend:
|
||||
service:
|
||||
name: order-service
|
||||
port:
|
||||
number: 80
|
||||
- path: /api/payments
|
||||
pathType: Prefix
|
||||
backend:
|
||||
service:
|
||||
name: payment-service
|
||||
port:
|
||||
number: 80
|
||||
```
|
||||
|
||||
### 5. ConfigMap
|
||||
**ConfigMap** — хранит конфигурационные данные.
|
||||
|
||||
```yaml
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: user-service-config
|
||||
labels:
|
||||
app: user-service
|
||||
data:
|
||||
application.yml: |
|
||||
server:
|
||||
port: 8080
|
||||
spring:
|
||||
application:
|
||||
name: user-service
|
||||
datasource:
|
||||
driver-class-name: org.postgresql.Driver
|
||||
hikari:
|
||||
maximum-pool-size: 10
|
||||
minimum-idle: 5
|
||||
connection-timeout: 20000
|
||||
idle-timeout: 300000
|
||||
max-lifetime: 1200000
|
||||
jpa:
|
||||
hibernate:
|
||||
ddl-auto: validate
|
||||
show-sql: false
|
||||
properties:
|
||||
hibernate:
|
||||
dialect: org.hibernate.dialect.PostgreSQLDialect
|
||||
format_sql: true
|
||||
rabbitmq:
|
||||
host: rabbitmq-service
|
||||
port: 5672
|
||||
username: admin
|
||||
password: admin
|
||||
management:
|
||||
endpoints:
|
||||
web:
|
||||
exposure:
|
||||
include: health,info,prometheus,metrics
|
||||
endpoint:
|
||||
health:
|
||||
show-details: always
|
||||
metrics:
|
||||
export:
|
||||
prometheus:
|
||||
enabled: true
|
||||
```
|
||||
|
||||
### 6. Secret
|
||||
**Secret** — хранит чувствительные данные.
|
||||
|
||||
```yaml
|
||||
apiVersion: v1
|
||||
kind: Secret
|
||||
metadata:
|
||||
name: user-db-secret
|
||||
labels:
|
||||
app: user-service
|
||||
type: Opaque
|
||||
data:
|
||||
url: cG9zdGdyZXNxbDovL3VzZXItZGItc2VydmljZToyNTQzMi91c2VyZGI= # base64 encoded
|
||||
username: dXNlcg== # base64 encoded
|
||||
password: cGFzc3dvcmQ= # base64 encoded
|
||||
```
|
||||
|
||||
### 7. HorizontalPodAutoscaler
|
||||
**HPA** — автоматическое масштабирование подов.
|
||||
|
||||
```yaml
|
||||
apiVersion: autoscaling/v2
|
||||
kind: HorizontalPodAutoscaler
|
||||
metadata:
|
||||
name: user-service-hpa
|
||||
spec:
|
||||
scaleTargetRef:
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
name: user-service-deployment
|
||||
minReplicas: 2
|
||||
maxReplicas: 10
|
||||
metrics:
|
||||
- type: Resource
|
||||
resource:
|
||||
name: cpu
|
||||
target:
|
||||
type: Utilization
|
||||
averageUtilization: 70
|
||||
- type: Resource
|
||||
resource:
|
||||
name: memory
|
||||
target:
|
||||
type: Utilization
|
||||
averageUtilization: 80
|
||||
behavior:
|
||||
scaleDown:
|
||||
stabilizationWindowSeconds: 300
|
||||
policies:
|
||||
- type: Percent
|
||||
value: 10
|
||||
periodSeconds: 60
|
||||
scaleUp:
|
||||
stabilizationWindowSeconds: 60
|
||||
policies:
|
||||
- type: Percent
|
||||
value: 50
|
||||
periodSeconds: 60
|
||||
```
|
||||
|
||||
## Команды Kubernetes
|
||||
|
||||
### Основные команды:
|
||||
```bash
|
||||
# Применение манифеста
|
||||
kubectl apply -f deployment.yaml
|
||||
|
||||
# Просмотр подов
|
||||
kubectl get pods
|
||||
|
||||
# Просмотр сервисов
|
||||
kubectl get services
|
||||
|
||||
# Просмотр деплойментов
|
||||
kubectl get deployments
|
||||
|
||||
# Описание ресурса
|
||||
kubectl describe pod <pod-name>
|
||||
|
||||
# Логи пода
|
||||
kubectl logs <pod-name>
|
||||
|
||||
# Подключение к поду
|
||||
kubectl exec -it <pod-name> -- /bin/bash
|
||||
|
||||
# Масштабирование деплоймента
|
||||
kubectl scale deployment my-deployment --replicas=5
|
||||
```
|
||||
|
||||
## Сетевая модель Kubernetes
|
||||
|
||||
### 1. Cluster Networking
|
||||
- Каждый под имеет уникальный IP
|
||||
- Поды могут общаться друг с другом
|
||||
- Сервисы обеспечивают стабильные IP
|
||||
|
||||
### 2. Service Types
|
||||
- **ClusterIP** — внутренний IP кластера
|
||||
- **NodePort** — доступ через порт узла
|
||||
- **LoadBalancer** — внешний балансировщик нагрузки
|
||||
- **ExternalName** — внешний DNS
|
||||
|
||||
## Хранилище в Kubernetes
|
||||
|
||||
### 1. Volumes
|
||||
```yaml
|
||||
apiVersion: v1
|
||||
kind: Pod
|
||||
spec:
|
||||
containers:
|
||||
- name: my-container
|
||||
image: nginx
|
||||
volumeMounts:
|
||||
- name: my-volume
|
||||
mountPath: /data
|
||||
volumes:
|
||||
- name: my-volume
|
||||
persistentVolumeClaim:
|
||||
claimName: my-pvc
|
||||
```
|
||||
|
||||
### 2. PersistentVolume
|
||||
```yaml
|
||||
apiVersion: v1
|
||||
kind: PersistentVolume
|
||||
metadata:
|
||||
name: my-pv
|
||||
spec:
|
||||
capacity:
|
||||
storage: 10Gi
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
persistentVolumeReclaimPolicy: Retain
|
||||
storageClassName: fast-ssd
|
||||
```
|
||||
|
||||
### 3. PersistentVolumeClaim
|
||||
```yaml
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
name: my-pvc
|
||||
spec:
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
resources:
|
||||
requests:
|
||||
storage: 10Gi
|
||||
storageClassName: fast-ssd
|
||||
```
|
||||
@@ -0,0 +1,177 @@
|
||||
# Infrastructure as Code
|
||||
|
||||
## Навигация
|
||||
- [🏠 Главная страница курса](../../../README.md)
|
||||
- [📚 Модуль 3](../README.md)
|
||||
|
||||
---
|
||||
|
||||
## Что такое IaC
|
||||
|
||||
**Infrastructure as Code (IaC)** — подход к управлению инфраструктурой через код.
|
||||
|
||||
## Преимущества IaC
|
||||
|
||||
### 1. Версионирование
|
||||
- История изменений инфраструктуры
|
||||
- Откат к предыдущим версиям
|
||||
- Code review для инфраструктуры
|
||||
|
||||
### 2. Повторяемость
|
||||
- Одинаковая инфраструктура в разных средах
|
||||
- Автоматизация развертывания
|
||||
- Устранение дрейфа конфигурации
|
||||
|
||||
### 3. Документация
|
||||
- Код как документация
|
||||
- Понятная структура инфраструктуры
|
||||
- Автоматическая генерация диаграмм
|
||||
|
||||
## Terraform
|
||||
|
||||
**Terraform** — инструмент для управления инфраструктурой через код.
|
||||
|
||||
### Основные концепции:
|
||||
|
||||
#### 1. Provider
|
||||
```hcl
|
||||
terraform {
|
||||
required_providers {
|
||||
aws = {
|
||||
source = "hashicorp/aws"
|
||||
version = "~> 4.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
provider "aws" {
|
||||
region = "us-west-2"
|
||||
}
|
||||
```
|
||||
|
||||
#### 2. Resource
|
||||
```hcl
|
||||
resource "aws_instance" "web" {
|
||||
ami = "ami-0c02fb55956c7d316"
|
||||
instance_type = "t2.micro"
|
||||
|
||||
tags = {
|
||||
Name = "HelloWorld"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 3. Data Source
|
||||
```hcl
|
||||
data "aws_ami" "ubuntu" {
|
||||
most_recent = true
|
||||
owners = ["099720109477"]
|
||||
|
||||
filter {
|
||||
name = "name"
|
||||
values = ["ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*"]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 4. Variables
|
||||
```hcl
|
||||
variable "instance_type" {
|
||||
description = "EC2 instance type"
|
||||
type = string
|
||||
default = "t2.micro"
|
||||
}
|
||||
|
||||
variable "environment" {
|
||||
description = "Environment name"
|
||||
type = string
|
||||
validation {
|
||||
condition = contains(["dev", "staging", "prod"], var.environment)
|
||||
error_message = "Environment must be dev, staging, or prod."
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 5. Outputs
|
||||
```hcl
|
||||
output "instance_ip" {
|
||||
description = "Public IP of the instance"
|
||||
value = aws_instance.web.public_ip
|
||||
}
|
||||
```
|
||||
|
||||
### Команды Terraform
|
||||
|
||||
```bash
|
||||
# Инициализация
|
||||
terraform init
|
||||
|
||||
# Планирование изменений
|
||||
terraform plan
|
||||
|
||||
# Применение изменений
|
||||
terraform apply
|
||||
|
||||
# Уничтожение инфраструктуры
|
||||
terraform destroy
|
||||
|
||||
# Просмотр состояния
|
||||
terraform show
|
||||
|
||||
# Форматирование кода
|
||||
terraform fmt
|
||||
|
||||
# Валидация конфигурации
|
||||
terraform validate
|
||||
```
|
||||
|
||||
### Модули Terraform
|
||||
|
||||
```hcl
|
||||
# main.tf
|
||||
module "vpc" {
|
||||
source = "./modules/vpc"
|
||||
|
||||
environment = var.environment
|
||||
cidr_block = "10.0.0.0/16"
|
||||
}
|
||||
|
||||
module "ec2" {
|
||||
source = "./modules/ec2"
|
||||
|
||||
vpc_id = module.vpc.vpc_id
|
||||
subnet_id = module.vpc.public_subnet_id
|
||||
}
|
||||
```
|
||||
|
||||
## Ansible
|
||||
|
||||
**Ansible** — инструмент автоматизации конфигурации и развертывания.
|
||||
|
||||
### Пример Playbook:
|
||||
```yaml
|
||||
---
|
||||
- name: Deploy web application
|
||||
hosts: web_servers
|
||||
become: yes
|
||||
vars:
|
||||
app_name: myapp
|
||||
app_port: 3000
|
||||
|
||||
tasks:
|
||||
- name: Install Node.js
|
||||
package:
|
||||
name: nodejs
|
||||
state: present
|
||||
|
||||
- name: Install npm dependencies
|
||||
npm:
|
||||
path: /opt/{{ app_name }}
|
||||
state: present
|
||||
|
||||
- name: Start application
|
||||
systemd:
|
||||
name: "{{ app_name }}"
|
||||
state: started
|
||||
enabled: yes
|
||||
```
|
||||
@@ -0,0 +1,61 @@
|
||||
# CI/CD с контейнерами
|
||||
|
||||
## Навигация
|
||||
- [🏠 Главная страница курса](../../../README.md)
|
||||
- [📚 Модуль 3](../README.md)
|
||||
|
||||
---
|
||||
|
||||
## CI/CD Pipeline
|
||||
|
||||
```yaml
|
||||
# .github/workflows/deploy.yml
|
||||
name: Deploy to Kubernetes
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
- name: Build Docker image
|
||||
run: docker build -t ${{ secrets.REGISTRY }}/myapp:${{ github.sha }} .
|
||||
|
||||
- name: Push to registry
|
||||
run: docker push ${{ secrets.REGISTRY }}/myapp:${{ github.sha }}
|
||||
|
||||
- name: Deploy to Kubernetes
|
||||
run: |
|
||||
kubectl set image deployment/myapp myapp=${{ secrets.REGISTRY }}/myapp:${{ github.sha }}
|
||||
kubectl rollout status deployment/myapp
|
||||
```
|
||||
|
||||
## GitOps
|
||||
|
||||
**GitOps** — подход к управлению инфраструктурой через Git.
|
||||
|
||||
### Пример ArgoCD:
|
||||
```yaml
|
||||
apiVersion: argoproj.io/v1alpha1
|
||||
kind: Application
|
||||
metadata:
|
||||
name: myapp
|
||||
namespace: argocd
|
||||
spec:
|
||||
project: default
|
||||
source:
|
||||
repoURL: https://github.com/myorg/myapp
|
||||
targetRevision: HEAD
|
||||
path: k8s
|
||||
destination:
|
||||
server: https://kubernetes.default.svc
|
||||
namespace: default
|
||||
syncPolicy:
|
||||
automated:
|
||||
prune: true
|
||||
selfHeal: true
|
||||
```
|
||||
@@ -0,0 +1,68 @@
|
||||
# Мониторинг контейнеров
|
||||
|
||||
## Навигация
|
||||
- [🏠 Главная страница курса](../../../README.md)
|
||||
- [📚 Модуль 3](../README.md)
|
||||
|
||||
---
|
||||
|
||||
## Prometheus + Grafana
|
||||
|
||||
### Конфигурация Prometheus:
|
||||
```yaml
|
||||
# prometheus.yml
|
||||
global:
|
||||
scrape_interval: 15s
|
||||
|
||||
scrape_configs:
|
||||
- job_name: 'kubernetes-pods'
|
||||
kubernetes_sd_configs:
|
||||
- role: pod
|
||||
```
|
||||
|
||||
### Дашборд Grafana:
|
||||
```json
|
||||
{
|
||||
"dashboard": {
|
||||
"title": "Kubernetes Cluster",
|
||||
"panels": [
|
||||
{
|
||||
"title": "CPU Usage",
|
||||
"type": "graph",
|
||||
"targets": [
|
||||
{
|
||||
"expr": "rate(container_cpu_usage_seconds_total[5m])"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## ELK Stack
|
||||
|
||||
### Elasticsearch + Logstash + Kibana:
|
||||
```yaml
|
||||
# docker-compose.yml
|
||||
version: '3.8'
|
||||
services:
|
||||
elasticsearch:
|
||||
image: elasticsearch:7.14.0
|
||||
environment:
|
||||
- discovery.type=single-node
|
||||
ports:
|
||||
- "9200:9200"
|
||||
|
||||
logstash:
|
||||
image: logstash:7.14.0
|
||||
volumes:
|
||||
- ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf
|
||||
ports:
|
||||
- "5044:5044"
|
||||
|
||||
kibana:
|
||||
image: kibana:7.14.0
|
||||
ports:
|
||||
- "5601:5601"
|
||||
```
|
||||
@@ -0,0 +1,25 @@
|
||||
# Практические задания
|
||||
|
||||
## Навигация
|
||||
- [🏠 Главная страница курса](../../../README.md)
|
||||
- [📚 Модуль 3](../README.md)
|
||||
|
||||
---
|
||||
|
||||
### Задание 1: Docker
|
||||
1. Создайте Dockerfile для Node.js приложения
|
||||
2. Соберите образ и запустите контейнер
|
||||
3. Создайте docker-compose.yml для многоконтейнерного приложения
|
||||
|
||||
### Задание 2: Kubernetes
|
||||
1. Создайте Deployment для веб-приложения
|
||||
2. Создайте Service для доступа к приложению
|
||||
3. Настройте ConfigMap и Secret
|
||||
4. Разверните приложение в кластере
|
||||
|
||||
### Задание 3: Terraform
|
||||
1. Создайте инфраструктуру в AWS с помощью Terraform
|
||||
2. Используйте модули для организации кода
|
||||
3. Настройте переменные и outputs
|
||||
|
||||
---
|
||||
Reference in new issue
Block a user