开源服务网格该如何搭建?

wen 开源项目 66

本文目录导读:

开源服务网格该如何搭建?

  1. 核心组件概览
  2. 前提准备
  3. 步骤一:下载并安装 Istio CLI
  4. 步骤二:安装 Istio 控制平面
  5. 步骤三:启用 Sidecar 自动注入
  6. 步骤四:部署一个示例应用(验证功能)
  7. 步骤五:配置核心流量管理功能
  8. 步骤六:可观测性(监控、日志、链路追踪)
  9. 步骤七:安全配置(mTLS)
  10. 生产环境关键注意事项
  11. 常见故障排查

搭建开源服务网格,最主流的选择是 Istio(搭配 Envoy 数据平面),以下是基于 Istio 的完整搭建指南,涵盖了从环境准备到核心功能的配置。

核心组件概览

  1. 数据平面:通常由 Envoy 代理组成,以 Sidecar 模式注入到每个 Pod 中,负责拦截和管理进出服务的所有流量。
  2. 控制平面Istiod,负责配置管理、证书签发和策略下发。

前提准备

  • Kubernetes 集群:推荐版本 v1.27 – v1.30,至少 4 核 CPU、8GB 内存(生产环境要求更高)。
  • kubectl:与集群版本兼容。
  • Helm(可选,但推荐用于生产环境)。

下载并安装 Istio CLI

# 下载最新版本(推荐 v1.22 或更高)
curl -L https://istio.io/downloadIstio | sh -
# 将 istioctl 添加到 PATH
cd istio-1.22.*
export PATH=$PWD/bin:$PATH
# 验证安装
istioctl version

安装 Istio 控制平面

Istio 提供了多种配置文件(Profile),包括 defaultdemominimal 等。

  • demo 配置:适合测试和体验,功能齐全,但资源占用较高。

  • default 配置:适合生产环境的基础配置。

  • minimal 配置:仅安装 Istiod,适合自建组件。

  • 快速安装(使用 istioctl)

    # 安装 demo 配置(启用所有功能,包含 Kiali、Prometheus、Grafana 等插件)
    istioctl install --set profile=demo -y
    # 安装 default 配置(轻量,适合生产)
    # istioctl install --set profile=default -y
  • 使用 Helm(生产最佳实践)

    # 添加 Helm 仓库
    helm repo add istio https://istio-release.storage.googleapis.com/charts
    helm repo update
    # 创建命名空间
    kubectl create namespace istio-system
    # 安装 base(CRD 资源)
    helm install istio-base istio/base -n istio-system
    # 安装 istiod(控制平面)
    helm install istiod istio/istiod -n istio-system --wait
    # 可选:安装 Ingress/Egress Gateway
    helm install istio-ingress istio/gateway -n istio-system --wait
  • 验证安装

    kubectl get pods -n istio-system
    # 应该看到 istiod-xxx-xxx 处于 Running 状态

启用 Sidecar 自动注入

Service Mesh 的关键在于让每个 Pod 自动携带一个 Envoy 代理,你需要为目标命名空间开启注入标签。

# 1. 为 default 命名空间打上注入标签
kubectl label namespace default istio-injection=enabled
# 2. 验证标签是否生效
kubectl get namespace -L istio-injection
# 3. (可选)如果你希望为不同命名空间使用不同配置,可以为指定 deployment 手动注入:
# kubectl annotate deployment <deployment-name> sidecar.istio.io/inject="true"

部署一个示例应用(验证功能)

推荐部署 Istio 自带的 Bookinfo 示例,它是一个包含多个微服务的应用。

# 1. 部署应用(会自动注入 Sidecar)
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.22/samples/bookinfo/platform/kube/bookinfo.yaml
# 2. 部署 Ingress Gateway,使外部流量可以访问
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.22/samples/bookinfo/networking/bookinfo-gateway.yaml
# 3. 查看所有 Pod 是否都包含 2 个容器(业务容器 + istio-proxy)
kubectl get pods
# 输出示例:
# NAME                              READY   STATUS    RESTARTS   AGE
# details-v1-xxx                    2/2     Running   0          5m
# productpage-v1-xxx                2/2     Running   0          5m
# ratings-v1-xxx                    2/2     Running   0          5m
# reviews-v1-xxx                    2/2     Running   0          5m
  • 重点检查:每个 Pod 的 READY 列必须为 2/2(业务容器 + Sidecar 代理),如果只有 1/1,说明注入失败,需要检查命名空间标签或 Pod 标签。

配置核心流量管理功能

服务网格的强大之处在于通过配置(而非修改代码)来控制流量。

  • 路由规则(VirtualService & DestinationRule)

    # 示例:将所有流量路由到 reviews 服务的 v2 版本
    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: reviews
    spec:
      hosts:
      - reviews
      http:
      - route:
        - destination:
            host: reviews
            subset: v2
    ---
    apiVersion: networking.istio.io/v1beta1
    kind: DestinationRule
    metadata:
      name: reviews
    spec:
      host: reviews
      subsets:
      - name: v1
        labels:
          version: v1
      - name: v2
        labels:
          version: v2
  • 故障注入(测试韧性)

    # 模拟针对 reviews 服务 50% 的请求延迟 5 秒
    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: reviews
    spec:
      hosts:
      - reviews
      http:
      - fault:
          delay:
            percentage:
              value: 50
            fixedDelay: 5s
        route:
        - destination:
            host: reviews
            subset: v2
  • 超时与重试

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: ratings
    spec:
      hosts:
      - ratings
      http:
      - timeout: 10s
        retries:
          attempts: 3
          perTryTimeout: 2s
        route:
        - destination:
            host: ratings

可观测性(监控、日志、链路追踪)

Istio 原生集成了 telemetry 功能,可以输出指标、日志和链路。

  • 安装 Kiali(可视化服务拓扑):许多安装方式已包含 Kiali,如果没有则:

    kubectl apply -f samples/addons/kiali.yaml
  • 暴露 Web UI

    # 先确保 kiali 部署完成
    kubectl rollout status deployment kiali -n istio-system
    # 端口转发以访问 web UI
    istioctl dashboard kiali &
  • 访问 Prometheus / Grafana

    istioctl dashboard prometheus
    istioctl dashboard grafana
  • 开启 Access Log(访问日志)

    apiVersion: telemetry.istio.io/v1
    kind: Telemetry
    metadata:
      name: mesh-default
      namespace: istio-system
    spec:
      accessLogging:
      - providers:
        - name: envoy

安全配置(mTLS)

默认情况下,Istio 会启用 宽容模式(Permissive),允许非网格流量,建议改为 严格模式 以强制所有服务间加密。

apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: default
  namespace: istio-system
spec:
  mtls:
    mode: STRICT

生产环境关键注意事项

  1. 资源规划:每个 Sidecar 会额外占用约 50MB 内存(Idle),建议为集群预留 30% 左右的内存用于 Sidecar。
  2. 性能调优:调整 Envoy 的并发连接数(concurrency)和连接池大小。
  3. 高可用部署:Istiod 至少 2 副本,Gateway 至少 2 副本,并配置 PDB。
  4. 升级策略:使用 金丝雀升级(Canary Upgrade),逐步替换控制平面。
  5. CNI 支持:如果不想在 Pod 中挂载 istio-init 初始化容器(需要 NET_ADMIN 权限),可以部署 Istio CNI 插件。

常见故障排查

现象 原因 解决
Pod 一直处于 Init:0/1 Init 容器拉取镜像失败 检查 Envoy 镜像地址(proxyv2),或配置镜像仓库代理。
Pod 只显示 1/1 Sidecar 注入失败 检查命名空间是否打标(istio-injection=enabled)。
服务间请求超时 mTLS 不匹配 检查 PeerAuthentication 和 DestinationRule 的 mTLS 配置。
流量不按规则走 VirtualService 未生效 检查 VirtualService 的 hosts 字段是否匹配 Kubernetes Service 名称。

通过以上步骤,你应该可以搭建起一个功能完整的开源服务网格(基于 Istio + Envoy),核心部署模型是:一个 Kubernetes 集群,一个 Istiod 控制平面,多个 Gateway 和 Sidecar 组成的 Mesh 网络

抱歉,评论功能暂时关闭!