Service mesh для микросервисов. Часть II, основы работы с Istio

от автора

Перевод статьи подготовлен специально для студентов курса «Инфраструктурная платформа на основе Kubernetes».

Настройка базового микросервиса в Kubernetes обманчиво проста. В одной из последних статей мы рассказали, как легко начать работать с контейнерами. Мы скомпоновали простой образ Docker, развернули его с помощью Kubernetes и выполнили запрос приложения. Это было нетрудно, но в жизни облачные архитектуры, как правило, сложнее. Они включают десятки и даже сотни сервисов с базами данных, аутентификацией и другими нужными в реальности элементами.

Администрировать их порой — сплошная головная боль. В этой статье мы расскажем об Istio — инструменте для service mesh (эту архитектуру мы рассматривали ранее), который выводит управление крупными облачными развертываниями на новый уровень.

Микросервисы дают вам широкие возможности масштабирования, а service mesh дополняет их преимуществами централизации, типичными для монолитных сред (например, журналами и контролем версий). Подробнее об особенностях и преимуществах service mesh мы писали в предыдущей статье из этой серии.

Эта же публикация посвящена возможностям Istio для реализации шаблона облачной архитектуры с использованием mesh-сетей. Мы научимся настраивать плоскость управления, рассмотрим сильные стороны Istio и, наконец, возьмем сервис Kubernetes, с которым работали в прошлый раз, добавим к нему sidecar-прокси и свяжем его со свежесозданной плоскостью управления.

Знакомство с плоскостью данных и sidecar-прокси

Два основных архитектурных термина в Istio — плоскость данных (data plane) и плоскость управления (control plane). Плоскость данных работает с данными, которые перемещаются в приложении, передаются различным экземплярам сервисов и обрабатываются самими сервисами. Для ее реализации используется главным образом sidecar-прокси. На уровне управления определяется порядок инстанцирования сервисов, место хранения данных телеметрии и информации о сервисах. К основным элементам плоскости управления относятся Pilot и Mixer. Давайте разберемся, как это все работает.

Sidecar-прокси выполняется вместе с подом, который определяет ваш сервис в Kubernetes. Он добавляется к основным компонентам сервиса и работает с трафиком, который направляется в этот сервис. Вы можете добавить sidecar-прокси к существующему определению сервиса в поде: в сервис просто добавятся строки, определяющие sidecar-прокси, и он начнет работать.

Взамен вы получите целый список преимуществ, которые лежат в основе облачной mesh-сети Istio. Sidecar-прокси перехватывает трафик, поступающий в сервис, и позволяет осуществлять его интеллектуальную маршрутизацию. Речь идет и о простых задачах, таких как балансировка нагрузки или обработка прерываний TLS, которые заметно ускоряют работу, и о более сложных процессах, таких как контроль версий, поэтапное развертывание новой версии сервиса и сбор показателей использования ресурсов. Sidecar-прокси позволяет добавлять все эти возможности в существующую архитектуру микросервисов без реорганизации всей системы.

Как только проясняется первоначальное предназначение sidecar-прокси, становятся очевидными преимущества Istio и облачных service mesh в целом. Фактически все sidecar-прокси архитектуры в совокупности, функционируя как унифицированные связующие элементы между подами сервисов, пропускают через себя весь трафик, проходящий через приложение. Это значит, что при необходимости усилить защиту они выступают в роли единого расположения, где можно добавлять процессы аутентификации и протокол HTTPS между сервисами, вести журнал событий для проверки на наличие аномалий и развертывать средства управления трафиком и фильтрации для проверки подлинности.

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

Централизация: плоскость управления

Помимо плоскости данных Istio включает плоскость управления. Она играет роль контроллера для всех sidecar-прокси, выполняемых в приложении, и центрального репозитория для всей информации (такой как записи журналов и сведения о версиях), который воспринимается сервисами в сети как единый источник достоверных данных.

При работе с Istio основным способом взаимодействия с плоскостью управления является Kubernetes. После установки пакетов Istio и добавления определений можно использовать для доступа к плоскости управления команды kubectl, которые управляют состоянием системы. Например, процесс обновления пода до новой версии с помощью kubectl начинается с обновления переменных локальной плоскости управления.

Это проще всего увидеть, воспользовавшись командой get-svc в составе kubectl — вы получите список сервисов, связанных с конкретной библиотекой. Чтобы проверить, какие компоненты Istio выполняются, можно воспользоваться следующей командой:

kubectl get svc -n istio-system

Отобразится список основных элементов плоскости управления Istio, выполняемых в фоновом режиме. Возможно, некоторые из них вам уже знакомы, например Citadel — сервис, который управляет защитой трафика между сервисами.

Установка Istio

Давайте посмотрим, какие возможности Istio поддерживает по умолчанию. Мы установим плоскость управления Istio для администрирования базового API HTTP, который был описан в предыдущей статье. Этот сервис API был определен в Kubernetes и реализован как одиночный под Kubernetes с выполняемым в нем API.

Чтобы установить Istio, выполняйте шаги, описанные в кратком официальном руководстве. Начните с загрузки последней версии Istio с соответствующей страницы. Программа все еще активно развивается, поэтому работать лучше всего с ее последними выпусками. Просто скачайте файл и удостоверьтесь, что он доступен в нужном каталоге.

Затем добавьте определения Istio в Kubernetes, чтобы их можно было использовать с инструментом командной строки kubectl. Добавьте полученные ранее файлы .yaml в каталог установки с помощью команды kubectl apply:

kubectl apply -f install/kubernetes/helm/istio/templates/crds.yaml

Затем активируйте установку Istio, выбрав способ аутентификации. Я буду использовать доступную по умолчанию взаимную HTTPS-аутентификацию, которая отлично подходит для проведения демонстраций и начала работы. Чтобы добавить service mesh в существующий проект, нужно еще немного разобраться с доступными опциями. На данном этапе можно выполнить следующую команду:

kubectl apply -f install/kubernetes/istio-demo-auth.yaml

После этого вы сможете продолжить. Вам нужно будет добавить структуру Istio в поды, которые были созданы ранее, а для новых подов — добавлять Istio как зависимость.

Развертывание приложения helloworld

Воспользуемся пробным приложением helloworld, которое описано в нашей более ранней публикации. Будут созданы: одно развертывание, один сервис, один шлюз и один виртуальный сервис. Обновите файл конфигурации, чтобы он совпадал со следующим:

helloworld.yaml

apiVersion: v1 kind: Service metadata:    name: helloworld spec:    type: ClusterIP    ports:       - port: 80       targetPort: 8080    selector:        app: helloworld --- apiVersion: apps/v1 kind: Deployment metadata:    name: helloworld-v1 spec:    replicas: 1    selector:       matchLabels:          app: helloworld    template:       metadata:       labels:          app: helloworld          version: v1       spec:          containers:           - name: helloworld-kubernetes -             image: haseebm/helloworld-kubernetes             ports:              - containerPort: 8080 --- apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata:    name: helloworld-gateway spec:    selector:       istio: ingressgateway # use istio default controller    servers:     - port:          number: 80          name: http          protocol: HTTP    hosts:     - "*" --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata:    name: helloworld spec:    hosts:     - "*"    gateways:     - helloworld-gateway    http:       route:        - destination:            host: helloworld            port:               number: 80

Внедрение sidecar-прокси Istio вручную

Istio задействует образец sidecar-прокси, чтобы разместить контейнер sidecar-прокси Istio в одном поде с контейнером приложения helloworld.

$ kubectl apply -f <(istioctl kube-inject -f helloworld.yaml) service/helloworld created deployment.extensions/helloworld-v1 created gateway.networking.istio.io/helloworld-gateway created virtualservice.networking.istio.io/helloworld created

Проверьте, чтобы поды и сервис выполнялись:

$ kubectl get pod,svc | grep helloworld pod/helloworld-v1-1cbca3f8d5-achr2  2/2        Running service/helloworld           ClusterIP       10.160.58.61

Теперь проверьте трафик для приложения helloworld:

$ curl a2******.ap-southeast-1.elb.amazonaws.com/api/hello

Hello world v1

Следующие шаги

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

В дальнейшем мы рассмотрим другие сценарии применения Istio и облачных mesh-сетей для улучшения безопасности и управляемости нашей пробной архитектуры. Так, следующая статья будет посвящена управлению развертываниями и обновлением версий в Istio для эффективного распространения обновлений кода без перебоев в работе и повреждения развертываний.

Асад Файзи (Asad Faizi),
учредитель и исполнительный директор, CloudPlex.io, Inc
asad@cloudplex.io
www.cloudplex.io


ссылка на оригинал статьи https://habr.com/ru/company/otus/blog/477434/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *