1. Обзор
В первой части лабораторной работы вы создали приложение ASP.NET Core , контейнеризировали его и развернули в Google Kubernetes Engine (GKE), а также настроили управление трафиком с помощью Istio .
Вторая часть лабораторной работы предполагает, что у вас уже запущен кластер Kubernetes и приложение из первой части. Вы увидите, как Istio может помочь управлять, отслеживать и обеспечивать безопасность ваших сервисов с минимальными изменениями в коде. В частности, вы изучите такие возможности Istio, как метрики, трассировка, визуализация сервисов, динамическое управление трафиком, внедрение ошибок и многое другое.
Что вы узнаете
- Как запрашивать метрики с помощью Prometheus.
- Как визуализировать метрики с помощью Grafana.
- Как создать новую версию вашего сервиса.
- Как закрепить сервис за определенной версией.
- Как распределить трафик между разными версиями.
- Как внедрять ошибки в вызовы сервисных служб.
Что вам понадобится
Как вы будете использовать этот учебный материал?
Как бы вы оценили свой опыт работы с Google Cloud Platform?
2. Настройка и требования
Настройка среды для самостоятельного обучения
- Войдите в Cloud Console и создайте новый проект или используйте существующий. (Если у вас еще нет учетной записи Gmail или G Suite, вам необходимо ее создать .)
Запомните идентификатор проекта (Project ID) — уникальное имя для всех проектов Google Cloud (указанное выше имя уже занято и вам не подойдёт, извините!). В дальнейшем в этом практическом занятии оно будет обозначаться как PROJECT_ID .
- Далее вам потребуется включить оплату в Cloud Console, чтобы использовать ресурсы Google Cloud.
Выполнение этого практического задания не должно стоить дорого, если вообще что-либо. Обязательно следуйте инструкциям в разделе «Очистка», где указано, как отключить ресурсы, чтобы избежать дополнительных расходов после завершения этого урока. Новые пользователи Google Cloud имеют право на бесплатную пробную версию стоимостью 300 долларов США .
Запустить Cloud Shell
Хотя Google Cloud можно управлять удаленно с ноутбука, в этом практическом занятии вы будете использовать Google Cloud Shell — среду командной строки, работающую в Google Cloud.
Активировать Cloud Shell
- В консоли Cloud нажмите «Активировать Cloud Shell» .
.
Если вы никогда раньше не запускали Cloud Shell, вам будет показан промежуточный экран (внизу), описывающий его назначение. В этом случае нажмите «Продолжить» (и вы больше никогда его не увидите). Вот как выглядит этот одноразовый экран:
Подготовка и подключение к Cloud Shell займут всего несколько минут.
Эта виртуальная машина оснащена всеми необходимыми инструментами разработки. Она предоставляет постоянный домашний каталог размером 5 ГБ и работает в облаке Google, что значительно повышает производительность сети и аутентификацию. Большая часть, если не вся, работа в этом практическом задании может быть выполнена с помощью обычного браузера или вашего Chromebook.
После подключения к Cloud Shell вы увидите, что ваша аутентификация пройдена и что проект уже настроен на ваш идентификатор проекта.
- Выполните следующую команду в Cloud Shell, чтобы подтвердить свою аутентификацию:
gcloud auth list
вывод команды
Credentialed Accounts
ACTIVE ACCOUNT
* <my_account>@<my_domain.com>
To set the active account, run:
$ gcloud config set account `ACCOUNT`
gcloud config list project
вывод команды
[core] project = <PROJECT_ID>
Если это не так, вы можете установить это с помощью следующей команды:
gcloud config set project <PROJECT_ID>
вывод команды
Updated property [core/project].
3. Протестируйте приложение.
Перед началом лабораторной работы убедитесь, что приложение, использованное в предыдущей работе, по-прежнему работает. Напоминаем, что внешний IP-адрес и порт шлюза отображаются следующим образом (они указаны в разделе EXTERNAL-IP :
kubectl get svc istio-ingressgateway -n istio-system
Чтобы просмотреть приложение, откройте браузер и перейдите по адресу http://<gatewayurl> :

Если вы не видите приложение, вернитесь к предыдущей лабораторной работе, чтобы убедиться, что вы выполнили все шаги и что приложение, а также Istio установлены и работают должным образом.
На этом этапе у вас может возникнуть вопрос: «В чем преимущество Istio?». Позволив Istio управлять трафиком вашего приложения, вы получаете такие функции, как метрики, трассировка, динамическое управление трафиком, визуализация сервисов, внедрение ошибок и многое другое совершенно бесплатно.
На следующем этапе вы начнете с изучения метрик.
4. Метрики с помощью Grafana и Prometheus
По умолчанию Istio генерирует некоторые метрики. Вы можете использовать дополнения для запроса и визуализации этих метрик по умолчанию.
Прометей
Prometheus — это решение для мониторинга с открытым исходным кодом. Вы можете использовать Prometheus для запроса метрик, генерируемых Istio, но для этого сначала необходимо установить дополнение Prometheus.
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.8/samples/addons/prometheus.yaml
Убедитесь, что Prometheus запущен:
kubectl get svc prometheus -n istio-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE prometheus ClusterIP 10.31.243.62 <none> 9090/TCP 1d
Направьте трафик на приложение, несколько раз посетив http://<gatewayurl> или выполнив команду curl.
Настройка переадресации портов для пользовательского интерфейса Prometheus:
kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=prometheus -o jsonpath='{.items[0].metadata.name}') 8080:9090
Теперь вы можете выполнить запрос, нажав кнопку «Предварительный просмотр веб-страницы» в правом верхнем углу Cloud Shell и выбрав «Предварительный просмотр на порту 8080» :

В новой вкладке откроется пользовательский интерфейс Prometheus:

Чтобы узнать больше о Prometheus, см. раздел «Запросы к метрикам с помощью Prometheus» .
Графана
Grafana — это ещё одно дополнение для визуализации метрик.
Установите Grafana. Замените istio-version на вашу текущую версию Istio, например, 1.0.3-gke.3 :
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.8/samples/addons/grafana.yaml
Убедитесь, что Grafana запущена:
kubectl get svc grafana -n istio-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE grafana ClusterIP 10.31.248.230 <none> 3000/TCP 1d
Направьте трафик на приложение, несколько раз посетив http://<gatewayurl> или выполнив команду curl.
Настройка переадресации портов для пользовательского интерфейса Grafana:
kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=grafana -o jsonpath='{.items[0].metadata.name}') 8080:3000
Вы можете просмотреть панели мониторинга Grafana, посетив веб-версию предварительного просмотра:


Чтобы узнать больше о Granfana, см. раздел «Визуализация метрик с помощью Grafana» .
5. Создайте новую версию приложения.
В какой-то момент развернутому вами в производственной среде приложению потребуется исправление ошибок или добавление новых функций. Давайте посмотрим, как выглядит этот процесс.
Для начала давайте изменим приложение. Откройте редактор кода в Cloud Shell.
Перейдите в Index.cshtml в папке HelloWorldAspNetCore > Views > Home и обновите одно из сообщений карусели.
Найдите следующую строку:
Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core
И измените это на следующее:
Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core on Google Cloud
Сохраните изменения, а затем вернитесь в Cloud Shell. Внутри HelloWorldAspNetCore, соберите образ Docker:
docker build -t gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v2 .
И отправить данные в Реестр контейнеров:
docker push gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v2
После загрузки образа контейнера вы можете развернуть новую версию на следующем шаге.
6. Создайте новое развертывание.
Для развертывания новой версии сначала необходимо создать для нее новое развертывание в Kubernetes. Добавьте следующее в конец файла aspnetcore.yaml :
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: aspnetcore-v2
spec:
replicas: 1
selector:
matchLabels:
app: aspnetcore
version: v2
template:
metadata:
labels:
app: aspnetcore
version: v2
spec:
containers:
- name: aspnetcore
image: gcr.io/YOUR-PROJECT-ID/hello-dotnet:v2
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
Разверните новую версию в пространстве имен по умолчанию с помощью kubectl :
kubectl apply -f aspnetcore.yaml
service "aspnetcore" unchanged deployment.extensions "aspnetcore-v1" unchanged deployment.extensions "aspnetcore-v2" created
Убедитесь, что необходимые модули запущены:
kubectl get pods
NAME READY STATUS RESTARTS AGE aspnetcore-v1-6cf64748-mddb 2/2 Running 0 34s aspnetcore-v2-5d765db-l9xmg 2/2 Running 0 1m
Теперь протестируйте приложение еще раз. Получите внешний IP-адрес шлюза:
kubectl get svc istio-ingressgateway -n istio-system
Он указан в разделе EXTERNAL-IP. Откройте браузер в режиме инкогнито и перейдите по адресу http://<replace-with-external-ip>
При обновлении страницы иногда появляется сообщение "Узнайте о создании веб-приложений с помощью ASP.NET Core":

В других случаях вы увидите сообщение "Узнайте о создании веб-приложений с помощью ASP.NET Core в Google Cloud":

Это происходит потому, что развертывания v1 и v2 находятся за одной и той же службой Kubernetes ( aspnetcore-service ), а виртуальная служба, созданная вами в предыдущей лабораторной работе ( aspnetcore-virtualservice ), использует эту службу в качестве хоста.
На следующем шаге вы привязываете службу к развертыванию v2 с помощью правила назначения (DestinationRule) .
7. Привяжите свою службу к новой версии.
На этом шаге вы закрепляете за своей службой использование развертывания v2 , и это можно сделать с помощью DestinationRule . DestinationRule настраивает набор политик, которые будут применяться к запросу после выполнения операции маршрутизации VirtualService.
Объект DestinationRule также определяет адресуемые подмножества, то есть именованные версии, соответствующего целевого хоста. Эти подмножества используются в спецификациях маршрутов VirtualService при отправке трафика к определенным версиям сервиса.
Создайте новый файл с именем aspnetcore-destinationrule.yaml :
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: aspnetcore-destinationrule
spec:
host: aspnetcore-service
trafficPolicy:
tls:
mode: ISTIO_MUTUAL
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
Далее создайте DestinationRule. Это создаст два подмножества (v1 и v2), которые вы сможете использовать из VirtualService:
kubectl apply -f aspnetcore-destinationrule.yaml
destinationrule.networking.istio.io "aspnetcore-destionationrule" created
Теперь вернитесь к файлу aspnetcore-virtualservice.yaml и обновите VirtualService, чтобы он использовал подмножество v2 :
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: aspnetcore-virtualservice
spec:
hosts:
- "*"
gateways:
- aspnetcore-gateway
http:
- route:
- destination:
host: aspnetcore-service
subset: v2
Обновите виртуальную службу:
kubectl apply -f aspnetcore-virtualservice.yaml
Откройте браузер и перейдите по адресу http://<replace-with-external-ip>. Даже после нескольких обновлений страницы вы должны увидеть сообщение «Узнайте о создании веб-приложений с помощью ASP.NET Core в Google Cloud»:

8. Разделение трафика между версиями.
Иногда для тестирования может потребоваться разделить трафик между версиями. Например, вы можете захотеть направить 75% трафика на версию v1, а 25% — на версию v2 сервиса. Это легко сделать с помощью Istio. Создайте новый файл aspnetcore-virtualservice-weights.yaml , чтобы указать два подмножества с разными весами:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: aspnetcore-virtualservice
spec:
hosts:
- "*"
gateways:
- aspnetcore-gateway
http:
- route:
- destination:
host: aspnetcore-service
subset: v1
weight: 75
- destination:
host: aspnetcore-service
subset: v2
weight: 25
Обновите виртуальную службу:
kubectl apply -f aspnetcore-virtualservice-weights.yaml
Теперь, при обновлении страницы в браузере, вы должны увидеть версии v1 и v2 в соотношении примерно 3:1.
Для получения более подробной информации см. разделение трафика в Istio .
9. Внедрение ошибок
Ещё одна полезная задача для тестирования в процессе разработки — это внедрение ошибок или задержек в трафик и наблюдение за тем, как сервисы реагируют на это.
Например, вам может потребоваться возвращать ошибку "неверный запрос" (HTTP 400) для 50% трафика, поступающего на версию v1. Создайте файл aspnetcore-virtualservice-fault-abort.yaml , соответствующий следующим параметрам:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: aspnetcore-virtualservice
spec:
hosts:
- "*"
gateways:
- aspnetcore-gateway
http:
- fault:
abort:
percentage:
value: 50
httpStatus: 400
route:
- destination:
host: aspnetcore-service
subset: v1
Обновите виртуальную службу:
kubectl apply -f aspnetcore-virtualservice-fault-abort.yaml
Теперь, при обновлении страницы в браузере, вы должны увидеть, что в половине случаев сервис v1 возвращает код ответа HTTP 400.
Или, возможно, вы хотите добавить задержку в 5 секунд к запросам. Создайте файл aspnetcore-virtualservice-fault-delay.yaml , соответствующий следующим параметрам:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: aspnetcore-virtualservice
spec:
hosts:
- "*"
gateways:
- aspnetcore-gateway
http:
- fault:
delay:
fixedDelay: 5s
percentage:
value: 100
route:
- destination:
host: aspnetcore-service
subset: v1
Обновите виртуальную службу:
kubectl apply -f aspnetcore-virtualservice-fault-delay.yaml
Теперь, после обновления страницы в браузере, вы должны увидеть, что запросы задерживаются на 5 секунд.
Чтобы узнать больше о функциях Istio, таких как тайм-ауты, повторные попытки, условные правила, автоматические выключатели и многое другое, см. раздел «Функции управления трафиком» .
10. Поздравляем!
Надеемся, эта лабораторная работа дала вам общее представление о том, что Istio может предложить вашим сервисам «из коробки». Чтобы узнать больше об Istio и GKE, перейдите по ссылке.
Следующие шаги
- Узнайте больше об Istio .
- Узнайте больше о Kubernetes .
- Узнайте больше о Google Kubernetes Engine .
- Узнайте больше о .NET на платформе Google Cloud Platform .
Лицензия
Данная работа распространяется под лицензией Creative Commons Attribution 2.0 Generic.
11. Уборка
Вы можете удалить приложение и деинсталлировать Istio, или же просто удалить кластер Kubernetes.
Удалите приложение
Чтобы удалить приложение:
kubectl delete -f aspnetcore-gateway.yaml kubectl delete -f aspnetcore-virtualservice.yaml kubectl delete -f aspnetcore-destinationrule.yaml kubectl delete -f aspnetcore.yaml
Чтобы убедиться, что приложение удалено:
kubectl get gateway kubectl get virtualservices kubectl get destinationrule kubectl get pods
Удалите Istio
Чтобы удалить Istio:
kubectl delete -f install/kubernetes/istio-demo-auth.yaml
Чтобы убедиться, что Истио исчез:
kubectl get pods -n istio-system
Удалить кластер Kubernetes
gcloud container clusters delete hello-dotnet-cluster