Добро пожаловать в дикий мир сервис-мешей, где микросервисы наконец-то получают сетевые сверхспособности, которых они заслуживают! Если вам когда-либо казалось, что ваш Kubernetes-кластер напоминает оживлённый перекрёсток без светофоров, то Istio станет вашим новым лучшим другом. Думайте об этом как о сложной системе управления воздушным движением для ваших контейнерных приложений — ведь никому не хочется, чтобы их сервисы сталкивались друг с другом на высоте 30 000 футов.

Сегодня мы погрузимся в внедрение сервис-меша Istio в ваш Kubernetes-кластер. К концу этого пути вы не только поймёте, что делает Istio таким особенным, но и получите готовую к производству настройку, которая заставит даже самого опытного инженера DevOps пустить слезу радости.

Зачем нужен сервис-меш? Зачем Istio?

Прежде чем мы углубимся в работу с файлами YAML (любимые отношения разработчиков типа «любовь-ненависть»), давайте разберёмся, зачем вообще нужен сервис-меш. Представьте, что вы используете микросервисную архитектуру с десятками сервисов, общающихся друг с другом. Без сервис-меша управление безопасностью, наблюдаемостью и контролем трафика между всеми этими сервисами похоже на попытку дирижировать оркестром с закрытыми глазами — теоретически возможно, но практически кошмарно.

Istio выступает в роли дирижёрской палочки, обеспечивая:

  • Управление трафиком: балансировка нагрузки, прерыватели цепи, повторы и аварийное переключение.
  • Безопасность: шифрование mTLS, аутентификация и авторизация.
  • Наблюдаемость: метрики, логи и распределённое трассирование.
  • Принуждение к соблюдению политики: ограничение скорости, контроль доступа и управление квотами.

Прелесть Istio заключается в использовании прокси-паттерна sidecar с Envoy. Каждый под получает дружелюбный прокси-сосед, который управляет всеми сетевыми сложностями, оставляя ваш код приложения в блаженном неведении о том, что происходит вокруг.

graph TB subgraph "Kubernetes Cluster" subgraph "Control Plane" I[Istio Pilot] C[Citadel] G[Galley] end subgraph "Data Plane" subgraph "Pod A" A1[App Container] A2[Envoy Sidecar] end subgraph "Pod B" B1[App Container] B2[Envoy Sidecar] end subgraph "Pod C" C1[App Container] C2[Envoy Sidecar] end end IG[Istio Gateway] end I --> A2 I --> B2 I --> C2 C --> A2 C --> B2 C --> C2 G --> I A2 <--> B2 B2 <--> C2 A2 <--> C2 IG --> A2

Предварительные требования: подготовка всего необходимого

Прежде чем мы отправимся в это приключение с Istio, давайте убедимся, что у вас есть всё необходимое. Думайте об этом как о предполётной проверке — пропустите эти шаги на свой страх и риск!

Необходимые инструменты:

  • Kubernetes-кластер (рекомендуется версия 1.26+)
  • Настроенный и работающий kubectl
  • Azure CLI (если используете AKS) версии 2.57.0 или новее
  • curl (для загрузки Istio)
  • Здоровый запас терпения и кофе

Проверка вашей настройки:

# Проверка версии Kubernetes
kubectl version --client --short
# Проверка подключения к кластеру
kubectl get nodes
# Проверка доступных ресурсов
kubectl top nodes

Для пользователей AKS вам нужно проверить версию Azure CLI:

az --version

Если у вас установлена более старая версия, обновите её, потому что Istio требователен к своим зависимостям (как и мы все).

Методы установки: выберите свой путь

Istio предлагает несколько путей установки, каждый со своей индивидуальностью:

  1. istioctl — подход швейцарского армейского ножа
  2. Helm — для любителей диаграмм
  3. AKS Add-on — для любителей Azure, которым нравится, когда всё управляется

Мы сосредоточимся на методе istioctl для максимальной гибкости, но я также расскажу о магии дополнения AKS для пущей убедительности.

Метод 1: Классический подход с istioctl

Сначала давайте загрузим Istio. Эта однострочная команда настолько элегантна, что заслуживает места в музее:

# Загрузка последней версии Istio
curl -L https://istio.io/downloadIstio | sh -
# Или укажите версию, если хотите
curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.27.0 sh -

Перейдите в каталог Istio и добавьте istioctl в PATH:

cd istio-1.27.0
export PATH=$PWD/bin:$PATH
# Проверка установки
istioctl version --client

Теперь давайте установим Istio с демонстрационным профилем (идеально подходит для обучения и разработки):

# Установка Istio с демонстрационным профилем
istioctl install --set values.defaultRevision=default
# Проверка установки
kubectl get pods -n istio-system

Демонстрационный профиль включает в себя как входящие, так и исходящие шлюзы, а также все дополнения для наблюдаемости. Это как заказать комплексное блюдо — вы получаете всё необходимое, чтобы поиграть с функциями Istio.

Метод 2: Дополнение AKS (подарок Azure для Kubernetes)

Если вы используете AKS, Microsoft сделала установку Istio почти до смешного простой:

# Установка переменных среды
export CLUSTER="my-aks-cluster"
export RESOURCE_GROUP="my-resource-group"
export LOCATION="eastus"
# Проверка доступных версий Istio
az aks mesh get-revisions --location $LOCATION -o table
# Включение дополнения Istio
az aks mesh enable --resource-group $RESOURCE_GROUP --name $CLUSTER

Дополнение AKS управляется Microsoft, что означает автоматические обновления и поддержку. Это как иметь личного механика для вашего сервис-меша.

После установки: проверка вашей установки Istio

Давайте убедимся, что всё работает правильно. Ничего так не убивает настроение DevOps, как сломанная установка:

# Проверка системных подов Istio
kubectl get pods -n istio-system
# Проверка конфигурации Istio
istioctl analyze
# Проверка состояния прокси Istio (должно быть пусто, если всё в порядке)
istioctl proxy-status

Вы должны увидеть поды вроде istiod, istio-ingressgateway и istio-egressgateway, которые работают счастливо. Если какие-либо поды застряли в состоянии ожидания или ошибки, пришло время проявить свои детективные способности и разобраться.

Развёртывание вашего первого приложения с поддержкой Istio

Пришло время заняться практическими делами! Давайте развернём знаменитое приложение Bookinfo — это как «Hello World» для сервис-мешей, но с большей индивидуальностью.

Сначала создайте пространство имён и включите автоматическое внедрение sidecar:

# Создание нового пространства имён
kubectl create namespace bookinfo
# Включение автоматического внедрения sidecar
kubectl label namespace bookinfo istio-injection=enabled
# Проверка метки
kubectl get namespace bookinfo --show-labels

Магия происходит с меткой istio-injection=enabled. Любой под, развёрнутый в этом пространстве имён, автоматически получит Envoy sidecar — без необходимости ручного вмешательства.

Теперь развернём приложение Bookinfo:

# Развёртывание приложения Bookinfo
kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml -n bookinfo
# Ожидание готовности подов
kubectl get pods -n bookinfo
# Проверка сервисов
kubectl get services -n bookinfo

Вы должны увидеть четыре сервиса: productpage, details, reviews и ratings. У каждого пода теперь есть два контейнера — ваше приложение и прокси Envoy sidecar.

Управление трафиком: контроль потока

Вот где Istio начинает показывать себя. Давайте создадим некоторые правила управления трафиком, чтобы контролировать, как запросы проходят через наше приложение.

Создание шлюза

Сначала нам нужен Istio Gateway, чтобы открыть наше приложение внешнему миру:

apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: bookinfo-gateway
  namespace: bookinfo
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: bookinfo
  namespace: bookinfo
spec:
  hosts:
  - "*"
  gateways:
  - bookinfo-gateway
  http:
  - match:
    - uri:
        exact: /productpage
    - uri:
        prefix: /static
    - uri: