Вступление
Сетка обслуживания - это уровень инфраструктуры, который позволяет вам управлять связью между микросервисами вашего приложения. По мере того, как все больше разработчиков работают с микросервисами, сервисные сетки развиваются, чтобы упростить и повысить эффективность этой работы за счет объединения общих задач управления и администрирования в распределенной установке.
Использование сервисной сети, такой как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
. Ваше приложение отобразит следующую целевую страницу:
Теперь, когда вы проверили приложение, вы можете остановить работающий контейнер. Снова используйте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
должен быть единственной службой сTYPE
LoadBalancer
и единственной службой с внешним IP.
Перейдите к этому внешнему IP-адресу в своем браузере:http://ingressgateway_ip
.
Вы должны увидеть следующую целевую страницу:
Затем создайте некоторую нагрузку на сайт, нажав обновить пять или шесть раз.
Теперь вы можете проверить панель инструментов Grafana, чтобы посмотреть данные трафика.
В браузере перейдите по следующему адресу, снова используя внешний IP-адресistio-ingressgateway
и порт, указанный в манифесте Grafana Gateway:http://ingressgateway_ip:15031
.
Вы увидите следующую целевую страницу:
Нажав наHome вверху страницы, вы попадете на страницу с папкойistio. Чтобы получить список раскрывающихся параметров, щелкните значок папкиistio:
В этом списке опций щелкнитеIstio Service Dashboard.
Это приведет вас к целевой странице с другим выпадающим меню:
Выберитеnodejs.default.svc.cluster.local
из списка доступных опций.
Теперь вы сможете просматривать данные трафика для этой службы:
Теперь у вас есть работающее приложение 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.