搬瓦工 VPS 部署 Istio 服务网格完整教程

Istio 是目前最成熟、功能最丰富的开源服务网格平台,由 Google、IBM 和 Lyft 联合开发。它通过在每个服务旁注入 Envoy Sidecar 代理,实现了服务间通信的透明管理,提供流量控制、安全加密、可观测性等核心能力。本教程将在搬瓦工 VPS 上使用 K3s 轻量 Kubernetes 集群部署 Istio 服务网格,从安装到实际应用进行全面讲解。

一、Istio 架构概述

  • Istiod(控制平面):Istio 的核心组件,整合了 Pilot(服务发现和流量管理)、Citadel(证书管理)和 Galley(配置验证)功能。
  • Envoy Sidecar(数据平面):作为 Sidecar 容器注入到每个 Pod 中,拦截所有入站和出站流量。
  • Ingress Gateway:集群入口网关,管理外部流量进入服务网格。
  • Egress Gateway:集群出口网关,管理从网格到外部的流量。

二、系统要求

  • 操作系统:Ubuntu 22.04 LTS
  • 内存:至少 4GB,推荐 8GB
  • CPU:至少 2 核
  • 磁盘:至少 20GB 可用空间

Istio 需要 Kubernetes 环境,本教程使用 K3s 作为轻量级方案。

三、安装 K3s 集群

# 安装 K3s(禁用 Traefik,后续由 Istio 接管入口流量)
curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--disable traefik" sh -

# 配置 kubectl
export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
echo 'export KUBECONFIG=/etc/rancher/k3s/k3s.yaml' >> ~/.bashrc

# 验证集群状态
kubectl get nodes
kubectl get pods -A

四、安装 Istio

4.1 下载 Istio CLI

curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.22.0 sh -
cd istio-1.22.0
export PATH=$PWD/bin:$PATH
echo "export PATH=$HOME/istio-1.22.0/bin:\$PATH" >> ~/.bashrc

4.2 安装 Istio 控制平面

# 使用 demo 配置文件(包含完整组件,适合学习)
istioctl install --set profile=demo -y

# 验证安装
istioctl verify-install
kubectl get pods -n istio-system

4.3 启用自动 Sidecar 注入

# 为 default 命名空间启用自动注入
kubectl label namespace default istio-injection=enabled

# 验证标签
kubectl get namespace -L istio-injection

五、部署示例应用

# 部署 Bookinfo 示例应用
kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml

# 等待 Pod 就绪
kubectl get pods -w

# 验证应用
kubectl exec "$(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}')" \
  -c ratings -- curl -s productpage:9080/productpage | head -20

5.1 配置 Ingress Gateway

# 部署 Gateway 和 VirtualService
kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml

# 获取 Ingress Gateway 地址
export INGRESS_HOST=$(kubectl get svc istio-ingressgateway -n istio-system \
  -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
export INGRESS_PORT=$(kubectl get svc istio-ingressgateway -n istio-system \
  -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')

# 测试访问
curl -s "http://$INGRESS_HOST:$INGRESS_PORT/productpage" | head -20

六、流量管理

6.1 VirtualService 路由规则

cat <<EOF | kubectl apply -f -
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
    - reviews
  http:
    - match:
        - headers:
            end-user:
              exact: test-user
      route:
        - destination:
            host: reviews
            subset: v2
    - route:
        - destination:
            host: reviews
            subset: v1
EOF

6.2 DestinationRule 负载策略

cat <<EOF | kubectl apply -f -
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: reviews
spec:
  host: reviews
  trafficPolicy:
    connectionPool:
      tcp:
        maxConnections: 100
      http:
        h2UpgradePolicy: DEFAULT
        http1MaxPendingRequests: 50
  subsets:
    - name: v1
      labels:
        version: v1
    - name: v2
      labels:
        version: v2
    - name: v3
      labels:
        version: v3
EOF

6.3 金丝雀发布(流量分割)

cat <<EOF | kubectl apply -f -
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
    - reviews
  http:
    - route:
        - destination:
            host: reviews
            subset: v1
          weight: 80
        - destination:
            host: reviews
            subset: v2
          weight: 20
EOF

七、安全策略

7.1 mTLS(双向 TLS)

# 启用严格 mTLS 模式
cat <<EOF | kubectl apply -f -
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: default
  namespace: istio-system
spec:
  mtls:
    mode: STRICT
EOF

# 验证 mTLS 状态
istioctl x describe pod $(kubectl get pod -l app=productpage -o jsonpath='{.items[0].metadata.name}')

7.2 授权策略

cat <<EOF | kubectl apply -f -
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: allow-productpage
spec:
  selector:
    matchLabels:
      app: productpage
  action: ALLOW
  rules:
    - from:
        - source:
            principals: ["cluster.local/ns/default/sa/bookinfo-gateway"]
      to:
        - operation:
            methods: ["GET"]
EOF

八、可观测性

8.1 安装监控组件

# 安装 Kiali(服务网格可视化)
kubectl apply -f samples/addons/kiali.yaml

# 安装 Prometheus 和 Grafana
kubectl apply -f samples/addons/prometheus.yaml
kubectl apply -f samples/addons/grafana.yaml

# 安装 Jaeger(分布式追踪)
kubectl apply -f samples/addons/jaeger.yaml

# 等待组件就绪
kubectl get pods -n istio-system

8.2 访问监控面板

# 通过 istioctl 开启端口转发
istioctl dashboard kiali &
istioctl dashboard grafana &
istioctl dashboard jaeger &

九、常见问题

Sidecar 注入失败

确认命名空间标签已正确设置,并检查 istiod 是否正常运行:

kubectl get namespace -L istio-injection
kubectl get pods -n istio-system | grep istiod

资源不足

Istio 完整部署较消耗资源。在内存有限的 VPS 上,可以使用 minimal 配置文件:

istioctl install --set profile=minimal -y

总结

Istio 是功能最全面的服务网格方案,适合需要精细化流量管理和安全策略的微服务架构。如果你的 VPS 资源有限,可以考虑更轻量的 Linkerd 服务网格。选购搬瓦工 VPS 请参考 全部方案,部署 Istio 建议选择内存 4GB 以上的方案,购买时使用优惠码 NODESEEK2026 可享受 6.77% 的折扣,购买链接:bwh81.net

关于本站

搬瓦工VPS中文网(bwgvps.com)是非官方中文信息站,整理搬瓦工的方案、优惠和教程。我们不销售主机,不提供技术服务。

新手必读
搬瓦工优惠码

NODESEEK2026(优惠 6.77%)

购买时填入即可抵扣。