Как установить и использовать Istio с Kubernetes

Вступление

Сетка обслуживания - это уровень инфраструктуры, который позволяет вам управлять связью между микросервисами вашего приложения. По мере того, как все больше разработчиков работают с микросервисами, сервисные сетки развиваются, чтобы упростить и повысить эффективность этой работы за счет объединения общих задач управления и администрирования в распределенной установке.

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

В этом руководстве вы установите Istio с помощью диспетчера пакетовHelm для Kubernetes. Затем вы будете использовать Istio, чтобы предоставить демонстрационное приложениеNode.js внешнему трафику, создав ресурсыGateway иVirtual Service. Наконец, вы получите доступ к надстройке телеметрииGrafana для визуализации данных трафика вашего приложения.

Предпосылки

Для завершения этого урока вам понадобится:

  • Кластер Kubernetes 1.10+ с включенным управлением доступом на основе ролей (RBAC). Эта установка будет использоватьDigitalOcean Kubernetes cluster с тремя узлами, но вы можете использоватьcreate a cluster using another method.

[.note] #Note: Мы настоятельно рекомендуем кластер с не менее 8 ГБ доступной памяти и 4 виртуальных ЦП для этой настройки. В этом руководстве в качестве узлов будут использоваться три стандартные капли DigitalOcean 4 ГБ / 2 виртуальных ЦП.
#

  • Инструмент командной строкиkubectl, установленный на сервере разработки и настроенный для подключения к вашему кластеру. Вы можете узнать больше об установкеkubectl вofficial documentation.

  • Helm установлен на вашем сервере разработки, а Tiller установлен в вашем кластере, следуя указаниям, изложенным в шагах 1 и 2How To Install Software on Kubernetes Clusters with the Helm Package Manager.

  • Docker установлен на вашем сервере разработки. Если вы работаете с Ubuntu 18.04, выполните шаги 1 и 2How To Install and Use Docker on Ubuntu 18.04; в противном случае следуйтеofficial documentation для получения информации об установке в других операционных системах. Обязательно добавьте своего пользователя без полномочий root в группуdocker, как описано в шаге 2 связанного руководства.

  • АккаунтDocker Hub. Чтобы узнать, как это настроить, обратитесь кthis introduction в Docker Hub.

[[шаг-1 -—- упаковка-приложения]] == Шаг 1. Упаковка приложения

Чтобы использовать наше демонстрационное приложение с Kubernetes, нам нужно будет клонировать код и упаковать его, чтобыkubelet agent мог вытащить изображение.

Нашим первым шагом будет клонированиеnodejs-image-demo respository изDigitalOcean Community GitHub account. Этот репозиторий включает код из настройки, описанной вHow To Build a Node.js Application with Docker, в которой описывается, как создать образ для приложения Node.js и как создать контейнер с использованием этого образа. Вы можете найти больше информации о самом приложении в серииFrom Containers to Kubernetes with Node.js.

Для начала клонируйте репозиторий nodejs-image-demo в каталог с именемistio_project:

git clone https://github.com/do-community/nodejs-image-demo.git istio_project

Перейдите в каталогistio_project:

cd istio_project

Этот каталог содержит файлы и папки для приложения информации об акулах, которое предлагает пользователям основную информацию об акулах. В дополнение к файлам приложения в каталоге содержится Dockerfile с инструкциями для создания образа Docker с помощью кода приложения. Для получения дополнительной информации об инструкциях в Dockerfile см.Step 3 of How To Build a Node.js Application with Docker.

Чтобы проверить, что код приложения и файл Dockerfile работают должным образом, вы можете создать и пометить изображение с помощью командыdocker build, а затем использовать образ для запуска демонстрационного контейнера. Использование флага-t сdocker build позволит вам пометить изображение своим именем пользователя Docker Hub, чтобы вы могли отправить его в Docker Hub после его тестирования.

Создайте образ с помощью следующей команды:

docker build -t your_dockerhub_username/node-demo .

. в команде указывает, что контекст сборки - это текущий каталог. Мы назвали изображениеnode-demo, но вы можете дать ему другое имя.

После завершения процесса сборки вы можете перечислить свои изображения с помощьюdocker images:

docker images

Вы увидите следующий вывод, подтверждающий сборку изображения:

OutputREPOSITORY                          TAG                 IMAGE ID            CREATED             SIZE
your_dockerhub_username/node-demo   latest              37f1c2939dbf        5 seconds ago       77.6MB
node                                10-alpine           9dfa73010b19        2 days ago          75.3MB

Затем вы воспользуетесьdocker run, чтобы создать контейнер на основе этого изображения. Мы включим три флага с этой командой:

  • -p: публикует порт на контейнере и сопоставляет его с портом на нашем хосте. Мы будем использовать порт80 на хосте, но вы можете изменить его при необходимости, если у вас есть другой процесс, работающий на этом порту. Для получения дополнительной информации о том, как это работает, см. Это обсуждение в документации Docker поport binding.

  • -d: запускает контейнер в фоновом режиме.

  • --name: позволяет дать контейнеру индивидуальное имя.

Выполните следующую команду, чтобы построить контейнер:

docker run --name node-demo -p 80:8080 -d your_dockerhub_username/node-demo

Осмотрите свои запущенные контейнеры с помощьюdocker ps:

docker ps

Вы увидите вывод, подтверждающий, что ваш контейнер приложения работает:

OutputCONTAINER ID        IMAGE                               COMMAND                  CREATED             STATUS              PORTS                  NAMES
49a67bafc325        your_dockerhub_username/node-demo   "docker-entrypoint.s…"   8 seconds ago       Up 6 seconds        0.0.0.0:80->8080/tcp   node-demo

Теперь вы можете посетить IP-адрес своего сервера, чтобы проверить настройку:http://your_server_ip. Ваше приложение отобразит следующую целевую страницу:

Application Landing Page

Теперь, когда вы проверили приложение, вы можете остановить работающий контейнер. Снова используйтеdocker ps, чтобы получитьCONTAINER ID:

docker ps
OutputCONTAINER ID        IMAGE                               COMMAND                  CREATED              STATUS              PORTS                  NAMES
49a67bafc325        your_dockerhub_username/node-demo   "docker-entrypoint.s…"   About a minute ago   Up About a minute   0.0.0.0:80->8080/tcp   node-demo

Остановите контейнер с помощьюdocker stop. Не забудьте заменить перечисленные здесьCONTAINER ID на свое собственное приложениеCONTAINER ID:

docker stop 49a67bafc325

Теперь, когда вы проверили изображение, вы можете отправить его в Docker Hub. Сначала войдите в учетную запись Docker Hub, которую вы создали в условиях:

docker login -u your_dockerhub_username

При появлении запроса введите пароль учетной записи Docker Hub. При таком ведении журнала в домашнем каталоге вашего пользователя без полномочий root будет создан файл~/.docker/config.json с вашими учетными данными Docker Hub.

Отправьте образ приложения в Docker Hub с помощьюdocker push command. Не забудьте заменитьyour_dockerhub_username своим именем пользователя Docker Hub:

docker push your_dockerhub_username/node-demo

Теперь у вас есть образ приложения, который вы можете использовать для запуска приложений с Kubernetes и Istio. Далее вы можете перейти к установке Istio с Helm.

[[step-2 -—- install-istio-with-helm]] == Шаг 2 - Установка Istio с Helm

Хотя Istio предлагает различные способы установки, в документации рекомендуется использовать Helm для максимальной гибкости в управлении параметрами конфигурации. Мы установим Istio с Helm и обеспечим включение дополнения Grafana, чтобы мы могли визуализировать данные трафика для нашего приложения.

Сначала добавьте репозиторий Istio:

helm repo add istio.io https://storage.googleapis.com/istio-release/releases/1.1.7/charts/

Это позволит вам использовать схемы Helm в хранилище для установки Istio.

Проверьте, что у вас есть репо:

helm repo list

Вы должны увидеть репоistio.io в списке:

OutputNAME            URL
stable          https://kubernetes-charts.storage.googleapis.com
local           http://127.0.0.1:8879/charts
istio.io        https://storage.googleapis.com/istio-release/releases/1.1.7/charts/

Затем установитеCustom Resource Definitions (CRD) Istio с диаграммойistio-init, используяhelm install command:

helm install --name istio-init --namespace istio-system istio.io/istio-init
OutputNAME:   istio-init
LAST DEPLOYED: Fri Jun  7 17:13:32 2019
NAMESPACE: istio-system
STATUS: DEPLOYED
...

Эта команда фиксирует 53 CRD вkube-apiserver, делая их доступными для использования в сетке Istio. Он также создаетnamespace для объектов Istio с именемistio-system и использует параметр--name для наименования Helmreleaseistio-init. Релиз в Helm относится к конкретному развертыванию диаграммы с включенными конкретными параметрами конфигурации.

Чтобы убедиться, что все необходимые CRD были зафиксированы, выполните следующую команду:

kubectl get crds | grep 'istio.io\|certmanager.k8s.io' | wc -l

Это должно вывести число53.

Теперь вы можете установить диаграммуistio. Чтобы убедиться, что надстройка телеметрии Grafana установлена ​​вместе с диаграммой, мы будем использовать параметр конфигурации--set grafana.enabled=true с нашей командойhelm install. Мы также будем использовать протокол установки для желаемогоconfiguration profile: профиля по умолчанию. В Istio есть несколько профилей конфигурации на выбор при установке с Helm, которые позволяют настраивать Istiocontrol plane and data plane sidecars. Профиль по умолчанию рекомендуется для рабочих развертываний, и мы будем использовать его для ознакомления с параметрами конфигурации, которые мы будем использовать при переходе на производство.

Выполните следующую командуhelm install, чтобы установить диаграмму:

helm install --name istio --namespace istio-system --set grafana.enabled=true istio.io/istio
OutputNAME:   istio
LAST DEPLOYED: Fri Jun  7 17:18:33 2019
NAMESPACE: istio-system
STATUS: DEPLOYED
...

И снова мы устанавливаем наши объекты Istio в пространство именistio-system и называем выпуск - в данном случаеistio.

Мы можем проверить, чтоService objects, которые мы ожидаем для профиля по умолчанию, были созданы с помощью следующей команды:

kubectl get svc -n istio-system

Сервисы, которые мы ожидаем увидеть здесь, включаютistio-citadel,istio-galley,istio-ingressgateway,istio-pilot,istio-policy,istio-sidecar-injector,istio-telemetry. , иprometheus. Мы также ожидаем увидеть службуgrafana, поскольку мы включили это дополнение во время установки:

OutputNAME                     TYPE           CLUSTER-IP       EXTERNAL-IP       PORT(S)                                                                                                                                      AGE
grafana                  ClusterIP      10.245.85.162                3000/TCP                                                                                                                                     3m26s
istio-citadel            ClusterIP      10.245.135.45                8060/TCP,15014/TCP                                                                                                                           3m25s
istio-galley             ClusterIP      10.245.46.245                443/TCP,15014/TCP,9901/TCP                                                                                                                   3m26s
istio-ingressgateway     LoadBalancer   10.245.171.39    174.138.125.110   15020:30707/TCP,80:31380/TCP,443:31390/TCP,31400:31400/TCP,15029:30285/TCP,15030:31668/TCP,15031:32297/TCP,15032:30853/TCP,15443:30406/TCP   3m26s
istio-pilot              ClusterIP      10.245.56.97                 15010/TCP,15011/TCP,8080/TCP,15014/TCP                                                                                                       3m26s
istio-policy             ClusterIP      10.245.206.189               9091/TCP,15004/TCP,15014/TCP                                                                                                                 3m26s
istio-sidecar-injector   ClusterIP      10.245.223.99                443/TCP                                                                                                                                      3m25s
istio-telemetry          ClusterIP      10.245.5.215                 9091/TCP,15004/TCP,15014/TCP,42422/TCP                                                                                                       3m26s
prometheus               ClusterIP      10.245.100.132               9090/TCP                                                                                                                                     3m26s

Мы также можем проверить наличие соответствующего IstioPods с помощью следующей команды:

kubectl get pods -n istio-system

Модули, соответствующие этим службам, должны иметьSTATUS изRunning, что указывает на то, что модули привязаны к узлам и что контейнеры, связанные с модулями, работают:

OutputNAME                                     READY   STATUS      RESTARTS   AGE
grafana-67c69bb567-t8qrg                 1/1     Running     0          4m25s
istio-citadel-fc966574d-v5rg5            1/1     Running     0          4m25s
istio-galley-cf776876f-5wc4x             1/1     Running     0          4m25s
istio-ingressgateway-7f497cc68b-c5w64    1/1     Running     0          4m25s
istio-init-crd-10-bxglc                  0/1     Completed   0          9m29s
istio-init-crd-11-dv5lz                  0/1     Completed   0          9m29s
istio-pilot-785694f946-m5wp2             2/2     Running     0          4m25s
istio-policy-79cff99c7c-q4z5x            2/2     Running     1          4m25s
istio-sidecar-injector-c8ddbb99c-czvwq   1/1     Running     0          4m24s
istio-telemetry-578b6f967c-zk56d         2/2     Running     1          4m25s
prometheus-d8d46c5b5-k5wmg               1/1     Running     0          4m25s

ПолеREADY указывает, сколько контейнеров в поде работает. Для получения дополнительной информации обратитесь кdocumentation on Pod lifecycles.

[.Примечание]##

Note:
Если вы видите неожиданные фазы в столбцеSTATUS, помните, что вы можете устранить неполадки в модулях с помощью следующих команд:

kubectl describe pods your_pod -n pod_namespace
kubectl logs your_pod -n pod_namespace

Последним шагом в установке Istio будет создание проксиEnvoy, которые будут развернуты какsidecars для служб, работающих в сети.

Коляски обычно используются для добавления дополнительного уровня функциональности в существующие контейнерные среды. Istiomesh architecture полагается на связь между сайдкарами Envoy, которые составляют плоскость данных меша, и компонентами плоскости управления. Чтобы сетка работала, нам нужно убедиться, что каждый Стручок в сетке также будет запускать коляску посланника.

Достичь этой цели можно двумя способами:manual sidecar injection иautomatic sidecar injection. Мы включим автоматическое добавление sidecar-файлов вlabeling пространство имен, в котором мы будем создавать объекты нашего приложения с меткойistio-injection=enabled. Это гарантирует, что контроллерMutatingAdmissionWebhook может перехватывать запросы кkube-apiserver и выполнять определенное действие - в данном случае гарантируя, что все наши поды приложений начинаются с сопроводительного файла.

Мы будем использовать пространство именdefault для создания объектов нашего приложения, поэтому мы применим меткуistio-injection=enabled к этому пространству имен с помощью следующей команды:

kubectl label namespace default istio-injection=enabled

Мы можем проверить, что команда работала как задумано, запустив:

kubectl get namespace -L istio-injection

Вы увидите следующий вывод:

OutputAME              STATUS   AGE   ISTIO-INJECTION
default           Active   47m   enabled
istio-system      Active   16m
kube-node-lease   Active   47m
kube-public       Active   47m
kube-system       Active   47m

Установив и настроив Istio, мы можем перейти к созданию нашего приложения Service и объектовDeployment.

[[step-3 -—- create-application-objects]] == Шаг 3 - Создание объектов приложения

Установив сетку Istio и настроив для внедрения дополнительных модулей, мы можем создать приложениеmanifest сspecifications для наших объектов Service и Deployment. Спецификации в манифесте Kubernetes описывают желаемое состояние каждого объекта.

Наша служба приложений гарантирует, что модули, на которых работают наши контейнеры, остаются доступными в динамической среде, так как отдельные модули создаются и уничтожаются, а наше развертывание будет описывать желаемое состояние наших модулей.

Откройте файл с именемnode-app.yaml с помощьюnano или вашего любимого редактора:

nano node-app.yaml

Сначала добавьте следующий код для определения Службы приложенияnodejs:

~/istio_project/node-app.yaml

apiVersion: v1
kind: Service
metadata:
  name: nodejs
  labels:
    app: nodejs
spec:
  selector:
    app: nodejs
  ports:
  - name: http
    port: 8080

Это определение службы включаетselector, который будет соответствовать подам с соответствующей меткойapp: nodejs. Мы также указали, что служба будет нацелена на порт8080 на любом поде с соответствующей меткой.

Мы также называем служебный порт в соответствии сrequirements for Pods and Services Istio. Значениеhttp - это одно из значений, которые Istio принимает для поляname.

Далее, под Сервисом, добавьте следующие спецификации для Развертывания приложения. Обязательно заменитеimage, указанный в спецификацииcontainers, на образ, который вы создали и отправили в Docker Hub вStep 1:

~/istio_project/node-app.yaml

...
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nodejs
  labels:
    version: v1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nodejs
  template:
    metadata:
      labels:
        app: nodejs
        version: v1
    spec:
      containers:
      - name: nodejs
        image: your_dockerhub_username/node-demo
        ports:
        - containerPort: 8080

Спецификации этого развертывания включают количествоreplicas (в данном случае 1), а такжеselector, определяющее, какими модулями будет управлять развертывание. В этом случае он будет управлять модулями с меткойapp: nodejs.

Полеtemplate содержит значения, которые выполняют следующие функции:

  • Примените меткуapp: nodejs к модулям, управляемым развертыванием. Istiorecommends добавляет меткуapp в спецификации развертывания, чтобы предоставить контекстную информацию для метрик и телеметрии Istio.

  • Примените меткуversion, чтобы указать версию приложения, соответствующую этому развертыванию. Как и в случае с меткойapp, Istio рекомендует включать меткуversion для предоставления контекстной информации.

  • Определите спецификации контейнеров, которые будут запускать поды, включая контейнерname иimage. image здесь - это образ, который вы создали вStep 1 и отправили в Docker Hub. Спецификации контейнера также включают конфигурациюcontainerPort, указывающую на порт, который будет прослушивать каждый контейнер. Если порты здесь не указаны, они будут обходить прокси-сервер Istio. Обратите внимание, что этот порт,8080, соответствует целевому порту, указанному в определении службы.

Сохраните и закройте файл, когда вы закончите редактирование.

Имея этот файл на месте, мы можем перейти к редактированию файла, который будет содержать определения для объектов Gateway и Virtual Service, которые контролируют, как трафик входит в сетку и как он направляется туда.

[[step-4 -—- created-istio-objects]] == Шаг 4 - Создание объектов Istio

Для управления доступом к кластеру и маршрутизации к Сервисам Kubernetes использует IngressResources иControllers. Входящие ресурсы определяют правила для маршрутизации HTTP и HTTPS к службам кластера, а контроллеры загружают баланс входящего трафика и направляют его в нужные службы.

Для получения дополнительной информации об использовании ресурсов и контроллеров Ingress см.How to Set Up an Nginx Ingress with Cert-Manager on DigitalOcean Kubernetes.

Istio использует другой набор объектов для достижения сходных целей, хотя и с некоторыми важными отличиями. Вместо использования контроллера для балансировки трафика, сетка Istio используетGateway, который функционирует как балансировщик нагрузки, обрабатывающий входящие и исходящие HTTP / TCP-соединения. Затем шлюз позволяет применять правила мониторинга и маршрутизации к трафику, входящему в сетку. В частности, конфигурация, которая определяет маршрутизацию трафика, определяется как виртуальная служба. Каждая виртуальная служба включает в себя правила маршрутизации, которые соответствуют критериям определенного протокола и назначения.

Хотя ресурсы / контроллеры Kubernetes Ingress и шлюзы / виртуальные службы Istio имеют некоторые функциональные сходства, структура сетки вносит важные различия. Например, ресурсы и контроллеры Kubernetes Ingress предлагают операторам некоторые варианты маршрутизации, но шлюзы и виртуальные сервисы предоставляют более надежный набор функциональных возможностей, поскольку они позволяют трафику входить в сетку. Другими словами, ограниченные возможностиapplication layer, которые контроллеры и ресурсы Kubernetes Ingress предоставляют операторам кластера, не включают в себя функции, в том числе расширенную маршрутизацию, трассировку и телеметрию, предоставляемые дополнительными модулями в сервисной сети Istio.

Чтобы разрешить внешний трафик в нашу сетку и настроить маршрутизацию к нашему приложению Node, нам потребуется создать шлюз Istio и виртуальный сервис. Откройте файл с именемnode-istio.yaml для манифеста:

nano node-istio.yaml

Сначала добавьте определение для объекта Gateway:

~/istio_project/node-isto.yaml

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: nodejs-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"

Помимо указанияname для шлюза в полеmetadata, мы включили следующие спецификации:

  • selector, который будет соответствовать этому ресурсу с контроллером Istio IngressGateway по умолчанию, который был включен с помощьюconfiguration profile, который мы выбрали при установке Istio.

  • Спецификацияservers, которая указываетport, предоставляемые для входа, иhosts, предоставляемые шлюзом. В этом случае мы указываем всеhosts звездочкой (*), поскольку мы не работаем с конкретным защищенным доменом.

Ниже определения шлюза добавьте спецификации для виртуальной службы:

~/istio_project/node-istio.yaml

...
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: nodejs
spec:
  hosts:
  - "*"
  gateways:
  - nodejs-gateway
  http:
  - route:
    - destination:
        host: nodejs

Помимо предоставленияname для этой Виртуальной службы, мы также включаем спецификации для этого ресурса, которые включают:

  • Полеhosts, указывающее целевой хост. В этом случае мы снова используем подстановочный знак (*), чтобы обеспечить быстрый доступ к приложению в браузере, поскольку мы не работаем с доменом.

  • Полеgateways, указывающее шлюз, через который будут разрешены внешние запросы. В данном случае это наш шлюзnodejs-gateway.

  • Полеhttp, указывающее, как будет маршрутизироваться HTTP-трафик.

  • Полеdestination, указывающее, куда будет направлен запрос. В этом случае он будет перенаправлен на службуnodejs, которая неявно расширяется до полного доменного имени службы (FQDN) в среде Kubernetes:nodejs.default.svc.cluster.local. Однако важно отметить, что полное доменное имя будет основано на пространстве имен, в котором определенrule, а не на службе, поэтому обязательно используйте полное доменное имя в этом поле, когда служба приложения и виртуальная служба находятся в разных пространства имен. Чтобы узнать о системе доменных имен (DNS) Kubernetes в более общем плане, см.An Introduction to the Kubernetes DNS Service.

Сохраните и закройте файл, когда вы закончите редактирование.

Установив файлыyaml, вы можете создать службу и развертывание приложения, а также объекты шлюза и виртуальной службы, которые обеспечат доступ к вашему приложению.

[[step-5 -—- created-application-resources-and-enable-telemetry-access]] == Шаг 5. Создание ресурсов приложения и включение доступа к телеметрии

Создав объекты службы и приложения для вашего приложения вместе со шлюзом и виртуальной службой, вы сможете сгенерировать некоторые запросы к вашему приложению и просмотреть соответствующие данные на ваших панелях мониторинга Istio Grafana. Однако сначала вам нужно будет настроить Istio для предоставления дополнения Grafana, чтобы вы могли получить доступ к панелям мониторинга в вашем браузере.

Мы будем использоватьenable Grafana access with HTTP, но когда вы работаете в производственной среде или в чувствительной среде, настоятельно рекомендуется использоватьenable access with HTTPS.

Поскольку мы устанавливаем параметр конфигурации--set grafana.enabled=true при установке Istio вStep 2, у нас есть Grafana Service и Pod в нашем пространстве именistio-system, что мы подтвердили на этом шаге.

После того, как эти ресурсы уже есть, нашим следующим шагом будет создание манифеста для шлюза и виртуальной службы, чтобы мы могли предоставить дополнение Grafana.

Откройте файл для манифеста:

nano node-grafana.yaml

Добавьте следующий код в файл, чтобы создать шлюз и виртуальную службу для предоставления и маршрутизации трафика в службу Grafana:

~/istio_project/node-grafana.yaml

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: grafana-gateway
  namespace: istio-system
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 15031
      name: http-grafana
      protocol: HTTP
    hosts:
    - "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: grafana-vs
  namespace: istio-system
spec:
  hosts:
  - "*"
  gateways:
  - grafana-gateway
  http:
  - match:
    - port: 15031
    route:
    - destination:
        host: grafana
        port:
          number: 3000

Наши спецификации шлюза Grafana и виртуальной службы аналогичны тем, которые мы определили для шлюза приложений и виртуальной службы вStep 4. Однако есть несколько отличий:

  • Grafana будет отображаться на именованном портуhttp-grafana (порт15031), и он будет работать на порту3000 на хосте.

  • И шлюз, и виртуальная служба определены в пространстве именistio-system.

  • host в этой виртуальной службе - это службаgrafana в пространстве именistio-system. Поскольку мы определяем это правило в том же пространстве имен, в котором работает служба Grafana, расширение FQDN снова будет работать без конфликтов.

[.note] #Note: Поскольку наш текущийMeshPolicy настроен для запуска TLS вpermissive mode, нам не нужно применятьDestination Rule к нашему манифесту. Если вы выбрали другой профиль при установке Istio, вам нужно будет добавить правило назначения, чтобы отключить взаимный TLS при включении доступа к Grafana по HTTP. Для получения дополнительной информации о том, как это сделать, вы можете обратиться кofficial Istio documentaion о включении доступа к надстройкам телеметрии с помощью HTTP.
#

Сохраните и закройте файл, когда вы закончите редактирование.

Создайте свои ресурсы Grafana с помощью следующей команды:

kubectl apply -f node-grafana.yaml

Командаkubectl apply позволяет применить определенную конфигурацию к объекту в процессе его создания или обновления. В нашем случае мы применяем конфигурацию, указанную в файлеnode-grafana.yaml, к нашим объектам Gateway и Virtual Service в процессе их создания.

Вы можете взглянуть на шлюз в пространстве именistio-system с помощью следующей команды:

kubectl get gateway -n istio-system

Вы увидите следующий вывод:

OutputNAME              AGE
grafana-gateway   47s

Вы можете сделать то же самое для Виртуальной службы:

kubectl get virtualservice -n istio-system
OutputNAME         GATEWAYS            HOSTS   AGE
grafana-vs   [grafana-gateway]   [*]     74s

Создав эти ресурсы, мы сможем получить доступ к нашим информационным панелям Grafana в браузере. Однако прежде чем мы это сделаем, давайте создадим наше приложение Service and Deployment вместе с нашим приложением Gateway и Virtual Service и проверим, можем ли мы получить доступ к нашему приложению в браузере.

Создайте приложение Service and Deployment с помощью следующей команды:

kubectl apply -f node-app.yaml

Подождите несколько секунд, а затем проверьте блоки приложения с помощью следующей команды:

kubectl get pods
OutputNAME                      READY   STATUS    RESTARTS   AGE
nodejs-7759fb549f-kmb7x   2/2     Running   0          40s

Контейнеры ваших приложений работают, как вы можете видеть в столбцеSTATUS, но почему в столбцеREADY отображается список2/2, если в манифесте приложения изStep 3 указана только 1 реплика?

Этот второй контейнер - коляска посланника, которую вы можете проверить с помощью следующей команды. Обязательно замените указанный здесь модуль наNAME вашего собственного модуляnodejs:

kubectl describe pod nodejs-7759fb549f-kmb7x
OutputName:               nodejs-7759fb549f-kmb7x
Namespace:          default
...
Containers:
  nodejs:
  ...
  istio-proxy:
    Container ID:  docker://f840d5a576536164d80911c46f6de41d5bc5af5152890c3aed429a1ee29af10b
    Image:         docker.io/istio/proxyv2:1.1.7
    Image ID:      docker-pullable://istio/proxyv2@sha256:e6f039115c7d5ef9c8f6b049866fbf9b6f5e2255d3a733bb8756b36927749822
    Port:          15090/TCP
    Host Port:     0/TCP
    Args:
    ...

Далее создайте ваше приложение Gateway и Virtual Service:

kubectl apply -f node-istio.yaml

Вы можете проверить шлюз с помощью следующей команды:

kubectl get gateway
OutputNAME             AGE
nodejs-gateway   7s

И Виртуальный Сервис:

kubectl get virtualservice
OutputNAME     GATEWAYS           HOSTS   AGE
nodejs   [nodejs-gateway]   [*]     28s

Теперь мы готовы проверить доступ к приложению. Для этого нам понадобится внешний IP-адрес, связанный с нашей службойistio-ingressgateway, то естьLoadBalancer Service type.

Получите внешний IP-адрес для службыistio-ingressgateway с помощью следующей команды:

kubectl get svc -n istio-system

Вы увидите вывод, подобный следующему:

OutputNAME                     TYPE           CLUSTER-IP       EXTERNAL-IP       PORT(S)                                                                                                                                      AGE
grafana                  ClusterIP      10.245.85.162                3000/TCP                                                                                                                                     42m
istio-citadel            ClusterIP      10.245.135.45                8060/TCP,15014/TCP                                                                                                                           42m
istio-galley             ClusterIP      10.245.46.245                443/TCP,15014/TCP,9901/TCP                                                                                                                   42m
istio-ingressgateway     LoadBalancer   10.245.171.39    ingressgateway_ip 15020:30707/TCP,80:31380/TCP,443:31390/TCP,31400:31400/TCP,15029:30285/TCP,15030:31668/TCP,15031:32297/TCP,15032:30853/TCP,15443:30406/TCP   42m
istio-pilot              ClusterIP      10.245.56.97                 15010/TCP,15011/TCP,8080/TCP,15014/TCP                                                                                                       42m
istio-policy             ClusterIP      10.245.206.189               9091/TCP,15004/TCP,15014/TCP                                                                                                                 42m
istio-sidecar-injector   ClusterIP      10.245.223.99                443/TCP                                                                                                                                      42m
istio-telemetry          ClusterIP      10.245.5.215                 9091/TCP,15004/TCP,15014/TCP,42422/TCP                                                                                                       42m
prometheus               ClusterIP      10.245.100.132               9090/TCP                                                                                                                                     42m

istio-ingressgateway должен быть единственной службой сTYPELoadBalancer и единственной службой с внешним IP.

Перейдите к этому внешнему IP-адресу в своем браузере:http://ingressgateway_ip.

Вы должны увидеть следующую целевую страницу:

Application Landing Page

Затем создайте некоторую нагрузку на сайт, нажав обновить пять или шесть раз.

Теперь вы можете проверить панель инструментов Grafana, чтобы посмотреть данные трафика.

В браузере перейдите по следующему адресу, снова используя внешний IP-адресistio-ingressgateway и порт, указанный в манифесте Grafana Gateway:http://ingressgateway_ip:15031.

Вы увидите следующую целевую страницу:

Grafana Home Dash

Нажав наHome вверху страницы, вы попадете на страницу с папкойistio. Чтобы получить список раскрывающихся параметров, щелкните значок папкиistio:

Istio Dash Options Dropdown Menu

В этом списке опций щелкнитеIstio Service Dashboard.

Это приведет вас к целевой странице с другим выпадающим меню:

Service Dropdown in Istio Service Dash

Выберитеnodejs.default.svc.cluster.local из списка доступных опций.

Теперь вы сможете просматривать данные трафика для этой службы:

Nodejs Service Dash

Теперь у вас есть работающее приложение Node.js, запущенное в сервисной сетке Istio с включенным Grafana и настроенным для внешнего доступа.

Заключение

В этом руководстве вы установили Istio с помощью диспетчера пакетов Helm и использовали его для предоставления службы приложения Node.js с использованием объектов Gateway и Virtual Service. Вы также сконфигурировали объекты Gateway и Virtual Service для предоставления модуля телеметрии Grafana для просмотра данных трафика для вашего приложения.

По мере продвижения к производству вы захотите предпринять такие шаги, какsecuring your application Gateway with HTTPS, и убедиться, что доступ к вашей службе Grafana также равенsecure.

Вы также можете изучить другиеtelemetry-related tasks, включаяcollecting and processing metrics,logs иtrace spans.

Related