Translate

субота, 16 квітня 2022 р.

Istio. Part I: Service Mesh. Intro And Installation

Це вступна перша стаття про Istio і основи його роботи. У ній також торкнемось основ Service Mesh, його призначення та бонусів, що він надає.


1. WHAT IS SERVICE MESH

Отже почнемо із Service Mesh. Однією із причин її появи стало збільшення кількості різноманітних мікросервісів в інфраструктурах великих компаній після ділення монолітних додатків. Як наслідок цього процесу зросла кількість внутрішнього мережевого трафіку, котрий потрібно було якось "приборкувати". 

Разом із тим була необхідність в розмежуванні коду додатків та коду-обв'язки на кшталт балансування трафіку на рівні запитів (request-level load balancing), circuit-breaking (мережевий розрив інтеграції сервісів після досягнень певних показників запитів), дзеркалювання трафіку (mirroring, тобто повторення трафіку на декілька сервісів, наприклад, для тестування), трейсінгу тощо. Попередньо цей функціонал реалізовувався в окремих, іноді закритих, бібліотеках великих компаній (Hysterix в Netflix, Finagle в компанії Twitter тощо). У сучасному світі розгорнути додатковий проксі значно простіше ніж інтегрувати додаткову бібліотеку в кожне програмне рішення. До того ж вони можуть бути написані на різних мовах програмування, що ще більше підвищує вартість розробки.

Підсумовуючи все вищесказане, Service Mesh - це додатковий шар програмної інфраструктури для забезпечення більшого контролю внутрішньої взаємодії сервісів на мережевому рівні та їх моніторингу. Сама ідея досить молода, проте швидко набирає обертів та кількість її реалізацій стає дедалі більшою. В основі роботи Service Mesh, як правило, присутній додатковий сервіс-проксі, на котрий кожен додаток відправляє трафік, і власне вже потім проксі перенаправляє увесь трафік за необхідною адресою. Також він може реалізувати деякі вищезгадані патерни програмування, шифрування та моніторингу всього, що відбувається між мікросервісами, телеметрію тощо. Звісно все опціонально, тобто може вмикатись і вимикатись за потреби.

Найбільш популярні реалізації Service Mesh, що не прив'язані до cloud-платформ:

  • Consul Connect. Продукт відомої HashiCorp. Розроблювався як рішення для власної платформи Nomad, проте наразі доступний і для Kubernetes. У його основі також Envoy.
  • Linkerd. Проект входить до CNCF і фокусується більше на простоті ніж гнучкості.
  • Traefik Mesh. Також основна ціль - простота інсталяції і підтримки. На відміну від більшості конкурентів, у якості проксі виступає Traefik
  • Kuma. Platform-agnostic рішення, що може обслуговувати не лише Kubernetes сервіси, а також звичайні віртуальних машини. Основним мейтейнером Kuma є Kong, виробник популярного шлюзу Kong Gateway з відкритим кодом. Має статус CNCF Sandbox проєкту.
  • OSM (Open Service Mesh). Імплементація від Microsoft, тож ймовірно це непогане рішення для Azure. Використовує всі ті ж популярні дизайн-принципи що і конкуренти: Data/Control plane, Envoy, а також реалізує SMI (Service Mesh Interface)
  • Istio. Мабуть найбільш функціональний і як наслідок дещо складніший за інші рішення. Про нього, як я вже обіцяв надалі і піде мова.


2. ISTIO INTRO


Традиційно почнемо із історії проєкту. Istio був започаткований компаніями Google та IBM у партнерстві із командою Envoy, що є підрозділом Lyft. Із грецького Istio значить "вітрило", тож назва зовсім не випадкова. Вона була вигадана інженерами Varun Talwar (засновник Tetrate) та головним інженером Google Louis Ryan в 2017 році. Varun стверджував, що пошук влучного імені для проекту в грецькому словнику зайняла біля 3 годин.

На даний момент Istio не являється CNCF-проєктом і є досить молодим. У подальших yaml-описах буде видно, що версія ресурсів Istio - v1beta1, тож вже в недалекому майбутньому ця стаття може стати повністю або частково не актуальною.

Envoy в свою чергу існує як окремий проект і часто є складовим багатьох інших продуктів, наприклад, Cloud Foundry, Ambassador, Cilium та інші.

Базова схема роботи Istio виглядає наступним чином:

credits https://istio.io/latest/docs/ops/deployment/architecture/

Istio, як і багато інших Service Mesh систем, складається із 2-х основних частин - Control Plane та Data Plane. Перший представлений сервісом istiod, котрий раніше був поділений на Pilot, Citadel, Galley та Mixer.

Control Plane керує Envoy-проксі кожного сервісу і відповідальний за service discovery, конфігурацію та управління сертифікатами (виступає як Центр Сертифікації (CA)) задля забезпечення шифрування трафіку в Data Plane.


credits https://istio.io/latest/docs/concepts/security/

Процес випуску і продовження терміну дії сертифікатів повністю автоматичний. Після першого старту istio-agent, що працює поруч із Envoy-proxy в sidecar-контейнері поду, запитує підпис сертифікату (надсилає CSR) в istiod. Останній валідує запит на сертифікацію і у разі успіху підписує його та направляє сертифікат назад до istio-агента. Потім Envoy запитує необхідний для роботи сертифікат і, як наслідок, трафік прямує із Kubernetes-поду вже шифрованим. Istio-агент періодично перевіряє термін дії сертифікату і за необхідності запитую його перевипуск.

Зробимо перелік найбільш помітних можливостей, що реалізовані на рівні Istio/Envoy:


3. ISTIO INSTALLATION

Цього разу не будемо надто вдаватись в подробиці реалізації Istio. Просто проінсталюємо його, запустимо тестовий додаток, що використовує його ресурси та пересвідчимось у його правильній роботі.

Для подальшої демонстрації звісно необхідний Kubernetes кластер. Його конфігурація не так важлива, я буду використовувати свою попередню kubeadm-інсталяцію  із MetalLB для забезпечення LoadBalancer типу сервісу для bare-metal. Останнє не принципово, але дещо зручніше. Це два воркера і один майстер версії 1.23.4:

k8s-m-a 192.168.1.45
k8s-s-a  192.168.1.48
k8s-s-b  192.168.1.49


На даний момент рекомендований варіант інсталяції Istio - це архів із бінарним файлом istioctl. Helm-чарт поки перебуває в статусі альфа.

$ curl -s -L https://istio.io/downloadIstio | sh -

Downloading istio-1.13.2 from https://github.com/istio/istio/releases/download/1.13.2/istio-1.13.2-linux-amd64.tar.gz ...

Istio 1.13.2 Download Complete!

Istio has been successfully downloaded into the istio-1.13.2 folder on your system.

Next Steps:
See https://istio.io/latest/docs/setup/install/ to add Istio to your Kubernetes cluster.

To configure the istioctl client tool for your workstation,
add the /home/ipeacocks/istio-1.13.2/bin directory to your environment path variable with:
     export PATH="$PATH:/home/ipeacocks/istio-1.13.2/bin"

Begin the Istio pre-installation check by running:
     istioctl x precheck

Need more information? Visit https://istio.io/latest/docs/setup/install/


$ export PATH="$PATH:/home/ipeacocks/istio-1.13.2/bin"

$ istioctl version
client version: 1.13.2
control plane version: 1.13.2
data plane version: 1.13.2 (1 proxies)

$ istioctl install

This will install the Istio 1.13.2 default profile with ["Istio core" "Istiod" "Ingress gateways"] components into the cluster. Proceed? (y/N) y
✔ Istio core installed
✔ Istiod installed
✔ Ingress gateways installed
✔ Installation complete
Making this installation the default for injection and validation.

Thank you for installing Istio 1.13.  Please take a few minutes to tell us about your install/upgrade experience!  https://forms.gle/pzWZpAvMVBecaQ9h9


За замовчуванням використовується default профіль інсталяції, проте є і інші. Після установки має створитись новий неймспейс та інші Kubernetes ресурси:

$ kubectl get ns
NAME              STATUS   AGE
default           Active   8d
istio-system      Active   5m13s
kube-node-lease   Active   8d
kube-public       Active   8d
kube-system       Active   8d
metallb-system    Active   4d13h

$ kubectl get all -n istio-system
NAME                                       READY   STATUS    RESTARTS   AGE
pod/istio-ingressgateway-9c974f69d-x79rh   1/1     Running   0          4m37s
pod/istiod-dd696df84-wxb9t                 1/1     Running   0          5m31s

NAME                           TYPE           CLUSTER-IP      EXTERNAL-IP    PORT(S)                                      AGE
service/istio-ingressgateway   LoadBalancer   10.99.81.106    192.168.1.70   15021:31339/TCP,80:30773/TCP,443:32045/TCP   4m37s
service/istiod                 ClusterIP      10.103.36.255   <none>         15010/TCP,15012/TCP,443/TCP,15014/TCP        5m31s

NAME                                   READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/istio-ingressgateway   1/1     1            1           4m37s
deployment.apps/istiod                 1/1     1            1           5m31s

NAME                                             DESIRED   CURRENT   READY   AGE
replicaset.apps/istio-ingressgateway-9c974f69d   1         1         1       4m37s
replicaset.apps/istiod-dd696df84                 1         1         1       5m31s

NAME                                                       REFERENCE                         TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
horizontalpodautoscaler.autoscaling/istio-ingressgateway   Deployment/istio-ingressgateway   2%/80%    1         5         1          4m37s
horizontalpodautoscaler.autoscaling/istiod                 Deployment/istiod                 0%/80%    1         5         1          5m31s


У неймспейсі, де будуть деплоїтись додатки в mesh-мережі, має стояти лейбл istio-injection=enabled, котрий вказує, що в кожний под автоматично під час початкового деплою буде інжектовано додатковий Envoy-контейнер (sidecar):

$ kubectl label namespace default istio-injection=enabled
namespace/default labeled

$ kubectl get ns default --show-labels

NAME      STATUS   AGE   LABELS
default   Active   8d    istio-injection=enabled,kubernetes.io/metadata.name=default


Якщо ж треба активувати Istio для додатка, що вже працює, варто скористатись istioctl.


4. TEST APPLICATION FOR ISTIO

Щоб бути упевненим, що інсталяція Istio пройшла успішно, потрібно перевірити її в бойових умовах. Для цього задеплоїмо додаток Bookinfo, що розповсюджується разом із архівом Istio, котрий ми раніше скачали. Проте перед цим поговоримо про сам додаток.

Bookinfo показує інформацію про книжку, щось на зразок запису в книжковому онлайн-магазині. На сторінці також відображається опис книги, деякі деталі (ISBN, кількість сторінок і т.п.) та декілька її оглядів користувачами.

Функціонал додатку Bookinfo розбитий на такі складові частини/мікросервіси:

  • productpage. Для наповнення своє сторінки цей мікросервіс робить запити на мікросервіси details та reviews.
  • details. Цей мікросервіс містить інформацію про книгу.
  • reviews. Cервіс reviews володіє інформацією про огляди книги. Також опитує ratings.
  • ratings. Мікросервіс ratings містить інформацію про рейтинг книги, про яку написаний огляд.

Разом із тим, для подальших демонстрацій можливостей Istio (про них поговоримо в наступній статті), мікросервіс reviews буде вилито одразу в 3-х версіях:

  • Версія v1 взагалі не викликає ratings сервіс.
  • Версія v2 викликає сервіс ratings та показує рейтинг у вигляді від 1 до 5 чорних зірок
  • Версія v3 викликає сервіс ratings та показує рейтинг у вигляді від 1 до 5 червоних зірок

Мікросервіси додатку навмисно написані на різних мовах програмування та не мають жодної прив'язки до Istio.

$ cd ~./istio-1.13.2
$ kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml

$ kubectl get pods

NAME                              READY   STATUS    RESTARTS   AGE
details-v1-5498c86cf5-rvks4       2/2     Running   0          9m10s
productpage-v1-65b75f6885-zc6m9   2/2     Running   0          9m9s
ratings-v1-b477cf6cf-p85n6        2/2     Running   0          9m10s
reviews-v1-79d546878f-k2zmn       2/2     Running   0          9m10s
reviews-v2-548c57f459-zps65       2/2     Running   0          9m9s
reviews-v3-6dd79655b9-dtzxd       2/2     Running   0          9m9s


Як бачимо кожен под складається із двох контейнерів, другий серед яких - sidecar із Envoy.

$ kubectl describe pod details-v1-5498c86cf5-rvks4
Name:         details-v1-5498c86cf5-rvks4
Namespace:    default
Priority:     0
Node:         k8s-s-b/192.168.1.49
Start Time:   Sun, 13 Mar 2022 12:36:34 +0000
Labels:       app=details
              pod-template-hash=5498c86cf5
              security.istio.io/tlsMode=istio
              service.istio.io/canonical-name=details
              service.istio.io/canonical-revision=v1
              version=v1
Annotations:  cni.projectcalico.org/containerID: 0af00...bfe71c865103c
              cni.projectcalico.org/podIP: 10.30.0.237/32
              cni.projectcalico.org/podIPs: 10.30.0.237/32
              kubectl.kubernetes.io/default-container: details
              kubectl.kubernetes.io/default-logs-container: details
              prometheus.io/path: /stats/prometheus
              prometheus.io/port: 15020
              prometheus.io/scrape: true
              sidecar.istio.io/status:
                {"initContainers":["istio-init"],"containers":["istio-proxy"],
                  "volumes":["istio-envoy","istio-data","istio-podinfo","istio-token"...
Status:       Running
IP:           10.30.0.237
IPs:
  IP:           10.30.0.237
Controlled By:  ReplicaSet/details-v1-5498c86cf5
Init Containers:
  istio-init:
    Container ID:  docker://f0c618e0442d...b87c630b41d924b08f601be13809
    Image:         docker.io/istio/proxyv2:1.13.2
    Image ID:      docker-pullable://istio/proxyv2@sha256:f...
    Port:          <none>
    Host Port:     <none>
    Args:
      istio-iptables
      -p
      15001
      -z
      15006
      -u
      1337
      -m
      REDIRECT
      -i
      *
      -x
      -b
      *
      -d
      15090,15021,15020
    State:          Terminated
      Reason:       Completed
      Exit Code:    0
      Started:      Sun, 13 Mar 2022 12:36:40 +0000
      Finished:     Sun, 13 Mar 2022 12:36:40 +0000
    Ready:          True
    Restart Count:  0
    Limits:
      cpu:     2
      memory:  1Gi
    Requests:
      cpu:        100m
      memory:     128Mi
    Environment:  <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-vvbbp (ro)
Containers:
  details:
    Container ID:   docker://580737...f3df8618753f0592c2ae
    Image:          docker.io/istio/examples-bookinfo-details-v1:1.16.2
    Image ID:       docker-pullable://istio/examples-bookinfo-details-v1@sha256:18e54f8...
    Port:           9080/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Sun, 13 Mar 2022 12:38:40 +0000
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-vvbbp (ro)
  istio-proxy:
    Container ID:  docker://f...20ad9d9d3be59e79e87de809341dd20
    Image:         docker.io/istio/proxyv2:1.13.2
    Image ID:      docker-pullable://istio/proxyv2@sha256:f...
    Port:          15090/TCP
    Host Port:     0/TCP
    Args:
      proxy
      sidecar
      --domain
      $(POD_NAMESPACE).svc.cluster.local
      --proxyLogLevel=warning
      --proxyComponentLogLevel=misc:error
      --log_output_level=default:info
      --concurrency
      2
    State:          Running
      Started:      Sun, 13 Mar 2022 12:38:40 +0000
    Ready:          True
    Restart Count:  0
    Limits:
      cpu:     2
      memory:  1Gi
    Requests:
      cpu:      100m
      memory:   128Mi
    Readiness:  http-get http://:15021/healthz/ready delay=1s timeout=3s period=2s #success=1 #failure=30
    Environment:
      JWT_POLICY:                    third-party-jwt
      PILOT_CERT_PROVIDER:           istiod
      CA_ADDR:                       istiod.istio-system.svc:15012
      POD_NAME:                      details-v1-5498c86cf5-rvks4 (v1:metadata.name)
      POD_NAMESPACE:                 default (v1:metadata.namespace)
      INSTANCE_IP:                    (v1:status.podIP)
      SERVICE_ACCOUNT:                (v1:spec.serviceAccountName)
      HOST_IP:                        (v1:status.hostIP)
      PROXY_CONFIG:                  {}
                                     
      ISTIO_META_POD_PORTS:          [
                                         {"containerPort":9080,"protocol":"TCP"}
                                     ]
      ISTIO_META_APP_CONTAINERS:     details
      ISTIO_META_CLUSTER_ID:         Kubernetes
      ISTIO_META_INTERCEPTION_MODE:  REDIRECT
      ISTIO_META_WORKLOAD_NAME:      details-v1
      ISTIO_META_OWNER:              kubernetes://apis/apps/v1/namespaces/default/deployments/details-v1
      ISTIO_META_MESH_ID:            cluster.local
      TRUST_DOMAIN:                  cluster.local
    Mounts:
      /etc/istio/pod from istio-podinfo (rw)
      /etc/istio/proxy from istio-envoy (rw)
      /var/lib/istio/data from istio-data (rw)
      /var/run/secrets/istio from istiod-ca-cert (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-vvbbp (ro)
      /var/run/secrets/tokens from istio-token (rw)
Conditions:
  Type              Status
  Initialized       True
  Ready             True
  ContainersReady   True
  PodScheduled      True
Volumes:
  istio-envoy:
    Type:       EmptyDir (a temporary directory that shares a pod's lifetime)
    Medium:     Memory
    SizeLimit:  <unset>
  istio-data:
    Type:       EmptyDir (a temporary directory that shares a pod's lifetime)
    Medium:     
    SizeLimit:  <unset>
  istio-podinfo:
    Type:  DownwardAPI (a volume populated by information about the pod)
    Items:
      metadata.labels -> labels
      metadata.annotations -> annotations
  istio-token:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  43200
  istiod-ca-cert:
    Type:      ConfigMap (a volume populated by a ConfigMap)
    Name:      istio-ca-root-cert
    Optional:  false
  kube-api-access-vvbbp:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       <nil>
    DownwardAPI:             true
QoS Class:                   Burstable
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type     Reason     Age                    From               Message
  ----     ------     ----                   ----               -------
  Normal   Scheduled  11m                    default-scheduler  Successfully assigned default/details-v1-5498c86cf5-rvks4 to k8s-s-b
  Normal   Pulled     11m                    kubelet            Container image "docker.io/istio/proxyv2:1.13.2" already present on machine
  Normal   Created    11m                    kubelet            Created container istio-init
  Normal   Started    11m                    kubelet            Started container istio-init
  Normal   Pulling    11m                    kubelet            Pulling image "docker.io/istio/examples-bookinfo-details-v1:1.16.2"
  Normal   Pulled     9m47s                  kubelet            Successfully pulled image "docker.io/istio/examples-bookinfo-details-v1:1.16.2" in 1m57.602940134s
  Normal   Created    9m45s                  kubelet            Created container details
  Normal   Started    9m45s                  kubelet            Started container details
  Normal   Pulled     9m45s                  kubelet            Container image "docker.io/istio/proxyv2:1.13.2" already present on machine
  Normal   Created    9m45s                  kubelet            Created container istio-proxy
  Normal   Started    9m44s                  kubelet            Started container istio-proxy

Вивід дещо задовгий, але корисний для розуміння. Дещо детальніше загальна схема Bookinfo із активним Istio буде виглядати так:

Перевіримо чи все в порядку і сервіс працює:

$ 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>


Так як у моїй Kubeadm-інсталяції кластера присутній тип сервіса LoadBalancer, можна перевірити роботу сервісу і напряму із браузера. Для цього потрібно вилити додаткові istio-gateway та virtualservice ресурси (Istio реалізує свої нові ресурси Kubernetes через CRD):

$ kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml

Після чого знайдемо адресу балансувальника:

$ kubectl get svc -n istio-system | (read line; echo "$line"; grep istio-ingressgateway)
NAME                   TYPE           CLUSTER-IP      EXTERNAL-IP    PORT(S)                                      AGE
istio-ingressgateway   LoadBalancer   10.99.81.106    192.168.1.70   15021:31339/TCP,80:30773/TCP,443:32045/TCP   5h56m


Та відкриємо сторінку (прив'язка до конктерного домену наразі відсутня):

Інакше можна скористуватись NodePort чи kubectl proxy.


Istioctl також має функціонал валідації сервісів в неймспейсі.

$ istioctl analyze
✔ No validation issues found when analyzing namespace: default.


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


5. ISTIO ADDONS

Як я вже згадував, Istio пропонує інтеграції з Prometheus/Jaeger/Zipkin/Grafana та Kiali. Вони надають дещо більш наочну інформацію про роботу та справність компонентів Istio. Для їх установки (одразу всі інсталювати не обов'язково) скористаємось тим самим завантаженим архівом Istio:

$ cd ~./istio-1.13.2

$ kubectl apply -f samples/addons

serviceaccount/grafana created
configmap/grafana created
service/grafana created
deployment.apps/grafana created
configmap/istio-grafana-dashboards created
configmap/istio-services-grafana-dashboards created
deployment.apps/jaeger created
service/tracing created
service/zipkin created
service/jaeger-collector created
serviceaccount/kiali created
configmap/kiali created
clusterrole.rbac.authorization.k8s.io/kiali-viewer created
clusterrole.rbac.authorization.k8s.io/kiali created
clusterrolebinding.rbac.authorization.k8s.io/kiali created
role.rbac.authorization.k8s.io/kiali-controlplane created
rolebinding.rbac.authorization.k8s.io/kiali-controlplane created
service/kiali created
deployment.apps/kiali created
serviceaccount/prometheus created
configmap/prometheus created
clusterrole.rbac.authorization.k8s.io/prometheus created
clusterrolebinding.rbac.authorization.k8s.io/prometheus created
service/prometheus created
deployment.apps/prometheus created


Всі задеплоєні сервіси типово не мають зовнішнього доступу. Тут вже за бажанням і можливостями: можна його виставити як NodePort чи LoadBalancer, чи просто пеерглядати через kube proxy/istioctl.

$ kubectl get svc -n istio-system
NAME                   TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)                                      AGE
grafana                ClusterIP      10.107.216.227   <none>         3000/TCP                                     3m43s
...
jaeger-collector       ClusterIP      10.102.83.218    <none>         14268/TCP,14250/TCP,9411/TCP                 3m42s
kiali                  ClusterIP      10.106.125.211   <none>         20001/TCP,9090/TCP                           3m42s
prometheus             ClusterIP      10.106.10.224    <none>         9090/TCP                                     3m42s
tracing                ClusterIP      10.107.43.68     <none>         80/TCP,16685/TCP                             3m43s
zipkin                 ClusterIP      10.100.197.10    <none>         9411/TCP


На Kiali зупинимось трішки детальніше, бо це спеціальний компонет Istio для демонстрації зв'язків між мікросервісами в Mesh-мережі. Тому виставимо його як LoadBalancer сервіс:

$ kubectl --namespace istio-system patch svc kiali -p '{"spec": {"type": "LoadBalancer"}}'
service/kiali patched

Використовувати patch на продакшен-системах дуже не раджу - це погана практика.

$ kubectl get svc -n istio-system
NAME    TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)                          AGE
...
kiali   LoadBalancer   10.106.125.211   192.168.1.71   20001:31631/TCP,9090:31944/TCP   41m

Створимо невелике навантаження на Bookinfo сервіс задля перегляду статистики в Kiali:

$ for i in $(seq 1 100); do curl -s -o /dev/null "http://192.168.1.70/productpage"; done

Kiali демонструє всю "магію" Service Mesh. Мережева схема роботи мікросервісів "Bookinfo" виглядає так:



Статистика по кожному мікросервісу:



Трейси мікросервісу reviews:



Окрім цього прямо через Kiali можна управляти багатьма іншими параметрами вже вилитих сервісів. Але про це вже далі, у наступній частині.

Посилання:
https://istio.io/latest/docs/setup/getting-started/
https://istio.io/latest/docs/ops/deployment/architecture/

https://istio.io/latest/docs/examples/bookinfo/
https://youtu.be/voAyroDb6xk
https://platform9.com/blog/kubernetes-service-mesh-a-comparison-of-istio-linkerd-and-consul/
https://thenewstack.io/history-service-mesh/
https://istio.tetratelabs.io/blog/istio-traffic-management-walkthrough-p1/

Немає коментарів:

Дописати коментар