搬瓦工 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。