Kiali

Vagrant

Для работы будем использовать следующий Vagrantfile:

Vagrant.configure("2") do |config|
  config.vm.define "otel" do |c|
    c.vm.provider "virtualbox" do |v|
      v.cpus = 2
      v.memory = 4096
    end
    c.vm.box = "ubuntu/lunar64"
    c.vm.hostname = "otel"
    c.vm.network "forwarded_port", guest: 8080, host: 8888
    c.vm.provision "shell", inline: <<-SHELL
      apt-get update -q
      apt-get install -yq docker.io docker-compose-v2
      usermod -a -G docker vagrant
      curl -LO https://dl.k8s.io/release/v1.30.0/bin/linux/amd64/kubectl
      curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.22.0/kind-linux-amd64
      curl -L https://github.com/istio/istio/releases/download/1.21.2/istioctl-1.21.2-linux-amd64.tar.gz \
        | tar xzf - -C /usr/local/bin/
      install -m 755 kubectl kind /usr/local/bin/
      rm kubectl kind
    SHELL
  end
end

Данная конфигурация установит на виртуальную машину docker, kubectl и kind, с помощью которых будет производиться развертывание и управление кластером kubernetes, а также утилита istioctl для управления istio.

Install

Создадим новый кластер с помощью утилиты kind передав конфигурацию, в которой указаны дополнительные порты для доступа снаружи:

cat <<EOF | kind create cluster --config=-
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  kubeadmConfigPatches:
  - |
    kind: InitConfiguration
    nodeRegistration:
      kubeletExtraArgs:
        node-labels: "ingress-ready=true"
  extraPortMappings:
  - containerPort: 8080
    hostPort: 8080
    protocol: TCP
  - containerPort: 8443
    hostPort: 8443
    protocol: TCP
EOF

И убедимся что он функционирует:

Creating cluster "kind" ...
 ✓ Ensuring node image (kindest/node:v1.29.2) 🖼
 ✓ Preparing nodes 📦
 ✓ Writing configuration 📜
 ✓ Starting control-plane 🕹️
 ✓ Installing CNI 🔌
 ✓ Installing StorageClass 💾
Set kubectl context to "kind-kind"
You can now use your cluster with:

kubectl cluster-info --context kind-kind

Not sure what to do next? 😅  Check out https://kind.sigs.k8s.io/docs/user/quick-start/

$ kubectl cluster-info
Kubernetes control plane is running at https://127.0.0.1:34283
CoreDNS is running at https://127.0.0.1:34283/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

Установим istio с помощью istioctl, добавим метку на неймспейс, чтобы istio мог инжектить сайдкары, а также внесем изменения в конфигурацию istio-ingressgateway для доступа снаружи:

$ istioctl install --set profile=demo -y
✔ Istio core installed
✔ Istiod installed
✔ Egress gateways installed
✔ Ingress gateways installed
✔ Installation complete
Made this installation the default for injection and validation.
$ kubectl label namespace default istio-injection=enabled
namespace/default labeled
$ kubectl patch deploy -n istio-system istio-ingressgateway -p '{"spec":{"template":{"spec":{"dnsPolicy":"ClusterFirstWithHostNet","hostNetwork":true}}}}'
deployment.apps/istio-ingressgateway patched

Deploy Kiali

Установим тестовое приложение bookinfo, а также prometheus и kiali:

$ kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.21/samples/bookinfo/platform/kube/bookinfo.yaml
service/details created
serviceaccount/bookinfo-details created
deployment.apps/details-v1 created
service/ratings created
serviceaccount/bookinfo-ratings created
deployment.apps/ratings-v1 created
service/reviews created
serviceaccount/bookinfo-reviews created
deployment.apps/reviews-v1 created
deployment.apps/reviews-v2 created
deployment.apps/reviews-v3 created
service/productpage created
serviceaccount/bookinfo-productpage created
deployment.apps/productpage-v1 created

$ kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.21/samples/bookinfo/networking/bookinfo-gateway.yaml
gateway.networking.istio.io/bookinfo-gateway created
virtualservice.networking.istio.io/bookinfo created

$ kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.22/samples/addons/prometheus.yaml
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

$ kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.22/samples/addons/kiali.yaml
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

Для доступа снаружи добавим VirtualService:

kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: kiali
spec:
  gateways:
  - bookinfo-gateway
  hosts:
  - kiali.127.0.0.1.nip.io
  http:
  - route:
    - destination:
        host: kiali.istio-system.svc.cluster.local
        port:
          number: 20001
EOF

После чего будет доступен интерфейс kiali по адресу kiali.127.0.0.1.nip.io:8888.

А также демонстрационное приложение bookinfo, которое можно открыть по адресу localhost:8888/productpage.

Graph

Сделаем несколько запросов в тестовое приложение, чтобы появились метрики проходящего трафика. После прохождения трафика на странице Traffic Graph можно увидеть схему взаимодействий между сервисами:

Как видно, трафик заходит через istio-ingressgateway и попадает в сервис productpage, после чего с данного сервиса отправляются запросы в сервисы details и reviews, а с сервиса reviews уходит в ratings. Причем сервис ratings запрашивается только из сервиса reviews с версиями v2 и v3.

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

Здесь можно наблюдать количество запросов в секунду, а также http коды ответов.

В интерфейсе kiali можно не только наблюдать за трафиком в istio, но и также производить некоторые изменения.

Traffic Shifting

С помощью kiali можно управлять процентным соотношением трафика между разными группами сервиса, для этого перейдем в конфигурацию сервиса reviews:

Здесь в Actions выберем Traffic Shifting:

И в появившемся меню выставим соотношение по версиям в процентах так, чтобы на версию v1 трафик не поступал:

Нажмем кнопку Preview в которой отобразятся создаваемые ресурсы istio и после кнопку Create

Теперь при попытках открытия страницы productpage будет отображаться блок Book Reviews только версий v2 и v3:

После того, как убедились, что версия v1 не появляется, можем удалить в интерфейсе kiali данную конфигурацию в меню Actions - Delete Traffic Routing, после чего снова сможем попадать на v1:

Fault Injection

Для тестирования работы микросервисной системы istio позволяет добавлять ошибки во взаимодействие между сервисами. Попробуем добавить ошибку от сервиса reviews, для этого на странице сервиса выберем Actions - Fault Injection, после чего в появившемся меню выберем тип ошибки - ответ 503 и процент возникновения - 50:

После чего по кнопке Preview можем наблюдать создаваемые ресурсы istio и по кнопке Create применим их. Теперь открывая страницу productpage иногда блок Product Reviews не будет отображаться:

Таким образом можно убедиться насколько система устойчива к сбоям отдельных сервисов.