Развертывание приложения 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-0fNQLUC4aYXOOZhKhjUnakFLZJGeziw2ikOxGjGkCHDwN5x5kCbPFB8fiOzZnX-GfuzQ8Ox-UU15BwHirkVPR_0RJwl0oXrhqZmMIvZMa_uwHugBJIdx5-bZ6Z8Q

jgLzVCxk93d6E2bbonzATKA4jFZReoQ-fORxZZLEi5C3D-ubnv6nL-eP-iyh7qAsWyq_nyzzuEoPFD1wFOFZOe4FWhPBJjUDncnTxTImT3Ts9TM54f4nPpsAp52O0y3Cb19IceAEgQ

Запомните идентификатор проекта — уникальное имя для всех проектов 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 Console нажмите «Активировать Cloud Shell». dnDTxS9j60RcXdTjea12HLB9paS9Gzf7PfFLE9RW8g0Qx1bz7nmCzyCu4rjluX3bOEwa vOpDwioXEkzOf6xtZp6-ZbJa08jwJqtmeeW8jZ1tYfi2lyXqvW3WFHP0eAxDkQDfpO9L jw .

yzBQBp2RC1EFvSSLYVkMA2m6LHqGsp22O81rUS5tGb9Y1FqlVhoRj_ka8V_uEjtpcirZRULMy1IjNr848uYvb9mC9RcGGqeayaLcXFfRwUGeXWChZPtWkHzUshTcqx_wJHis0X8viA

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

VgsaqGbKPRiqK24CqAKjSXjepuJT96PmiDqQMcySmWKx8QyW5F3G2D8JH2d08ek-YM77wWKxPvggpOFER8Hbq3aaZipTDU2o0il7A0kS3FXY_NzuujjEqDF1nsbDKkNMThrqcdMGtQ

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

7RuYr-LCKzdiE1veTFmL_lYrVxsMZ6-xDoxAnfwPPc5uFA0utmFGejvu81jGmTdbqnqxrytW3KcHT6xrMIRc3bskctnDZC5nJdpqw-LRxu3r35hL4A0BSBTtbtirfh3PKv-eOKt8Rg

Эта виртуальная машина оснащена всеми необходимыми инструментами разработки. Он предлагает постоянный домашний каталог объемом 5 ГБ и работает в Google Cloud, что значительно повышает производительность сети и аутентификацию. Большую часть, если не всю, работу в этой лаборатории кода можно выполнить с помощью просто браузера или 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

Убедитесь, что Прометей запущен:

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 — еще одно дополнение для визуализации метрик.

Установите Графану. Замените 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-EpSkZF5c3TQgfGx4nODwP2obiQXrwQjeEEaXuBhJDA2jJ5evR7TuHIy1gsqqDRFm0Wh3xhZUu9tn_xb1ygFlBm1HKJqLdfz_aK7WJS33u2IBDO2o вопрос

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

11d528132dbb6cee.png

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

3eb0d5be1b4cb40b.png

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

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

Обновите 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.

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

Лицензия

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