适用于 Ambient 多网络的 Kiali 仪表盘

按照本指南在多网络环境部署中部署多集群感知型 Kiali,以查看集群之间的流量流动情况。

在继续操作之前,请务必完成开始之前多集群安装指南验证您的部署下的步骤。

本指南首先将部署联邦 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,我们将通过 Ingress Gateway 暴露 Prometheus 实例。

在每个集群中部署 Prometheus

$ kubectl --context="${CTX_CLUSTER1}" apply -f https://raw.githubusercontent.com/istio/istio/release-1.29/samples/addons/prometheus.yaml
$ kubectl --context="${CTX_CLUSTER2}" apply -f https://raw.githubusercontent.com/istio/istio/release-1.29/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
...

然后我们可以使用 curl 查询 Prometheus,看看是否所有集群都已上报指标:

$ 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 请求到达了两个集群的后端,那么对于 ztunnel 报告的 istio_tcp_received_bytes_total 指标,您应该能够在输出中看到来自两个集群的值:

{
  "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

准备远程集群

我们只会在一个集群 cluster1 中正确部署 Kiali, 但我们仍然需要准备 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 服务器了。 我们需要使用 Prometheus 端点的地址和访问远程集群的密钥来配置 Kiali。 和之前一样,我们将从部署 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

远程 Secret 准备就绪后,我们现在可以部署 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 控制面板,导航至流量图,然后从 “Select Namespaces” 下拉菜单中选择 “sample” 命名空间。您应该可以看到集群之间的流量流动情况:

Kiali trafic graph dashboard
Kiali trafic graph dashboard

**恭喜!**您已成功安装 Kiali,用于多集群环境部署。

清理 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/release-1.29/samples/addons/prometheus.yaml
$ kubectl --context="${CTX_CLUSTER2}" delete -f https://raw.githubusercontent.com/istio/istio/release-1.29/samples/addons/prometheus.yaml
这些信息有用吗?
您是否有更多建议和改进意见?

感谢您的反馈!