Застосунок Bookinfo
Цей приклад розгортає демонстраційний застосунок, що складається з чотирьох окремих мікросервісів, які використовуються для демонстрації різних можливостей Istio.
Застосунок показує інформацію про книги, схожу на один каталожний запис інтернет-магазину книг. На сторінці показується опис книги, деталі книги (ISBN, кількість сторінок і т.д.) та кілька відгуків про книгу.
Застосунок Bookinfo розбито на чотири окремі мікросервіси:
productpage
. Мікросервісproductpage
викликає мікросервісиdetails
таreviews
, щоб заповнити сторінку.details
. Мікросервісdetails
містить інформацію про книги.reviews
. Мікросервісreviews
містить огляди книг і також викликає мікросервісratings
.ratings
. Мікросервісratings
містить інформацію про рейтинги книг, яка супроводжує огляди.
Існує 3 версії мікросервісу reviews
:
- Версія v1 не викликає сервіс
ratings
. - Версія v2 викликає сервіс
ratings
і показує кожну оцінку у вигляді від 1 до 5 чорних зірок. - Версія v3 викликає сервіс
ratings
і показує кожну оцінку у вигляді від 1 до 5 червоних зірок.
Архітектуру цього застосунку показано нижче.
Цей застосунок є поліглотом, тобто мікросервіси написані різними мовами програмування. Варто зазначити, що ці сервіси не мають залежностей від Istio, але становлять цікавий приклад для сервісної мережі, зокрема завдяки різноманіттю сервісів, мов та версій сервісу reviews
.
Перед тим, як почати
Якщо ви ще цього не зробили, налаштуйте Istio, дотримуючись інструкцій з керівництва з встановлення.
Розгортання застосунку
Щоб запустити приклад з Istio, не потрібно вносити жодних змін до самого застосунку. Замість цього потрібно просто налаштувати та запустити служби в середовищі, де активовано Istio, з інʼєкцією sidecar Envoy для кожної служби. Результат розгортання виглядатиме так:
Усі мікросервіси будуть упаковані з sidecar Envoy, який перехоплює вхідні та вихідні виклики для служб, забезпечуючи необхідні засоби для зовнішнього контролю через панель управління Istio, маршрутизації, збору телеметрії та впровадження політик для застосунку в цілому.
Запуск сервісів застосунку
Перейдіть до кореневої теки встановлення Istio.
Стандартно встановлення Istio використовує автоматичну інʼєкцію sidecar. Додайте мітку до простору імен, де буде розміщено застосунок, з
istio-injection=enabled
:$ kubectl label namespace default istio-injection=enabled
Розгорніть ваш застосунок за допомогою команди
kubectl
:$ kubectl apply -f @samples/bookinfo/platform/kube/bookinfo.yaml@
Ця команда запускає всі чотири сервіси, показані на схемі архітектури застосунку
bookinfo
. Усі 3 версії сервісу reviews, v1, v2 та v3 будуть запущені.Переконайтеся, що всі сервіси та podʼи правильно визначені та працюють:
$ kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE details ClusterIP 10.0.0.31 <none> 9080/TCP 6m kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 7d productpage ClusterIP 10.0.0.120 <none> 9080/TCP 6m ratings ClusterIP 10.0.0.15 <none> 9080/TCP 6m reviews ClusterIP 10.0.0.170 <none> 9080/TCP 6m
та
$ kubectl get pods NAME READY STATUS RESTARTS AGE details-v1-1520924117-48z17 2/2 Running 0 6m productpage-v1-560495357-jk1lz 2/2 Running 0 6m ratings-v1-734492171-rnr5l 2/2 Running 0 6m reviews-v1-874083890-f0qf0 2/2 Running 0 6m reviews-v2-1343845940-b34q5 2/2 Running 0 6m reviews-v3-1813607990-8ch52 2/2 Running 0 6m
Щоб переконатися, що застосунок Bookinfo працює, надішліть запит до нього за допомогою команди
curl
з якогось podʼа, наприклад зratings
:$ kubectl exec "$(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}')" -c ratings -- curl -sS productpage:9080/productpage | grep -o "<title>.*</title>" <title>Simple Bookstore App</title>
Визначення IP та порту для ingress
Тепер, коли сервіси Bookinfo запущені, вам потрібно зробити застосунок доступним ззовні вашого кластера Kubernetes, наприклад, в оглядачі. Для цього використовується шлюз.
Створіть шлюз для застосунку Bookinfo:
Створіть Istio Gateway за допомогою наступної команди:
$ kubectl apply -f @samples/bookinfo/networking/bookinfo-gateway.yaml@ gateway.networking.istio.io/bookinfo-gateway created virtualservice.networking.istio.io/bookinfo created
Переконайтеся, що шлюз створено:
$ kubectl get gateway NAME AGE bookinfo-gateway 32s
Дотримуйтесь цих інструкцій для налаштування змінних
INGRESS_HOST
таINGRESS_PORT
для доступу до шлюзу. Поверніться сюди, коли вони будуть налаштовані.Створіть Kubernetes Gateway за допомогою наступної команди:
$ kubectl apply -f @samples/bookinfo/gateway-api/bookinfo-gateway.yaml@ gateway.gateway.networking.k8s.io/bookinfo-gateway created httproute.gateway.networking.k8s.io/bookinfo created
Оскільки створення ресурсу
Gateway
Kubernetes також розгорне повʼязаний проксі-сервіс, виконайте наступну команду, щоб дочекатися готовності шлюзу:$ kubectl wait --for=condition=programmed gtw bookinfo-gateway
Отримайте адресу та порт шлюзу з ресурсу bookinfo gateway:
$ export INGRESS_HOST=$(kubectl get gtw bookinfo-gateway -o jsonpath='{.status.addresses[0].value}') $ export INGRESS_PORT=$(kubectl get gtw bookinfo-gateway -o jsonpath='{.spec.listeners[?(@.name=="http")].port}')
Встановіть
GATEWAY_URL
:$ export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
Переконайтеся, що застосунок доступний ззовні кластера
Щоб підтвердити, що застосунок Bookinfo доступний ззовні кластера, виконайте наступну команду curl
:
$ curl -s "http://${GATEWAY_URL}/productpage" | grep -o "<title>.*</title>"
<title>Simple Bookstore App</title>
Ви також можете відкрити оглядач і перейти за посиланням http://$GATEWAY_URL/productpage
, щоб переглянути вебсторінку Bookinfo. Якщо кілька разів оновити сторінку, ви побачите різні версії відгуків, що показуються на сторінці productpage
, подані у стилі обходу по кругу (червоні зірки, чорні зірки, без зірок), оскільки ми ще не використовували Istio для контролю маршрутизації версій.
Визначення версій сервісів
Перед тим як використовувати Istio для контролю маршрутизації версій Bookinfo, необхідно визначити доступні версії.
Istio використовує підмножини у правилах призначення, щоб визначати версії сервісу. Виконайте наступну команду для створення стандартних правил призначення для сервісів Bookinfo:
$ kubectl apply -f @samples/bookinfo/networking/destination-rule-all.yaml@
Зачекайте кілька секунд, поки правила призначення поширяться.
Ви можете переглянути правила призначення за допомогою наступної команди:
$ kubectl get destinationrules -o yaml
На відміну від API Istio, який використовує підмножини DestinationRule
для визначення версій сервісу, API Gateway Kubernetes використовує визначення бекенд-сервісів для цієї мети.
Виконайте наступну команду, щоб створити визначення бекенд-сервісів для трьох версій сервісу reviews
:
$ kubectl apply -f @samples/bookinfo/platform/kube/bookinfo-versions.yaml@
Що далі
Тепер ви можете використовувати цей приклад для експериментів з можливостями Istio, такими як маршрутизація трафіку, інʼєкція збоїв, обмеження швидкості тощо. Щоб продовжити, зверніться до одного або кількох Завдань Istio, залежно від ваших інтересів. Налаштування маршрутизації запитів є хорошим місцем для початку для новачків.
Очищення
Коли закінчите експериментувати з прикладом Bookinfo, видаліть його та виконайте очищення, використовуючи наступну команду:
$ @samples/bookinfo/platform/kube/cleanup.sh@