Найти в Дзене
Кирилл Ледовский

🌐 Пошаговое руководство по Service Mesh (Сервисная сеть) для начинающего разработчика ИИ-агентов

Простое объяснение: Представьте городскую дорожную сеть. Service Mesh — это светофоры, знаки и регулировщики, которые управляют движением между зданиями (вашими микросервисами). Без Service Mesh: Здание А ───────┐
├─→ Здание Б
Здание В ───────┘ Каждое здание само решает, как доехать до другого. Если дорога закрыта — пробка. С Service Mesh: Здание А ──[Светофоры, Камеры, Навигация]──→ Здание Б
Здание В ──[Светофоры, Камеры, Навигация]──→ Здание Б Есть единая система управления движением. Kubernetes (k8s) — это "дирижёр оркестра" для контейнеров. Service Mesh работает поверх него. bash # 1. Установите Docker (если ещё нет)
# https://www.docker.com/products/docker-desktop/
# 2. Установите Minikube
# Для Mac/Linux:
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
# Для Windows (администратор PowerShell):
choco install minikube
# 3. Установите kubectl
# Для Mac/Linux:
curl -LO "
Оглавление

🧭 Что такое Service Mesh (Сервисная сеть)?

Простое объяснение: Представьте городскую дорожную сеть. Service Mesh — это светофоры, знаки и регулировщики, которые управляют движением между зданиями (вашими микросервисами).

Без Service Mesh:

Здание А ───────┐
├─→ Здание Б
Здание В ───────┘

Каждое здание само решает, как доехать до другого. Если дорога закрыта — пробка.

С Service Mesh:

Здание А ──[Светофоры, Камеры, Навигация]──→ Здание Б
Здание В ──[Светофоры, Камеры, Навигация]──→ Здание Б

Есть единая система управления движением.

🚀 Шаг 1: Подготовка среды - устанавливаем мини-Kubernetes

Цель шага: Создать "тестовый полигон" для Service Mesh.

Kubernetes (k8s) — это "дирижёр оркестра" для контейнеров. Service Mesh работает поверх него.

Что устанавливаем:

  1. Minikube — миниатюрный Kubernetes на вашем компьютере
  2. kubectl — командный интерфейс для управления Kubernetes
  3. Istio — самый популярный Service Mesh

Пошаговая установка:

bash

# 1. Установите Docker (если ещё нет)
# https://www.docker.com/products/docker-desktop/

# 2. Установите Minikube
# Для Mac/Linux:
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube

# Для Windows (администратор PowerShell):
choco install minikube

# 3. Установите kubectl
# Для Mac/Linux:
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install kubectl /usr/local/bin/kubectl

# Для Windows:
choco install kubernetes-cli

# 4. Запустите Minikube
minikube start --memory=4096 --cpus=4
# Дайте ему время (5-10 минут при первом запуске)

# 5. Проверьте, что всё работает
kubectl get nodes
# Должна быть одна нода со статусом "Ready"

Что должно получиться:

✅ Minikube запущен (виртуальная машина с Kubernetes)
✅ kubectl подключён к кластеру
✅ Есть одна рабочая нода (виртуальный компьютер)

На что обратить внимание:

  • Minikube требует много RAM (минимум 4GB)
  • Первый запуск долгий — скачивается образ ~1GB
  • Если есть VirtualBox/VMWare — Minikube может использовать их

🎯 Шаг 2: Устанавливаем Istio (наш Service Mesh)

Цель шага: Установить "дорожную полицию" для нашего микросервисного города.

Istio — самый популярный Service Mesh. Он добавляет:

  • Управление трафиком
  • Безопасность
  • Наблюдаемость
  • Устойчивость к сбоям

Установка Istio:

bash

# 1. Скачайте Istio
curl -L https://istio.io/downloadIstio | sh -

# 2. Перейдите в папку Istio
cd istio-*

# 3. Добавьте istioctl в PATH
export PATH=$PWD/bin:$PATH

# 4. Установите Istio в Minikube
istioctl install --set profile=demo -y

# 5. Включите автоматический sidecar injection
# Sidecar — это "дополнительный контейнер", который Istio добавляет к каждому микросервису
kubectl label namespace default istio-injection=enabled

# 6. Проверьте установку
kubectl get pods -n istio-system

Что должно получиться:

NAME READY STATUS
istiod-5c5d8b8b6d-abcde 1/1 Running
istio-ingressgateway-7d5d8b8b6d-xyzabc 1/1 Running
istio-egressgateway-... 1/1 Running

✅ Все поды (pods) в статусе "Running"
✅ Istiod (мозг Istio) работает
✅ Ingress Gateway (входные ворота) готов

На что обратить внимание:

  • Установка займёт 3-5 минут
  • Если pod "Pending" — возможно, не хватает памяти
  • Можно проверить логи: kubectl logs -n istio-system deploy/istiod

🏗️ Шаг 3: Создаём первый микросервис с Service Mesh

Цель шага: Создать простой микросервис и увидеть, как Istio его "обволакивает".

Что такое "микросервис" в Kubernetes:

Это просто контейнер с программой, который зарегистрирован в Kubernetes. Service Mesh добавляет к нему "дополнительный контейнер" (sidecar), который перехватывает весь трафик.

Создаём простой микросервис на Python:

python

# service-1/app.py - Простой веб-сервис
from flask import Flask, jsonify
import socket
import os

app = Flask(__name__)

@app.route('/')
def home():
"""Главная страница сервиса"""
hostname = socket.gethostname()
ip = socket.gethostbyname(hostname)

return jsonify({
"service": "service-1",
"version": "1.0.0",
"hostname": hostname,
"ip": ip,
"message": "Привет от первого сервиса с Service Mesh!",
"headers": dict(os.environ)
# Покажем переменные окружения
})

@app.route('/health')
def health():
"""Health check для Kubernetes"""
return jsonify({"status": "healthy"}), 200

@app.route('/call-service-2')
def call_service_2():
"""Этот эндпоинт будет вызывать service-2 через Service Mesh"""
# В реальности здесь был бы HTTP запрос
return jsonify({
"message": "Этот эндпоинт вызывает service-2",
"note": "Маршрутизация управляется Istio"
})

if __name__ == '__main__':
app.run(host='0.0.0.0', port=8080)

Создаём Dockerfile:

dockerfile

# service-1/Dockerfile
FROM python:3.9-slim

WORKDIR /app

# Устанавливаем зависимости
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# Копируем код
COPY . .

# Запускаем сервис
CMD ["python", "app.py"]

txt

# service-1/requirements.txt
flask

Создаём Kubernetes Deployment и Service:

yaml

# service-1/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: service-1
labels:
app: service-1
version: v1
spec:
replicas: 2
# Создадим 2 копии сервиса
selector:
matchLabels:
app: service-1
template:
metadata:
labels:
app: service-1
version: v1
spec:
containers:
- name: service-1
image: service-1:latest
# Локальный образ
ports:
- containerPort: 8080
readinessProbe:
# Проверка готовности
httpGet:
path: /health
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe:
# Проверка живости
httpGet:
path: /health
port: 8080
initialDelaySeconds: 15
periodSeconds: 20
---
apiVersion: v1
kind: Service
metadata:
name: service-1
spec:
selector:
app: service-1
ports:
- port: 80
# Порт сервиса в Kubernetes
targetPort: 8080
# Порт контейнера
name: http

Собираем и деплоим:

bash

# 1. Включите Docker в Minikube
eval $(minikube docker-env)

# 2. Соберите Docker образ
docker build -t service-1:latest service-1/

# 3. Примените конфигурацию Kubernetes
kubectl apply -f service-1/deployment.yaml

# 4. Проверьте, что сервис запустился
kubectl get pods
kubectl get services

Что должно получиться:

NAME READY STATUS RESTARTS AGE
service-1-abc123 2/2 Running 0 1m
service-1-xyz456 2/2 Running 0 1m

✅ Два пода (по 2 контейнера в каждом)
✅ 2/2 означает: 1 контейнер сервиса + 1 sidecar от Istio
✅ Сервис доступен внутри кластера как service-1

На что обратить внимание:

  • Istio автоматически добавил sidecar-контейнер
  • Сервис доступен по имени service-1 внутри кластера
  • Health checks помогают Kubernetes понимать состояние сервиса

🔄 Шаг 4: Создаём второй сервис и настраиваем маршрутизацию

Цель шага: Настроить взаимодействие между сервисами через Service Mesh.

Создаём service-2:

python

# service-2/app.py
from flask import Flask, jsonify, request
import socket
import requests
import json

app = Flask(__name__)

SERVICE_1_URL = "http://service-1.default.svc.cluster.local"

@app.route('/')
def home():
hostname = socket.gethostname()

return jsonify({
"service": "service-2",
"version": "1.0.0",
"hostname": hostname,
"message": "Привет от второго сервиса!",
"features": [
"Может вызывать service-1",
"Имеет собственную бизнес-логику",
"Управляется через Service Mesh"
]
})

@app.route('/call-service-1')
def call_service_1():
"""Вызывает service-1 через Service Mesh"""

try:
# Отправляем запрос к service-1
response = requests.get(
f"{SERVICE_1_URL}/",
timeout=5,
headers={
"User-Agent": "service-2/1.0",
"X-Request-ID": request.headers.get('X-Request-ID', 'unknown')
}
)

result = response.json()

return jsonify({
"caller": "service-2",
"target": "service-1",
"status": "success",
"response": result,
"through_mesh": True,
"latency_ms": response.elapsed.total_seconds() * 1000
})

except Exception as e:
return jsonify({
"error": str(e),
"caller": "service-2",
"target": "service-1",
"status": "failed"
}), 500

@app.route('/health')
def health():
return jsonify({"status": "healthy"}), 200

if __name__ == '__main__':
app.run(host='0.0.0.0', port=8080)

Создаём Kubernetes конфигурацию:

yaml

# service-2/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: service-2
labels:
app: service-2
spec:
replicas: 1
selector:
matchLabels:
app: service-2
template:
metadata:
labels:
app: service-2
spec:
containers:
- name: service-2
image: service-2:latest
ports:
- containerPort: 8080
env:
- name: PYTHONUNBUFFERED
value: "1"
---
apiVersion: v1
kind: Service
metadata:
name: service-2
spec:
selector:
app: service-2
ports:
- port: 80
targetPort: 8080
name: http

Разворачиваем service-2:

bash

# 1. Собираем образ
docker build -t service-2:latest service-2/

# 2. Деплоим
kubectl apply -f service-2/deployment.yaml

# 3. Проверяем
kubectl get pods -l app=service-2

Тестируем взаимодействие:

bash

# 1. Запускаем временный pod для тестирования
kubectl run test-$RANDOM --rm -i --tty --image curlimages/curl -- sh

# 2. Внутри тестового pod вызываем service-2
curl http://service-2/call-service-1

Что должно получиться:

json

{
"caller": "service-2",
"target": "service-1",
"status": "success",
"response": {
"service": "service-1",
"version": "1.0.0",
"message": "Привет от первого сервиса с Service Mesh!"
},
"through_mesh": true,
"latency_ms": 12.5
}

✅ Service-2 успешно вызвал service-1
✅ Трафик прошёл через Service Mesh
✅ Есть информация о задержке

На что обратить внимание:

  • Service-2 использует полное DNS имя service-1
  • Весь трафик перехватывается sidecar-контейнером Istio
  • Service Mesh прозрачно управляет соединением

🚦 Шаг 5: Настраиваем правила маршрутизации (Traffic Management)

Цель шага: Управлять трафиком между сервисами — A/B тестирование, канареечные релизы.

Что такое VirtualService и DestinationRule:

  • VirtualService — правила маршрутизации (какой трафик куда идёт)
  • DestinationRule — политики для подключения (балансировка, версионирование)

Создаём версию 2.0 service-1:

python

# service-1-v2/app.py
from flask import Flask, jsonify
import socket

app = Flask(__name__)

@app.route('/')
def home():
hostname = socket.gethostname()

return jsonify({
"service": "service-1",
"version": "2.0.0",
"hostname": hostname,
"message": "Новая улучшенная версия service-1!",
"features": [
"Улучшенная производительность",
"Новый API",
"Поддержка Service Mesh"
]
})

@app.route('/health')
def health():
return jsonify({"status": "healthy"}), 200

if __name__ == '__main__':
app.run(host='0.0.0.0', port=8080)

Деплоим v2.0:

yaml

# service-1-v2/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: service-1-v2
labels:
app: service-1
version: v2
spec:
replicas: 2
selector:
matchLabels:
app: service-1
version: v2
template:
metadata:
labels:
app: service-1
version: v2
spec:
containers:
- name: service-1
image: service-1-v2:latest
ports:
- containerPort: 8080

bash

# Собираем и деплоим
docker build -t service-1-v2:latest service-1-v2/
kubectl apply -f service-1-v2/deployment.yaml

Теперь у нас есть:

  • 2 пода service-1 v1.0.0
  • 2 пода service-1 v2.0.0
  • Все под одним сервисом service-1

Настраиваем маршрутизацию:

yaml

# routing/rules.yaml
---
# DestinationRule - определяем подмножества (subset)
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: service-1
spec:
host: service-1
# Имя сервиса в Kubernetes
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
---
# VirtualService - правила маршрутизации
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: service-1
spec:
hosts:
- service-1
http:
- route:
# По умолчанию: 90% трафика на v1, 10% на v2
- destination:
host: service-1
subset: v1
weight: 90
- destination:
host: service-1
subset: v2
weight: 10

bash

# Применяем правила
kubectl apply -f routing/rules.yaml

Тестируем канареечный релиз:

bash

# Запускаем тестовый скрипт
for i in {1..20}; do
kubectl run test-$RANDOM --rm -i --tty --image curlimages/curl \
--restart=Never -- curl -s http://service-2/call-service-1 | grep version
sleep 1
done

Что должно получиться:

text

"version": "1.0.0"
"version": "1.0.0"
"version": "2.0.0" # Примерно 10% запросов
"version": "1.0.0"
...

✅ 90% трафика идёт на v1
✅ 10% трафика идёт на v2
✅ Можно постепенно увеличивать процент

Усложняем правила маршрутизации:

yaml

# routing/advanced-rules.yaml
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: service-1-advanced
spec:
hosts:
- service-1
http:
# Правило 1: Для тестовых пользователей - 50/50
- match:
- headers:
x-test-user:
exact: "true"
route:
- destination:
host: service-1
subset: v1
weight: 50
- destination:
host: service-1
subset: v2
weight: 50

# Правило 2: Для мобильных приложений - только v2
- match:
- headers:
user-agent:
regex: ".*Android.*|.*iPhone.*"
route:
- destination:
host: service-1
subset: v2

# Правило 3: По умолчанию - 95/5
- route:
- destination:
host: service-1
subset: v1
weight: 95
- destination:
host: service-1
subset: v2
weight: 5

Что должно получиться:

  • Разная логика маршрутизации для разных условий
  • Можно тестировать на конкретных пользователях
  • Постепенный rollout новых версий

На что обратить внимание:

  • Правила применяются сверху вниз
  • Можно комбинировать условия
  • Веса должны суммироваться в 100%

🔒 Шаг 6: Настройка безопасности (mTLS)

Цель шага: Включить взаимную аутентификацию между сервисами.

mTLS (mutual TLS) — когда оба конца соединения проверяют сертификаты друг друга. Как паспортный контроль с двух сторон.

Включаем mTLS для всего namespace:

yaml

# security/mtls.yaml
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: default
spec:
mtls:
mode: STRICT
# STRICT = требуется mTLS

bash

kubectl apply -f security/mtls.yaml

Проверяем, что mTLS работает:

bash

# 1. Смотрим TLS-информацию
kubectl exec $(kubectl get pod -l app=service-2 -o jsonpath='{.items[0].metadata.name}') \
-c istio-proxy -- \
pilot-agent request GET /stats | grep ssl

# 2. Тестируем соединение
kubectl run test-$RANDOM --rm -i --tty --image curlimages/curl \
-- curl -v http://service-1/ 2>&1 | grep -i "ssl\|tls"

Что должно получиться:

✅ Соединение использует TLS
✅ Сертификаты автоматически выдаются и обновляются
✅ Трафик между сервисами зашифрован

Настраиваем более гибкую политику:

yaml

# security/permissive-mtls.yaml
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: service-1-policy
spec:
selector:
matchLabels:
app: service-1
mtls:
mode: PERMISSIVE
# Разрешает и mTLS, и обычный трафик

На что обратить внимание:

  • STRICT блокирует весь немTLS трафик
  • PERMISSIVE полезен при миграции
  • Можно настраивать на уровне namespace/service/workload

📊 Шаг 7: Наблюдаемость (Observability)

Цель шага: Настроить мониторинг, логирование и трассировку.

Observability в Service Mesh даёт:

  • Метрики — сколько запросов, ошибок, задержка
  • Логи — что происходит внутри
  • Трассировка — путь запроса через все сервисы

Устанавливаем Kiali - панель управления Service Mesh:

bash

# 1. Устанавливаем Kiali
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.18/samples/addons/kiali.yaml

# 2. Запускаем порт-форвардинг
kubectl port-forward svc/kiali 20001:20001 -n istio-system &

# 3. Открываем в браузере
# http://localhost:20001
# Логин: admin
# Пароль: admin

Что видим в Kiali:

✅ Граф зависимостей между сервисами
✅ Трафик в реальном времени
✅ Ошибки и задержки
✅ Конфигурация Service Mesh

Настраиваем сбор метрик:

yaml

# observability/metrics.yaml
apiVersion: telemetry.istio.io/v1alpha1
kind: Telemetry
metadata:
name: service-metrics
spec:
metrics:
- providers:
- name: prometheus
overrides:
# Включаем расширенные метрики
- match:
metric: REQUEST_COUNT
mode: SERVER_AND_CLIENT
- match:
metric: REQUEST_DURATION
mode: SERVER_AND_CLIENT
- match:
metric: REQUEST_SIZE
mode: SERVER_AND_CLIENT
- match:
metric: RESPONSE_SIZE
mode: SERVER_AND_CLIENT

Настраиваем трассировку (Jaeger):

bash

# 1. Устанавливаем Jaeger
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.18/samples/addons/jaeger.yaml

# 2. Порты
kubectl port-forward svc/tracing 16686:16686 -n istio-system &

# 3. Открываем
# http://localhost:16686

Создаём тестовый запрос с трассировкой:

python

# test-trace.py
import requests
import time
import uuid

def make_request_with_trace():
"""Делает запрос с уникальным ID для трассировки"""

trace_id = str(uuid.uuid4())

headers = {
'X-Request-ID': trace_id,
'User-Agent': 'Test-Script/1.0',
'X-Test-User': 'true'
# Для A/B тестирования
}

print(f"🔄 Отправляю запрос с Trace ID: {trace_id}")

try:
response = requests.get(
'http://service-2/call-service-1',
headers=headers,
timeout=10
)

print(f"✅ Ответ получен:")
print(f" Status: {response.status_code}")
print(f" Trace ID: {trace_id}")
print(f" Jaeger: http://localhost:16686/trace/{trace_id}")

return response.json()

except Exception as e:
print(f"❌ Ошибка: {e}")
return None

if __name__ == "__main__":
# Делаем несколько запросов
for i in range(5):
print(f"\n📊 Запрос #{i+1}")
result = make_request_with_trace()
time.sleep(2)

Что видим в Jaeger:

✅ Визуальный путь запроса через все сервисы
✅ Время на каждом этапе
✅ Ошибки и исключения
✅ Зависимости между сервисами

На что обратить внимание:

  • Трассировка добавляет overhead (нагрузку)
  • Можно настраивать sampling rate
  • Jaeger показывает latency percentiles (P50, P95, P99)

🚨 Шаг 8: Обработка сбоев (Resilience)

Цель шага: Сделать систему устойчивой к сбоям.

Circuit Breaker — как автомат в электрической сети: если слишком много ошибок, "выбивает" и даёт время на восстановление.

Настраиваем Circuit Breaker:

yaml

# resilience/circuit-breaker.yaml
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: service-1-cb
spec:
host: service-1
trafficPolicy:
connectionPool:
tcp:
maxConnections: 100
# Максимум соединений
http:
http1MaxPendingRequests: 50
# Максимум ожидающих запросов
maxRequestsPerConnection: 10
outlierDetection:
consecutive5xxErrors: 5
# После 5 ошибок подряд
interval: 30s
# Проверять каждые 30 секунд
baseEjectionTime: 60s
# Исключить на 60 секунд
maxEjectionPercent: 50
# Максимум 50% пода можно исключить

Настраиваем retry и timeout:

yaml

# resilience/retry-timeout.yaml
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: service-1-resilient
spec:
hosts:
- service-1
http:
- route:
- destination:
host: service-1
retries:
attempts: 3
# 3 попытки
perTryTimeout: 2s
# Таймаут на попытку
retryOn: 5xx,gateway-error,connect-failure
timeout: 5s
# Общий таймут

Создаём "сломанный" сервис для тестирования:

python

# service-1-broken/app.py
from flask import Flask, jsonify
import random
import time

app = Flask(__name__)

ERROR_RATE = 0.3
# 30% запросов вернут ошибку
SLOW_RATE = 0.2
# 20% запросов будут медленными

@app.route('/')
def home():
# Иногда возвращаем ошибку
if random.random() < ERROR_RATE:
return jsonify({"error": "Случайная ошибка"}), 500

# Иногда делаем медленный ответ
if random.random() < SLOW_RATE:
time.sleep(5)
# 5 секунд задержки

return jsonify({
"service": "service-1-broken",
"version": "broken-1.0",
"message": "Иногда работаю, иногда нет 😅"
})

@app.route('/health')
def health():
return jsonify({"status": "healthy"}), 200

Тестируем устойчивость:

bash

# Запускаем тестовую нагрузку
for i in {1..20}; do
kubectl run test-$RANDOM --rm -i --tty --image curlimages/curl \
--restart=Never -- curl -s http://service-1/ \
&& echo "---" || echo "❌ Failed"
sleep 0.5
done

Что должно получиться:

✅ Некоторые запросы падают (ожидаемо)
✅ Circuit breaker срабатывает при множестве ошибок
✅ Retry механизм пытается повторить
✅ В Kiali видно ошибки и восстановления

На что обратить внимание:

  • Circuit breaker защищает от каскадных сбоев
  • Retry может увеличить нагрузку (retry storm)
  • Timeout должен быть меньше, чем timeout вызывающего

🎓 Шаг 9: Best Practices и рекомендации

Цель шага: Узнать лучшие практики использования Service Mesh.

1. Стратегия внедрения:

yaml

# Постепенное внедрение Istio
# 1. Сначала только observability
# 2. Затем traffic management
# 3. Потом security
# 4. Наконец, resilience

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
profile: demo
components:
# Включаем только нужные компоненты
pilot:
enabled: true
ingressGateway:
enabled: true
egressGateway:
enabled: false
# Пока не нужно

2. Оптимизация ресурсов:

yaml

# sidecar/resource-limits.yaml
# Ограничиваем ресурсы sidecar-прокси
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
components:
pilot:
k8s:
resources:
requests:
memory: "512Mi"
cpu: "250m"
meshConfig:
defaultConfig:
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "256Mi"
cpu: "200m"

3. Изоляция namespace:

bash

# Создаём отдельный namespace для Production
kubectl create namespace production
kubectl label namespace production istio-injection=enabled

# И для Staging
kubectl create namespace staging
kubectl label namespace staging istio-injection=enabled

# Разные политики для разных namespace
kubectl apply -n production -f security/strict-mtls.yaml
kubectl apply -n staging -f security/permissive-mtls.yaml

4. Версионирование конфигураций:

bash

# Храним конфиги в Git
istio-config/
├── base/
│ ├── kustomization.yaml
│ └── namespace.yaml
├── overlays/
│ ├── production/
│ │ ├── kustomization.yaml
│ │ └── strict-policies.yaml
│ └── staging/
│ ├── kustomization.yaml
│ └── permissive-policies.yaml
└── README.md

# Применяем через Kustomize
kubectl apply -k istio-config/overlays/production

5. Мониторинг и алерты:

yaml

# monitoring/alerts.yaml
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: istio-alerts
spec:
groups:
- name: istio.rules
rules:
- alert: IstioHighRequestLatency
expr: histogram_quantile(0.99, rate(istio_request_duration_milliseconds_bucket[1m])) > 1000
for: 2m
labels:
severity: warning
annotations:
description: 'High request latency on {{ $labels.destination_service }}'

- alert: IstioHighErrorRate
expr: rate(istio_requests_total{response_code=~"5.*"}[1m]) / rate(istio_requests_total[1m]) > 0.05
for: 2m
labels:
severity: critical
annotations:
description: 'High error rate on {{ $labels.destination_service }}'

🎯 Итог: Что вы научились делать

✅ Вы освоили:

  1. Установку и настройку Service Mesh (Istio)
  2. Создание микросервисов с sidecar-прокси
  3. Управление трафиком (A/B тестирование, канареечные релизы)
  4. Настройку безопасности (mTLS, политики доступа)
  5. Observability (метрики, логи, трассировка)
  6. Resilience patterns (circuit breaker, retry, timeout)

🏗️ Где хранить конфигурации:

  1. Git репозиторий — основной источник истины
  2. ConfigMaps/Secrets в Kubernetes — для runtime конфигурации
  3. Istio Operator — для управления самой Istio
  4. Kustomize/Helm — для управления версиями

🔧 Как управлять версионностью:

  1. Git tags/branches — для конфигураций
  2. Docker tags — для образов сервисов
  3. Kubernetes labels/annotations — для версий в кластере
  4. Istio subsets — для трафик-шейпинга по версиям

💻 На каком языке писать сервисы:

-2

Для ИИ-агентов в Service Mesh рекомендую:

  • Python — для ML-сервисов (тяжёлые модели)
  • Go — для оркестраторов и API-гейтвеев
  • Node.js — для веб-интерфейсов и хуков

🚀 Следующие шаги для развития:

  1. Изучите другие Service Mesh:
    Linkerd
    — более лёгкий, проще в установке
    Consul Connect — от HashiCorp, интегрирован с Consul
    AWS App Mesh — для облака AWS
  2. Попробуйте Service Mesh Interface (SMI):yaml# Стандартизированный интерфейс для Service Mesh
    apiVersion: specs.smi-spec.io/v1alpha4
    kind: HTTPRouteGroup
    metadata:
    name: service-1-routes
    spec:
    matches:
    - name: api
    pathRegex: "/api/.*"
    methods: ["GET", "POST"]
  3. Автоматизируйте развёртывание:
    GitOps с ArgoCD/Flux
    CI/CD пайплайны
    Infrastructure as Code (Terraform, Pulumi)
  4. Оптимизируйте производительность:
    Настройка resource limits
    Автомасштабирование (HPA/VPA)
    Оптимизация sidecar-прокси
  5. Реальные проекты:
    Микросервисная ИИ-платформа
    Мультитенантный SaaS с изоляцией
    Гибридное облако с единым Service Mesh

💡 Помните:

  • Service Mesh — это overhead (~100MB RAM на сервис)
  • Начинайте с observability — сначала измеряйте, потом управляйте
  • Тестируйте сбои — chaos engineering
  • Документируйте политики — кто, что, куда может

Service Mesh — это мощный инструмент, но не серебряная пуля. Используйте его там, где действительно нужны его возможности: в сложных микросервисных архитектурах с десятками сервисов.

Удачи в создании ваших ИИ-агентов с Service Mesh! 🚀