Дашборд Kiali для ambient багатомережевого середовища

Дотримуйтеся цього посібника, щоб розгорнути Kiali з підтримкою мультикластерів у багатомережевому ambient розгортанні та переглядати, як трафік протікає між кластерами.

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

У цьому посібнику ми почнемо з розгортання федеративного екземпляра Prometheus для агрегування метрик з усіх кластерів разом. Потім ми перейдемо до розгортання налаштованого екземпляра Kiali, який підключається до всіх кластерів і надає єдиний погляд на трафік мережі.

Підготовка до розгортання Kiali

Ми встановимо налаштовані Prometheus і Kiali в окремий простір імен, тож почнемо зі створення простору імен в обох кластерах:

$ kubectl --context="${CTX_CLUSTER1}" create namespace kiali
$ kubectl --context="${CTX_CLUSTER2}" create namespace kiali

Ми також використаємо helm для розгортання Kiali, тож додамо відповідні репозиторії Helm:

$ helm repo add kiali https://kiali.org/helm-charts

Федеративний Prometheus

Istio надає базовий приклад установки для швидкого запуску Prometheus в однокластерних розгортаннях: ми використаємо його для встановлення Prometheus у кожному кластері. Потім ми розгорнемо ще один екземпляр Prometheus, який буде збирати метрики з Prometheus у кожному кластері та агрегувати їх разом.

Щоб мати можливість збирати метрики з Prometheus у віддаленому кластері, ми відкриємо екземпляр Prometheus через вхідний шлюз.

Розгортання Prometheus у кожному кластері

$ kubectl --context="${CTX_CLUSTER1}" apply -f https://raw.githubusercontent.com/istio/istio/master/samples/addons/prometheus.yaml
$ kubectl --context="${CTX_CLUSTER2}" apply -f https://raw.githubusercontent.com/istio/istio/master/samples/addons/prometheus.yaml

Наведені вище команди встановлять Prometheus, який збирає локальні метрики кластера з waypoint і ztunnel.

Відкриття Prometheus

Наступний крок: відкрити екземпляри Prometheus зовні, щоб їх можна було збирати:

$ cat <<EOF | kubectl --context="${CTX_CLUSTER1}" apply -f -
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: prometheus-gateway
  namespace: istio-system
spec:
  gatewayClassName: istio
  listeners:
  - name: http
    port: 9090
    protocol: HTTP
    allowedRoutes:
      namespaces:
        from: Same
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: prometheus
  namespace: istio-system
spec:
  parentRefs:
  - name: prometheus-gateway
    port: 9090
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /
    backendRefs:
    - name: prometheus
      port: 9090
EOF

Ми зробимо те саме і в другому кластері:

$ cat <<EOF | kubectl --context="${CTX_CLUSTER2}" apply -f -
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: prometheus-gateway
  namespace: istio-system
spec:
  gatewayClassName: istio
  listeners:
  - name: http
    port: 9090
    protocol: HTTP
    allowedRoutes:
      namespaces:
        from: Same
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: prometheus
  namespace: istio-system
spec:
  parentRefs:
  - name: prometheus-gateway
    port: 9090
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /
    backendRefs:
    - name: prometheus
      port: 9090
EOF

Агрегування метрик

Коли локальні для кластера екземпляри Prometheus запущені, ми можемо налаштувати ще один екземпляр Prometheus, який буде збирати метрики з них, щоб отримувати метрики з обох кластерів в одному місці. Почнемо зі створення конфігурації для нового екземпляра Prometheus, яка вкаже йому, з яких локальних для кластера екземплярів Prometheus збирати метрики:

$ TARGET1="$(kubectl --context="${CTX_CLUSTER1}" get gtw prometheus-gateway -n istio-system -o jsonpath='{.status.addresses[0].value}')"
$ TARGET2="$(kubectl --context="${CTX_CLUSTER2}" get gtw prometheus-gateway -n istio-system -o jsonpath='{.status.addresses[0].value}')"
$ cat <<EOF > prometheus.yml
global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'federate-1'
    honor_labels: true
    metrics_path: '/federate'
    params:
      'match[]':
        - '{job="kubernetes-pods"}'
    static_configs:
      - targets:
        - '${TARGET1}:9090'
        labels:
          cluster: 'cluster1'
  - job_name: 'federate-2'
    honor_labels: true
    metrics_path: '/federate'
    params:
      'match[]':
        - '{job="kubernetes-pods"}'
    static_configs:
      - targets:
        - '${TARGET2}:9090'
        labels:
          cluster: 'cluster2'
EOF
$ kubectl --context="${CTX_CLUSTER1}" create configmap prometheus-config -n kiali --from-file prometheus.yml

Тепер ми можемо використати цю конфігурацію для розгортання нового екземпляра Prometheus:

$ cat <<EOF | kubectl --context="${CTX_CLUSTER1}" apply -f - -n kiali
apiVersion: apps/v1
kind: Deployment
metadata:
  name: prometheus
spec:
  replicas: 1
  selector:
    matchLabels:
      app: prometheus
  template:
    metadata:
      labels:
        app: prometheus
    spec:
      containers:
        - name: prometheus
          image: prom/prometheus
          ports:
            - containerPort: 9090
          volumeMounts:
            - name: config-volume
              mountPath: /etc/prometheus
      volumes:
        - name: config-volume
          configMap:
            name: prometheus-config
            defaultMode: 420
---
apiVersion: v1
kind: Service
metadata:
  name: prometheus
  labels:
    app: prometheus
    service: prometheus
spec:
  ports:
  - port: 9090
    name: http
  selector:
    app: prometheus
EOF

Після розгортання новий екземпляр Prometheus почне збирати метрики з обох кластерів.

Перевірка федеративного Prometheus

Щоб перевірити, ми можемо згенерувати трохи трафіку, запустивши curl кілька разів для досягнення бекендів в обох кластерах:

$ kubectl exec --context="${CTX_CLUSTER1}" -n sample -c curl \
    "$(kubectl get pod --context="${CTX_CLUSTER1}" -n sample -l \
    app=curl -o jsonpath='{.items[0].metadata.name}')" \
    -- curl -sS helloworld.sample:5000/hello
Hello version: v2, instance: helloworld-v2-758dd55874-6x4t8
Hello version: v1, instance: helloworld-v1-86f77cd7bd-cpxhv
...

Потім ми можемо надіслати запит до Prometheus за допомогою curl, щоб побачити, чи маємо ми метрики з усіх кластерів:

$ kubectl exec --context="${CTX_CLUSTER1}" -n sample -c curl \
    "$(kubectl get pods ---context="${CTX_CLUSTER1}" -n sample -l \
    app=curl -o jsonpath='{.items[0].metadata.name}')" \
    -- curl -s prometheus.kiali:9090/api/v1/query?query=istio_tcp_received_bytes_total | jq '.'

Якщо запит curl досяг бекендів в обох кластерах, для метрики istio_tcp_received_bytes_total, яку повідомляє ztunnel, ви маєте побачити значення з обох кластерів у виводі:

{
  "status": "success",
  "data": {
    "resultType": "vector",
    "result": [
      {
        "metric": {
          "__name__": "istio_tcp_received_bytes_total",
          ...
          "app": "ztunnel",
          ...
          "cluster": "cluster2",
          ...
          "destination_canonical_revision": "v2",
          ...
          "destination_canonical_service": "helloworld",
          ...
        },
        "value": [
          1770660628.007,
          "5040"
        ]
      },
      ...
      {
        "metric": {
          "__name__": "istio_tcp_received_bytes_total",
          ...
          "app": "ztunnel",
          ...
          "cluster": "cluster1",
          ...
          "destination_canonical_revision": "v1",
          ...
          "destination_canonical_service": "helloworld",
          ...
        },
        "value": [
          1770660628.007,
          "4704"
        ]
      },
      ...
    ]
  }
}

Розгортання мультикластерного Kiali

Підготовка віддаленого кластера

Ми розгорнемо Kiali належним чином лише в одному кластері, cluster1, однак нам все одно потрібно підготувати cluster2, щоб Kiali міг отримувати доступ до ресурсів там. Для цього ми почнемо з розгортання Kiali Operator:

$ helm --kube-context="${CTX_CLUSTER2}" install --namespace kiali kiali-operator kiali/kiali-operator --wait

Після розгортання Kiali Operator ми можемо підготувати всі необхідні облікові записи служб, привʼязки ролей і токени. Kiali Operator створить обліковий запис служби та привʼязки ролей, але токен для облікового запису служби нам доведеться створити вручну:

$ cat <<EOF | kubectl --context="${CTX_CLUSTER2}" apply -f - -n kiali
apiVersion: kiali.io/v1alpha1
kind: Kiali
metadata:
  name: kiali
spec:
  auth:
    strategy: "anonymous"
  deployment:
    remote_cluster_resources_only: true
EOF
$ kubectl --context="${CTX_CLUSTER2}" wait --timeout=5m --for=condition=Successful kiali kiali -n kiali
$ cat <<EOF | kubectl --context="${CTX_CLUSTER2}" apply -f - -n kiali
apiVersion: v1
kind: Secret
metadata:
  name: kiali
  namespace: kiali
  annotations:
    kubernetes.io/service-account.name: kiali-service-account
type: kubernetes.io/service-account-token
EOF

Розгортання Kiali

Коли віддалений кластер готовий, ми можемо розгорнути сервер Kiali. Нам потрібно буде налаштувати Kiali з адресою кінцевої точки Prometheus і секретом для доступу до віддаленого кластера. Як і раніше, ми почнемо з розгортання Kiali Operator:

$ helm --kube-context="${CTX_CLUSTER1}" install --namespace kiali kiali-operator kiali/kiali-operator --wait

Проєкт Kiali надає скрипт, який ми можемо використати для створення секрету, необхідного для доступу до ресурсів віддаленого кластера:

$ curl -L -o kiali-prepare-remote-cluster.sh https://raw.githubusercontent.com/kiali/kiali/master/hack/istio/multicluster/kiali-prepare-remote-cluster.sh
$ chmod +x kiali-prepare-remote-cluster.sh
$ ./kiali-prepare-remote-cluster.sh \
    --kiali-cluster-context "${CTX_CLUSTER1}" \
    --remote-cluster-context "${CTX_CLUSTER2}" \
    --view-only false \
    --process-kiali-secret true \
    --process-remote-resources false \
    --kiali-cluster-namespace kiali \
    --remote-cluster-namespace kiali \
    --kiali-resource-name kiali \
    --remote-cluster-name cluster2

Коли віддалений секрет готовий, ми можемо розгорнути сервер Kiali:

$ cat <<EOF | kubectl --context="${CTX_CLUSTER1}" apply -f - -n kiali
apiVersion: kiali.io/v1alpha1
kind: Kiali
metadata:
  name: kiali
spec:
  auth:
    strategy: "anonymous"
  external_services:
    prometheus:
      url: http://prometheus.kiali:9090
    grafana:
      enabled: false
  server:
    web_root: "/kiali"
EOF
$ kubectl --context="${CTX_CLUSTER1}" wait --timeout=5m --for=condition=Successful kiali kiali -n kiali

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

$ kubectl --context="${CTX_CLUSTER1}" port-forward svc/kiali 20001:20001 -n kiali

Відкрийте дашборд Kiali у браузері, перейдіть до графа трафіку та виберіть простір імен “sample” зі спадного списку “Select Namespaces”. Ви маєте побачити, як трафік протікає між кластерами:

Дашборд графа трафіку Kiali
Дашборд графа трафіку Kiali

Вітаємо! Ви успішно встановили Kiali для мультикластерного ambient розгортання.

Очищення Kiali та Prometheus

Щоб видалити Kiali, почніть з видалення користувацького ресурсу Kiali:

$ kubectl --context="${CTX_CLUSTER1}" delete kiali kiali -n kiali
$ kubectl --context="${CTX_CLUSTER2}" delete kiali kiali -n kiali

Kiali Operator зупинить сервер Kiali після видалення користувацького ресурсу. Якщо ви хочете додатково видалити Kiali Operator, ви можете зробити це також:

$ helm --kube-context="${CTX_CLUSTER1}" uninstall --namespace kiali kiali-operator
$ helm --kube-context="${CTX_CLUSTER2}" uninstall --namespace kiali kiali-operator

Нарешті, ви можете видалити визначення користувацьких ресурсів:

$ kubectl --context="${CTX_CLUSTER1}" delete crd kialis.kiali.io

Якщо вам не потрібні локальні для кластера екземпляри Prometheus, ви можете видалити їх також:

$ kubectl --context="${CTX_CLUSTER1}" delete -f https://raw.githubusercontent.com/istio/istio/master/samples/addons/prometheus.yaml
$ kubectl --context="${CTX_CLUSTER2}" delete -f https://raw.githubusercontent.com/istio/istio/master/samples/addons/prometheus.yaml
Чи була ця інформація корисною?
Чи є у вас пропозиції щодо покращення?

Дякуємо за ваш відгук!