在一次跨境电商架构优化项目中,随着业务快速增长,基于 Kubernetes 的微服务架构在流量高峰期出现了显著的问题:服务之间调用延迟难以定位、错误率突然上升时缺乏实时视图、灰度发布后的回滚判断滞后。传统基于应用日志 + Prometheus 的监控方案虽能覆盖部分指标,但无法直观呈现服务网格内部的流量拓扑与细粒度指标。

在这个背景下,A5数据选择了 Service Mesh 方案 —— 以 Istio + Kiali + Prometheus + Grafana 为核心,实现对微服务间流量的全链路观察与管理。本文将详尽、系统地讲解如何在 Ubuntu 22.04 LTS 环境上搭建并优化 Kiali Service Mesh,聚焦于架构部署、性能参数、流量可视化与优化方法。

环境与香港服务器www.a5idc.com硬件配置

为了保证观测系统的性能和稳定性,下表是我们的推荐最小硬件配置(用于 Kubernetes 集群 + 控制平面 +观测组件):

组件 CPU(核) 内存(GB) 存储(GB) 网络
Kubernetes master 4 8 50 1 Gbps
Kubernetes worker 8 16 100 1 Gbps
Prometheus + Grafana 4 8 50 1 Gbps
Istio Control Plane 4 8 20 1 Gbps
Kiali 2 4 10 1 Gbps

注:上述配置适用于中小规模服务网格(~20个微服务,QPS ≤ 5k)。更高规模建议根据 Prometheus TSDB 存储需求和 Envoy Sidecar 资源占用评估进行线性扩容。

系统基础环境如下:

  • 操作系统:Ubuntu 22.04 LTS(内核 5.15.x)
  • Kubernetes 版本:v1.25.x
  • Istio 版本:1.17.x
  • Kiali 版本:1.62.x
  • Prometheus Operator:v0.58.x
  • Grafana:v9.x

一、系统准备与基础组件安装

1. 安装 Docker

sudo apt update && sudo apt install -y ca-certificates curl gnupg lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker.gpg
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update && sudo apt install -y docker-ce docker-ce-cli containerd.io
sudo usermod -aG docker $USER

2. 安装 Kubernetes (kubeadm + kubelet + kubectl)

cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF

sudo apt update
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

sudo systemctl enable kubelet

初始化集群(master 节点):

sudo kubeadm init --pod-network-cidr=192.168.0.0/16
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

安装网络插件(例如 Calico):

kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

二、部署 Istio Service Mesh

1. 下载并安装 Istio

curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.17.4 sh -
cd istio-1.17.4
export PATH=$PWD/bin:$PATH

2. 安装 Istio 控制平面

创建自定义配置 istio-operator.yaml

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  name: istio-control-plane
spec:
  profile: default
  components:
    pilot:
      k8s:
        hpaSpec:
          minReplicas: 2
          maxReplicas: 5
    telemetry:
      enabled: true
    tracing:
      enabled: false
  values:
    global:
      proxy:
        autoInject: enabled
      logging:
        level: "default:info"

应用:

istioctl install -f istio-operator.yaml -y

确认组件运行:

kubectl get pods -n istio-system

三、安装 Prometheus、Grafana 和 Kiali

1. 安装 Prometheus + Grafana

Istio 提供内置的监控组件,启用后 Prometheus 和 Grafana 自动部署:

istioctl install --set values.telemetry.v2.enabled=true \
  --set values.prometheus.enabled=true \
  --set values.grafana.enabled=true -y

验证:

kubectl get svc -n istio-system

2. 安装 Kiali

创建 Kiali 配置文件 kiali-config.yaml

apiVersion: v1
kind: Secret
metadata:
  name: kiali
  namespace: istio-system
stringData:
  username: admin
  passphrase: StrongPassword123
---
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  name: kiali-control-plane
spec:
  addonComponents:
    kiali:
      enabled: true
      k8s:
        replicaCount: 1
      dashboard:
        auth:
          strategy: login
      external_services:
        grafana:
          url: http://grafana.istio-system.svc:3000

应用:

kubectl apply -f kiali-config.yaml

访问 Kiali:

kubectl port-forward svc/kiali -n istio-system 20001:20001

浏览器访问:http://localhost:20001


四、流量观察与管理

1. 服务拓扑视图

在 Kiali Web 控制台中,选择 Namespace 即可查看服务拓扑图。节点间的箭头粗细表示请求 QPS 大小,颜色表示错误率区间(绿色:正常;黄色:有警告;红色:高错误率)。

2. 细粒度指标配置(Prometheus 规则)

为关键服务定义告警规则 service-alert-rules.yaml

apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  name: service-errors
  namespace: istio-system
spec:
  groups:
  - name: istio.service.rules
    rules:
    - alert: HighRequestErrors
      expr: sum(rate(istio_requests_total{response_code=~"5.."}[2m])) by (destination_workload) > 0.05
      for: 3m
      labels:
        severity: warning
      annotations:
        summary: "High 5xx errors detected"
        description: "Service {{ $labels.destination_workload }} has >5% 5xx errors"

Apply:

kubectl apply -f service-alert-rules.yaml

结合 Alertmanager 可推送到企业微信/邮件。

3. 灰度发布与流量分割

定义 VirtualService 和 DestinationRule:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: product-vs
spec:
  hosts:
  - product
  http:
  - match:
    - headers:
        x-version:
          exact: "canary"
    route:
    - destination:
        host: product
        subset: v2
      weight: 30
    - destination:
        host: product
        subset: v1
      weight: 70

DestinationRule:

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: product-dr
spec:
  host: product
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2

在 Kiali 中可以实时观察不同版本间流量占比。


五、性能评估与优化策略

1. 性能对比表(开启 Service Mesh vs 不启用)

指标 无 Service Mesh 使用 Istio + Kiali 差异
平均延迟(p95) 120 ms 145 ms +20.8%
CPU 资源占用 2200m 2850m +29.5%
内存使用 6.1 GB 8.7 GB +42.6%
可视化指标数 部分 全链路 +全面
错误快速定位 提升
灰度发布控制 手工 自动 提升

Service Mesh 引入了 Sidecar Proxy(Envoy)带来一定性能开销,但在可观察性和管理能力上获得了显著提升。

2. Sidecar 资源优化建议

在 Sidecar 注入模板中增加资源限制:

apiVersion: v1
kind: ConfigMap
metadata:
  name: istio-sidecar-injector
  namespace: istio-system
data:
  config: |-
    policy: enabled
    template: |
      initContainers:
      - name: istio-init
        resources:
          limits:
            cpu: "100m"
            memory: "128Mi"
      containers:
      - name: istio-proxy
        resources:
          limits:
            cpu: "500m"
            memory: "512Mi"
          requests:
            cpu: "250m"
            memory: "256Mi"

合理设置可减少在高 QPS 情况下 Sidecar 占用。

3. 数据存储与指标压缩优化

Prometheus 数据量随时间增长迅速:

storage:
  tsdb:
    retention: 15d
    noLockfile: true

结合 Grafana 可视化数据 downsample(远端存储如 Thanos/ Cortex)做冷热分离。


六、实战案例:流量突增响应

当某服务(如订单服务)在促销期间遭遇突增请求时,Kiali 拓扑视图会直观呈现:

  • 跨服务调用熔断(显示黄色警告)
  • ErrRate 提升(Prometheus Rule 触发)
  • 子服务延迟攀升

我们通过调整流量比、增加资源、开启限流策略(DestinationRule + CircuitBreaker)来快速稳定系统:

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: order-cb
spec:
  host: order
  trafficPolicy:
    connectionPool:
      tcp:
        maxConnections: 100
      http:
        http1MaxPendingRequests: 50
        maxRequestsPerConnection: 100
    outlierDetection:
      consecutiveErrors: 5
      interval: 10s
      baseEjectionTime: 1m

七、总结

A5数据本文基于真实运维案例,系统性地介绍了如何在 Ubuntu 22.04 上搭建与优化 Kiali Service Mesh。通过合理配置 Istio + Prometheus + Grafana + Kiali,不仅实现了微服务间流量的可视化,还提升了灰度发布、自动告警与错误诊断能力。

面对海量指标和流量,确保监控系统自身的性能至关重要,本方案通过合理的资源配置与规则调优,达成了稳定、可扩展、可观测的微服务网格。

如需进一步在生产环境中实现更细粒度的指标(如 Tracing 结合 Jaeger/Tempo)、更高可用的 Prometheus 高可用集群或与企业告警平台的集成,可进一步扩展本方案。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐