服务网格Istio 安装和示例应用实操指南

艺帆风顺 发布于 2025-04-07 18 次阅读


1 什么是 Istio?

Istio 是一个功能强大的 服务网格(Service Mesh) 框架。它通过透明代理(Sidecar 模式的 Envoy)在微服务架构中实现 流量治理、安全控制、可观测性 和 策略控制,无需改动应用代码。

2 为什么要用 Istio?

挑战
Istio 解决方式
服务发现复杂
统一流量管理、服务注册发现
灰度发布困难
流量分配(按权重、按用户分流等)
跨服务认证、加密难
mTLS(双向认证)、安全通信
链路追踪、监控缺失
集成 Jaeger/Prometheus/Grafana
服务访问控制困难
RBAC(角色权限访问控制)、授权策略
流量熔断/限流/故障注入
流量治理、熔断器、故障模拟

3 Istio 架构详细剖析

注:图片来源网络

Istio的架构主要由数据平面Envoy和控制平面Istiod两部分组成。

3.1 数据平面

Istio的数据平面使用的是EnvoyEnvoy以 Sidecar 容器 的形式部署在每个微服务 Pod 中。

Envoy代理是唯一一个与数据平面流量交互的Istio组件。用于调解服务网格中所有服务的所有入站和出站流量。

3.2 控制平面

Istio的数据平面使用的是Istiod,Istiod(集成了 Pilot、Citadel、Galley),提供服务发现、配置、证书管理、加密通信和认证功能。对于新版本的Istio(v1.5+),部署后仅能看到Istiod一类Pod。主要有三部分组成:

  • Pilot:为 Envoy 分发路由规则和流量配置。
  • Citadel:提供密钥管理和证书签发,实现双向 mTLS。
  • Galley:负责配置验证和分发。

控制平面无需与业务流量直接交互。

4 Istio 安装部署

4.1 环境要求

  • Kubernetes ≥ 1.24,我实验环境是1.28
  • kubectl、istioctl 已安装
  • 节点内存至少 4G(推荐 8G+)

4.2 安装 Istioctl 工具

下载地址:

https://github.com/istio/istio/releases
# 直接获取安装包wget https://github.com/istio/istio/releases/download/1.23.3/istio-1.23.3-linux-amd64.tar.gz# 解压tar -xvf istio-1.23.3-linux-amd64.tar.gz# 设置环境变量vi /etc/profileexport PATH=/data/istio-1.23.3/bin:$PATH# 使配置文件生效source /etc/profile

4.3 检查 Kubernetes 集群是否满足部署条件

istioctl x precheck

4.4 Istio 控制面安装

istioctl install --set profile=default -y

可用 profile 解释:

Profile
说明
demo
功能全、调试方便、资源消耗高
default
最佳默认配置,启用核心功能,生产推荐
minimal
只安装 istiod,适合自定义部署
remote
多集群控制面部署

4.5 启用命名空间的自动注入 Sidecar

kubectl label namespace default istio-injection=enabled

【温馨提示】所有部署在该命名空间的 Pod 会自动注入 Envoy Sidecar。关闭:enabled改成disabled

4.6 验证 Istio 控制面和网关组件

kubectl get pods -n istio-system

5 部署示例应用

5.1 部署应用

这个安装包自带的应用

kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml

5.2. 验证应用服务状态

kubectl get pods -n defaultkubectl get svc -n default

5.3 配置 Istio 网关暴露应用

(1)创建 Gateway 和 VirtualService

kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml

(2) 查看 Gateway 和 VirtualService

kubectl get gatewaykubectl get virtualservice
kubectl get svc istio-ingressgateway -n istio-system

5.4 访问应用

如果没有外部IP,EXTERNAL-IP会显示pending状态

需要将loadBalancer改为NodePort

kubectl edit svc istio-ingressgateway -n istio-system

将 type: LoadBalancer 改为

type: NodePort

再次查看

kubectl get svc istio-ingressgateway -n istio-system

80端口映射为30702,所以访问地址为

http://10.0.0.100:30702/productpage

成功访问测试页面

本次分享结束,关注我,后期将分享更多运维干货知识。

关注李哥,添加微信,可进入技术交流群。


往期推荐