1. Обзор
В первой части лабораторной работы вы создали приложение ASP.NET Core , поместили его в контейнер, развернули в Google Kubernetes Engine (GKE) и настроили его трафик для управления Istio .
Во второй части лабораторной работы предполагается, что у вас уже есть кластер Kubernetes и запущенное приложение из первой лабораторной работы. Вы увидите, как Istio может помочь в управлении, мониторинге и защите ваших сервисов с минимальными изменениями кода. В частности, вы изучаете такие функции Istio, как метрики, трассировка, визуализация сервисов, динамическое управление трафиком, внедрение ошибок и многое другое.
Что вы узнаете
- Как запросить метрики с помощью Prometheus.
- Как визуализировать метрики с помощью Grafana.
- Как создать новую версию вашего сервиса.
- Как привязать сервис к определенной версии.
- Как разделить трафик между разными версиями.
- Как внедрить ошибки в сервисные вызовы.
Что вам понадобится
Как вы будете использовать этот урок?
Как бы вы оценили свой опыт работы с Google Cloud Platform?
2. Настройка и требования
Самостоятельная настройка среды
- Войдите в Cloud Console и создайте новый проект или повторно используйте существующий. (Если у вас еще нет учетной записи Gmail или G Suite, вам необходимо ее создать .)
Запомните идентификатор проекта — уникальное имя для всех проектов Google Cloud (имя, указанное выше, уже занято и не подойдет вам, извините!). Позже в этой лаборатории он будет называться PROJECT_ID
.
- Далее вам необходимо включить биллинг в Cloud Console, чтобы использовать ресурсы Google Cloud.
Прохождение этой лаборатории кода не должно стоить много, если вообще стоит. Обязательно следуйте всем инструкциям в разделе «Очистка», в которых рассказывается, как отключить ресурсы, чтобы не взимать плату за пределами этого руководства. Новые пользователи Google Cloud имеют право на участие в программе бесплатной пробной версии стоимостью 300 долларов США .
Запустить Cloud Shell
Хотя Google Cloud можно управлять удаленно с вашего ноутбука, в этой лаборатории вы используете Google Cloud Shell , среду командной строки, работающую в Google Cloud.
Активировать Cloud Shell
- В Cloud Console нажмите «Активировать Cloud Shell». .
Если вы никогда раньше не запускали Cloud Shell, вам будет представлен промежуточный экран (ниже сгиба) с описанием того, что это такое. В этом случае нажмите «Продолжить» (и вы больше никогда его не увидите). Вот как выглядит этот одноразовый экран:
Подготовка и подключение к Cloud Shell займет всего несколько минут.
Эта виртуальная машина оснащена всеми необходимыми инструментами разработки. Он предлагает постоянный домашний каталог объемом 5 ГБ и работает в Google Cloud, что значительно повышает производительность сети и аутентификацию. Большую часть, если не всю, работу в этой лаборатории кода можно выполнить с помощью просто браузера или 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
Убедитесь, что Прометей запущен:
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 — еще одно дополнение для визуализации метрик.
Установите Графану. Замените 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 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
), а VirtualService, созданный вами в предыдущей лабораторной работе ( 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
Обновите VirtualService:
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
Обновите VirtualService:
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
Обновите VirtualService:
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
Обновите VirtualService:
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 License.
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:
kubectl delete -f install/kubernetes/istio-demo-auth.yaml
Чтобы подтвердить, что Istio больше нет:
kubectl get pods -n istio-system
Удалить кластер Kubernetes
gcloud container clusters delete hello-dotnet-cluster