Использование Istio
- Перед началом работы
- Установите Istio
- Установите тестовое приложение
- Посмотрите схему сервисной сети на дашборде Kiali
- Маршрутизируйте запросы
- Внедрите сбой в работу сервиса
- Перераспределите трафик
- Установите режим аутентификации с помощью mutual TLS
- Посмотрите метрики Istio на дашборде Prometheus
- Посмотрите метрики Istio на дашборде Grafana
- Удалите созданные ресурсы
Istio
Чтобы посмотреть варианты использования Istio:
- Установите Istio.
- Установите тестовое приложение.
- Посмотрите схему сервисной сети на дашборде Kiali.
- Маршрутизируйте запросы.
- Внедрите сбой в работу сервиса.
- Перераспределите трафик.
- Установите режим аутентификации с помощью mutual TLS.
- Посмотрите метрики Istio на дашборде Prometheus.
- Посмотрите метрики Istio на дашборде Grafana.
Если созданные ресурсы вам больше не нужны, удалите их.
Перед началом работы
-
Создайте кластер и группу узлов Kubernetes.
ВручнуюTerraform-
Если у вас еще нет сети, создайте ее.
-
Если у вас еще нет подсетей, создайте их в зонах доступности, где будут созданы кластер Kubernetes и группа узлов.
-
- Сервисный аккаунт с ролями
k8s.clusters.agent
иvpc.publicAdmin
на каталог, в котором создается кластер Kubernetes. От его имени будут создаваться ресурсы, необходимые кластеру Kubernetes. - Сервисный аккаунт с ролью container-registry.images.puller. От его имени узлы будут скачивать из реестра необходимые Docker-образы.
Совет
Вы можете использовать один и тот же сервисный аккаунт для управления кластером Kubernetes и его группами узлов.
- Сервисный аккаунт с ролями
-
Создайте группы безопасности для кластера Managed Service for Kubernetes и входящих в него групп узлов.
Важно
От настройки групп безопасности зависит работоспособность и доступность кластера, а также запущенных в нем сервисов и приложений.
-
Создайте кластер Kubernetes и группу узлов с оперативной памятью не менее 6 ГБ и с группами безопасности, созданными ранее.
-
Если у вас еще нет Terraform, установите его.
-
Получите данные для аутентификации. Вы можете добавить их в переменные окружения или указать далее в файле с настройками провайдера.
-
Настройте и инициализируйте провайдер. Чтобы не создавать конфигурационный файл с настройками провайдера вручную, скачайте его
. -
Поместите конфигурационный файл в отдельную рабочую директорию и укажите значения параметров. Если данные для аутентификации не были добавлены в переменные окружения, укажите их в конфигурационном файле.
-
Скачайте в ту же рабочую директорию файл конфигурации кластера k8s-cluster.tf
. В файле описаны:-
Сеть.
-
Кластер Kubernetes.
-
Сервисный аккаунт, необходимый для работы кластера и группы узлов Managed Service for Kubernetes.
-
Группы безопасности, которые содержат необходимые правила для кластера Managed Service for Kubernetes и входящих в него групп узлов.
Важно
От настройки групп безопасности зависит работоспособность и доступность кластера, а также запущенных в нем сервисов и приложений.
-
-
Укажите в файле
k8s-cluster.tf
:- Идентификатор каталога.
- Версию Kubernetes для кластера и групп узлов Kubernetes.
- Оперативную память для группы узлов не менее 6 ГБ. Значение должно быть кратно количеству vCPU.
- CIDR кластера Kubernetes.
- Имя сервисного аккаунта кластера Managed Service for Kubernetes.
-
Проверьте корректность файлов конфигурации Terraform с помощью команды:
terraform validate
Если в файлах конфигурации есть ошибки, Terraform на них укажет.
-
Создайте необходимую инфраструктуру:
-
Выполните команду для просмотра планируемых изменений:
terraform plan
Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
-
Если вас устраивают планируемые изменения, внесите их:
-
Выполните команду:
terraform apply
-
Подтвердите изменение ресурсов.
-
Дождитесь завершения операции.
-
В указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в консоли управления
. -
-
-
Установите kubectl
и настройте его на работу с созданным кластером.
Установите Istio
-
Установите продукт Istio из каталога приложений Yandex Cloud Marketplace. При установке приложения:
- Создайте новое пространство имен
istio-system
. - Установите дополнения для Istio (Kiali, Prometheus, Grafana, Loki, Jaeger).
- Создайте новое пространство имен
-
Убедитесь, что все поды Istio и его дополнений перешли в статус
Running
:kubectl get pods -n istio-system
Результат:
NAME READY STATUS RESTARTS AGE grafana-75c6d4fcf7-v4sfp 1/1 Running 0 2h istio-ingressgateway-6496999d57-hdbnf 1/1 Running 0 2h istiod-665dbb97c9-s6xxk 1/1 Running 0 2h jaeger-5468d9c886-x2bq8 1/1 Running 0 2h kiali-6854cc8574-26t65 1/1 Running 0 2h loki-0 1/1 Running 0 2h prometheus-54f86f6676-vmqqr 2/2 Running 0 2h
Установите тестовое приложение
-
Создайте новое пространство имен
todoapp
:kubectl create namespace todoapp
-
Добавьте пространству имен
todoapp
меткуistio-injection
:kubectl label namespace todoapp istio-injection=enabled
-
Установите тестовое приложение
todoapp
:kubectl apply -f https://raw.githubusercontent.com/yandex-cloud-examples/yc-mk8s-todo-app/main/kube/todoapp.yaml -n todoapp
Результат:
deployment.apps/todoapp-v1 created deployment.apps/todoapp-v2 created deployment.apps/recommender-v1 created deployment.apps/todoapp-redis-v1 created service/todoapp created service/recommender created service/todoapp-redis created
-
Проверьте состояние подов:
kubectl get pods -n todoapp
Результат:
NAME READY STATUS RESTARTS AGE recommender-v1-7865c4cfbb-hsp2k 2/2 Running 0 60s recommender-v1-7865c4cfbb-vqt68 2/2 Running 0 59s todoapp-redis-v1-dbdf4d44-48952 2/2 Running 0 59s todoapp-v1-6d4b78b6c9-gfkxd 2/2 Running 0 60s todoapp-v1-6d4b78b6c9-jc962 2/2 Running 0 60s todoapp-v2-7dd69b445f-2rznm 2/2 Running 0 60s todoapp-v2-7dd69b445f-gr4vn 2/2 Running 0 60s
Убедитесь, что все поды перешли в статус
Running
иREADY=2/2
. -
Проверьте состояние сервисов:
kubectl get services -n todoapp
Результат:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE recommender ClusterIP 10.96.255.93 <none> 80/TCP 80s todoapp ClusterIP 10.96.232.143 <none> 80/TCP 80s todoapp-redis ClusterIP 10.96.174.100 <none> 6379/TCP 80s
-
Проверьте, что веб-приложение работает:
kubectl exec "$(kubectl get pod -l app=recommender -n todoapp -o jsonpath='{.items[0].metadata.name}')" -n todoapp \ -- curl --silent --show-error todoapp:80 | grep -o "<title>.*</title>"
Результат:
<title>Тудуапп</title>
-
Опубликуйте приложение:
kubectl apply -f https://raw.githubusercontent.com/yandex-cloud-examples/yc-mk8s-todo-app/main/kube/todoapp-gateway.yaml -n todoapp
Результат:
gateway.networking.istio.io/todoapp-gateway created virtualservice.networking.istio.io/todoapp-vs created
-
Получите IP-адрес Ingress-шлюза для доступа к приложению:
kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}'
-
Чтобы запустить веб-приложение, вставьте в адресную строку браузера полученный IP-адрес.
Примечание
Если ресурс недоступен по указанному URL, то убедитесь, что группы безопасности для кластера Managed Service for Kubernetes и его групп узлов настроены корректно. Если отсутствует какое-либо из правил — добавьте его.
При обновлении страницы ее содержимое будет меняться. В зависимости от версии пода, который обслуживает ваш запрос, вы увидите:
- версия пода
v1
— блок со списком дел; - версия пода
v2
— блок со списком дел и блок с рекомендациями.
- версия пода
Посмотрите схему сервисной сети на дашборде Kiali
-
Убедитесь, что сервис
kiali
установлен и доступен в кластере Managed Service for Kubernetes:kubectl get service kiali -n istio-system
Результат:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kiali ClusterIP 10.96.207.108 <none> 20001/TCP,9090/TCP 15d
-
Настройте переадресацию порта сервиса
kiali
на локальный компьютер:kubectl port-forward service/kiali 8080:20001 -n istio-system
-
Чтобы открыть дашборд Kiali, вставьте в адресную строку браузера
http://localhost:8080
.Дашборд Kiali содержит различную информацию, например: схему сервисной сети, конфигурацию Istio, конфигурацию сервисов и их состояние, метрики, трейсы и логи из подов.
-
Чтобы сгенерировать трафик к тестовому приложению, поработайте с ним. Например, добавьте список дел.
-
На дашборде Kiali перейдите в раздел Graph и выберите пространство имен todoapp. На схеме вы увидите компоненты тестового приложения, работающие в сервисной сети Istio.
Совет
Используйте дашборд Kiali, чтобы отслеживать изменения в следующих пунктах этого руководства. Например, вы можете увидеть, как меняется отображение сервисов или распределение трафика.
Маршрутизируйте запросы
Поды сервиса todoapp
развернуты в версиях v1
и v2
параллельно. При обновлении страницы тестового приложения панель с рекомендациями отображается не всегда, т. к. только поды todoapp
версии v2
делают запрос к сервису рекомендаций и отображают результат.
С помощью маршрутизации направьте пользователей к конкретной версии сервиса:
-
Направьте все запросы к версии
v1
:kubectl apply -f https://raw.githubusercontent.com/yandex-cloud-examples/yc-mk8s-todo-app/main/kube/virtualservice-route-v1.yaml -n todoapp
Результат:
destinationrule.networking.istio.io/todoapp-dr created virtualservice.networking.istio.io/todoapp-vs configured
-
Обновите страницу тестового приложения несколько раз. Теперь все запросы обрабатываются подами версии
v1
. На странице отображается только блок со списком дел. -
Направьте все запросы к версии
v2
:kubectl apply -f https://raw.githubusercontent.com/yandex-cloud-examples/yc-mk8s-todo-app/main/kube/virtualservice-route-v2.yaml -n todoapp
Результат:
destinationrule.networking.istio.io/todoapp-dr unchanged virtualservice.networking.istio.io/todoapp-vs configured
-
Обновите страницу тестового приложения несколько раз. Теперь все запросы обрабатываются подами версии
v2
. На странице отображаются блок со списком дел и блок с рекомендациями.
Чтобы отменить маршрутизацию, выполните команду:
kubectl apply -f https://raw.githubusercontent.com/yandex-cloud-examples/yc-mk8s-todo-app/main/kube/todoapp-gateway.yaml -n todoapp
Результат:
gateway.networking.istio.io/todoapp-gateway unchanged
virtualservice.networking.istio.io/todoapp-vs configured
Внедрите сбой в работу сервиса
Istio позволяет тестировать надежность приложения с помощью внедрения сбоев в работу сервисов.
Обращения к сервису recommender
имеют тайм-аут в три секунды. Если за это время сервис не отвечает, блок с рекомендациями не отображается.
Смоделировать сбой можно, указав в конфигурации ресурса VirtualService
задержку более трех секунд. Например, этот блок реализует 50% вероятность возникновения задержки в пять секунд:
fault:
delay:
percentage:
value: 50.0
fixedDelay: 5s
Чтобы внедрить сбой в тестовое приложение:
-
Примените конфигурацию
VirtualService
:kubectl apply -f https://raw.githubusercontent.com/yandex-cloud-examples/yc-mk8s-todo-app/main/kube/virtualservice-delay.yaml -n todoapp
Результат:
destinationrule.networking.istio.io/recommender-dr created virtualservice.networking.istio.io/recommender-vs created
-
Обновите страницу тестового приложения несколько раз. Когда возникает задержка в ответе, блок с рекомендациями не отображается, хотя запрос обрабатывается подом версии
v2
. Приложение корректно обрабатывает сбой сервисаrecommender
.
Чтобы откатить конфигурацию VirtualService
, выполните команду:
kubectl delete -f https://raw.githubusercontent.com/yandex-cloud-examples/yc-mk8s-todo-app/main/kube/virtualservice-delay.yaml -n todoapp
Результат:
destinationrule.networking.istio.io "recommender-dr" deleted
virtualservice.networking.istio.io "recommender-vs" deleted
Перераспределите трафик
При обновлении версии микросервиса вы можете перераспределить трафик с одной версии микросервиса на другую, не влияя на количество подов приложений. Управлять маршрутами можно с помощью параметра weight
для ресурса VirtualService
.
Чтобы перераспределить трафик в тестовом приложении:
-
Установите вес 50% для версий
v1
иv2
:kubectl apply -f https://raw.githubusercontent.com/yandex-cloud-examples/yc-mk8s-todo-app/main/kube/virtualservice-weight-v2-50.yaml -n todoapp
Результат:
destinationrule.networking.istio.io/todoapp-dr unchanged virtualservice.networking.istio.io/todoapp-vs configured
-
Обновите страницу тестового приложения несколько раз. Приложение обрабатывается версиями подов
v1
иv2
примерно в равной пропорции. -
Увеличьте вес до 100% для версии
v2
:kubectl apply -f https://raw.githubusercontent.com/yandex-cloud-examples/yc-mk8s-todo-app/main/kube/virtualservice-weight-v2-100.yaml -n todoapp
Результат:
destinationrule.networking.istio.io/todoapp-dr unchanged virtualservice.networking.istio.io/todoapp-vs configured
-
Обновите страницу тестового приложения несколько раз. Приложение обрабатывается только подами версии
v2
.
Установите режим аутентификации с помощью mutual TLS
Приложения с сайдкарами-прокси Istio по умолчанию обмениваются между собой трафиком с mutual TLS шифрованием.
Вы можете настроить политику со строгим режимом аутентификации, запретив незашифрованный трафик от приложений без сайдкаров-прокси Istio.
Чтобы проверить работу тестового приложения в разных режимах:
-
Создайте политику аутентификации:
kubectl apply -f https://raw.githubusercontent.com/yandex-cloud-examples/yc-mk8s-todo-app/main/kube/peerauthentication.yaml -n todoapp
Результат:
peerauthentication.security.istio.io/default created
-
Попробуйте создать под в пространстве имен
default
, чтобы проверить соединение с сервисомtodoapp
:kubectl run -i -n default \ --rm \ --restart=Never curl \ --image=curlimages/curl \ --command \ -- sh -c 'curl --insecure http://todoapp.todoapp.svc.cluster.local'
Результат:
% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 curl: (56) Recv failure: Connection reset by peer pod "curl" deleted pod default/curl terminated (Error)
-
Удалите политику аутентификации:
kubectl delete -f https://raw.githubusercontent.com/yandex-cloud-examples/yc-mk8s-todo-app/main/kube/peerauthentication.yaml -n todoapp
Результат:
peerauthentication.security.istio.io "default" deleted
-
Попробуйте снова создать под:
kubectl run -i -n default \ --rm \ --restart=Never curl \ --image=curlimages/curl \ --command \ -- sh -c 'curl --insecure http://todoapp.todoapp.svc.cluster.local'
Результат:
% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 2658 100 2658 0 0 147k 0 --:--:-- --:--:-- --:--:-- 152k <!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Тудуапп</title> ...
Посмотрите метрики Istio на дашборде Prometheus
-
Убедитесь, что сервис
prometheus
установлен и доступен в кластере Managed Service for Kubernetes:kubectl get service prometheus -n istio-system
Результат:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE prometheus ClusterIP 10.96.147.249 <none> 9090/TCP 15d
-
Настройте переадресацию порта сервиса
prometheus
на локальный компьютер:kubectl port-forward service/prometheus 9090:9090 -n istio-system
-
Чтобы открыть дашборд Prometheus, вставьте в адресную строку браузера
http://localhost:9090
. -
Введите в поле Expression запрос:
istio_requests_total{destination_service="recommender.todoapp.svc.cluster.local"}
-
Перейдите на вкладку Graph. Она показывает метрики Istio.
Посмотрите метрики Istio на дашборде Grafana
-
Убедитесь, что сервис
grafana
установлен и доступен в кластере Managed Service for Kubernetes:kubectl get service grafana -n istio-system
Результат:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE grafana ClusterIP 10.96.205.86 <none> 3000/TCP 15d
-
Настройте переадресацию порта сервиса
grafana
на локальный компьютер:kubectl port-forward service/grafana 3000:3000 -n istio-system
-
Чтобы открыть дашборд Grafana, вставьте в адресную строку браузера
http://localhost:3000
. -
В списке дашбордов найдите и откройте Istio Mesh Dashboard. Он показывает метрики запросов к сервисам тестового приложения.
Удалите созданные ресурсы
Удалите ресурсы, которые вы больше не будете использовать, чтобы за них не списывалась плата:
-
В терминале перейдите в директорию с планом инфраструктуры.
Важно
Убедитесь, что в директории нет Terraform-манифестов с ресурсами, которые вы хотите сохранить. Terraform удаляет все ресурсы, которые были созданы с помощью манифестов в текущей директории.
-
Удалите ресурсы:
-
Выполните команду:
terraform destroy
-
Подтвердите удаление ресурсов и дождитесь завершения операции.
Все ресурсы, которые были описаны в Terraform-манифестах, будут удалены.
-