Развертывание приложения ASP.NET Core в Google Kubernetes Engine с помощью Istio (часть 2)

1. Обзор

В первой части лабораторной работы вы создали приложение ASP.NET Core , контейнеризировали его и развернули в Google Kubernetes Engine (GKE), а также настроили управление трафиком с помощью Istio .

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

Что вы узнаете

  • Как запрашивать метрики с помощью Prometheus.
  • Как визуализировать метрики с помощью Grafana.
  • Как создать новую версию вашего сервиса.
  • Как закрепить сервис за определенной версией.
  • Как распределить трафик между разными версиями.
  • Как внедрять ошибки в вызовы сервисных служб.

Что вам понадобится

Как вы будете использовать этот учебный материал?

Прочитайте только от начала до конца. Прочитайте текст и выполните упражнения.

Как бы вы оценили свой опыт работы с Google Cloud Platform?

Новичок Средний Профессионал

2. Настройка и требования

Настройка среды для самостоятельного обучения

  1. Войдите в Cloud Console и создайте новый проект или используйте существующий. (Если у вас еще нет учетной записи Gmail или G Suite, вам необходимо ее создать .)

H_hgylo4zxOllHaAbPKJ7VyqCKPDUnDhkr-BsBIFBsrB6TYSisg6LX-uqmMhh4sXUy_hoa2Qv87C2nFmkg-QAcCiZZp0qtpf6VPaNEEfP_iqt29KVLD-gklBWugQVeOWsFnJmNjHDw

dcCPqfBIwNO4R-0fNQLUC4aYXOOZhKhjUnakFLZJGeziw2ikOxGjGkCHDwN5x5kCbPFB8 fiOzZnX-GfuzQ8Ox-UU15BwHirkVPR_0RJwl0oXrhqZmMIvZMa_uwHugBJIdx5-bZ6Z8Q

jgLzVCxk93d6E2bbonzATKA4jFZReoQ-fORxZZLEi5C3D-ubnv6nL-eP-iyh7qAsWyq_nyzzuEoPFD1wFOFZOe4FWhPBJjUDncnTxTImT3Ts9TM54f4nPpsAp52O0y3Cb19IceAEgQ

Запомните идентификатор проекта (Project ID) — уникальное имя для всех проектов Google Cloud (указанное выше имя уже занято и вам не подойдёт, извините!). В дальнейшем в этом практическом занятии оно будет обозначаться как PROJECT_ID .

  1. Далее вам потребуется включить оплату в Cloud Console, чтобы использовать ресурсы Google Cloud.

Выполнение этого практического задания не должно стоить дорого, если вообще что-либо. Обязательно следуйте инструкциям в разделе «Очистка», где указано, как отключить ресурсы, чтобы избежать дополнительных расходов после завершения этого урока. Новые пользователи Google Cloud имеют право на бесплатную пробную версию стоимостью 300 долларов США .

Запустить Cloud Shell

Хотя Google Cloud можно управлять удаленно с ноутбука, в этом практическом занятии вы будете использовать Google Cloud Shell — среду командной строки, работающую в Google Cloud.

Активировать Cloud Shell

  1. В консоли Cloud нажмите «Активировать Cloud Shell» . dnDTxS9j60RcXdTjea12HLB9paS9Gzf7PfFLE9RW8g0Qx1bz7nmCzyCu4rjluX3bOEwavOpDwioXEkzOf6xtZp6-ZbJa08jwJqtmeeW8jZ1tYfi2lyXqvW3WFHP0eAxDkQDfpO9Ljw .

yzBQBp2RC1EFvSSLYVkMA2m6LHqGsp22O81rUS5tGb9Y1FqlVhoRj_ka8V_uEjtpcirZRULMy1IjNr848uYvb9mC9RcGGqeayaLcXFfRwUGeXWChZPtWkHzUshTcqx_wJHis0X8viA

Если вы никогда раньше не запускали Cloud Shell, вам будет показан промежуточный экран (внизу), описывающий его назначение. В этом случае нажмите «Продолжить» (и вы больше никогда его не увидите). Вот как выглядит этот одноразовый экран:

VgsaqGbKPRiqK24CqAKjSXjepuJT96PmiDqQMcySmWKx8QyW5F3G2D8JH2d08ek-YM77wWKxPvggpOFER8Hbq3aaZipTDU2o0il7A0kS3FXY_NzuujjEqDF1nsbDKkNMThrqcdMGtQ

Подготовка и подключение к Cloud Shell займут всего несколько минут.

7RuYr-LCKzdiE1veTFmL_lYrVxsMZ6-xDoxAnfwPPc5uFA0utmFGejvu81jGmTdbqnqxrytW3KcHT6xrMIRc3bskctnDZC5nJdpqw-LRxu3r35hL4A0BSBTtbtirfh3PKv-eOKt8Rg

Эта виртуальная машина оснащена всеми необходимыми инструментами разработки. Она предоставляет постоянный домашний каталог размером 5 ГБ и работает в облаке Google, что значительно повышает производительность сети и аутентификацию. Большая часть, если не вся, работа в этом практическом задании может быть выполнена с помощью обычного браузера или вашего Chromebook.

После подключения к Cloud Shell вы увидите, что ваша аутентификация пройдена и что проект уже настроен на ваш идентификатор проекта.

  1. Выполните следующую команду в 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> :

f579a9baedc108a9.png

Если вы не видите приложение, вернитесь к предыдущей лабораторной работе, чтобы убедиться, что вы выполнили все шаги и что приложение, а также 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» :

772a5248aa493025.png

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

272ee63c1fe0be16.png

Чтобы узнать больше о 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, посетив веб-версию предварительного просмотра:

806d696d85267a37.png

524cb9f6d66f8655.png

Чтобы узнать больше о Granfana, см. раздел «Визуализация метрик с помощью Grafana» .

5. Создайте новую версию приложения.

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

Для начала давайте изменим приложение. Откройте редактор кода в Cloud Shell.

mxrggIJ2Zz8E47ULCEo4NywjM-EpSkZF5c3TQgfGx4nODwP2obiQXrwQjEEaXuBhJDA2j J5evR7TuHIy1gsqqDRFm0Wh3xhZUu9tn_xb1ygFlBm1HKJqLdfz_aK7WJS33u2IBDO2oQ

Перейдите в 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":

11d528132dbb6cee.png

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

3eb0d5be1b4cb40b.png

Это происходит потому, что развертывания 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»:

3eb0d5be1b4cb40b.png

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, перейдите по ссылке.

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

Лицензия

Данная работа распространяется под лицензией 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