理解了 Istio 的架构之后,是时候亲手搭建一个 Istio 环境了。在 Kubernetes 集群中安装 Istio 有多种方式,最常用的是 istioctl 命令行工具和 Helm。本文将详细介绍使用 istioctl 安装 Istio 的完整流程,涵盖环境准备、安装配置文件的选型、命名空间 Sidecar 自动注入的配置,以及通过 Bookinfo 示例应用验证 Istio 的核心功能。跟着操作,你将拥有一个可用的 Istio 服务网格环境。
一、环境准备
在安装 Istio 之前,需要确保以下条件已满足:
Kubernetes 集群:一个可用的 Kubernetes 集群(版本 1.19+),且 kubectl 已配置好与集群的通信。
资源充足:Istio 控制平面和 Sidecar 代理需要一定的计算资源。建议集群至少分配 4GB 内存和 2 个 CPU 核心。
💡 本地开发建议:如果你没有现成的 Kubernetes 集群,可以使用 Minikube 或 Kind 在本地快速搭建一个测试环境。Minikube 启动命令:minikube start --cpus=4 --memory=8192。
二、使用 istioctl 安装 Istio
istioctl 是 Istio 官方提供的命令行工具,用于安装、配置和调试 Istio 服务网格。
2.1 下载 istioctl
# 下载最新版本的 Istiocurl-Lhttps://istio.io/downloadIstio|sh-# 进入 Istio 包目录cdistio-1.23.0# 将 istioctl 添加到 PATHexportPATH=$PWD/bin:$PATH💡 版本选择:建议使用最新的稳定版本。你可以访问 Istio 官方发布页面查看当前最新版本号,并替换上述命令中的版本号。
2.2 验证 istioctl
istioctl version如果安装成功,会显示客户端版本信息。
2.3 安装 Istio
Istio 提供了多种安装配置文件(Profile),每个 Profile 针对不同的使用场景进行了预配置:
Profile 说明 适用场景
demo 功能齐全,资源消耗适中,包含 Jaeger、Grafana、Kiali 等附加组件 学习与测试(推荐)
default 核心功能,不含附加组件 生产环境的最小化部署
minimal 仅包含控制平面,不含 Ingress/Egress Gateway 自定义部署的基础
remote 用于多集群架构中的远程集群 多集群部署
对于学习和测试,推荐使用 demo Profile:
istioctlinstall--setprofile=demo-y该命令会在 Kubernetes 集群的 istio-system 命名空间中部署 Istio 控制平面(istiod)和 Ingress Gateway。
⚠️ 生产环境建议:生产环境不建议直接使用 demo Profile。建议从 default Profile 开始,根据实际需求逐步开启功能,并通过 IstioOperator CRD 进行声明式配置管理。
2.4 验证安装
# 检查 Istio 控制平面 Pod 是否正常运行kubectl get pods-nistio-system# 检查 Istio 服务kubectl get svc-nistio-system预期输出应包含 istiod-xxx Pod(Running)和 istio-ingressgateway Service。
三、配置 Sidecar 自动注入
要让 Istio 接管服务的流量,需要为每个 Pod 注入 Envoy Sidecar 容器。Istio 提供了自动注入机制,大大简化了这一过程。
3.1 为命名空间启用自动注入
为需要启用服务网格的命名空间添加 istio-injection=enabled 标签:
# 为 default 命名空间启用自动注入kubectl label namespace default istio-injection=enabled💡 命名空间隔离:建议将启用服务网格的服务放在独立的命名空间中,例如 prod、staging 等。通过命名空间标签,可以精细控制哪些服务加入网格。
3.2 验证自动注入是否生效
当命名空间被正确标记后,新创建的 Pod 将自动注入 Envoy Sidecar 容器。
# 创建一个测试 Podkubectl run nginx--image=nginx:alpine--restart=Never# 查看 Pod 中的容器kubectl get pod nginx-ojsonpath='{.spec.containers[*].name}'预期输出应包含 nginx 和 istio-proxy 两个容器。如果没有 istio-proxy,可能是 Pod 创建时命名空间尚未启用注入,需要重启 Pod。
3.3 手动注入(备选方案)
如果不想为整个命名空间启用自动注入,也可以使用 istioctl kube-inject 手动为 Deployment YAML 注入 Sidecar:
istioctl kube-inject-fdeployment.yaml|kubectl apply-f-💡 生产建议:生产环境推荐使用自动注入,因为它与 GitOps 工作流更契合,且不需要修改原始的 Deployment YAML。
四、部署 Bookinfo 示例应用
Bookinfo 是 Istio 官方提供的示例应用,用于演示服务网格的各项功能。它是一个简单的图书信息展示系统,由四个微服务组成。
4.1 部署 Bookinfo 应用
确保 default 命名空间已启用自动注入后,部署 Bookinfo 应用:
# 应用 Bookinfo 部署清单kubectl apply-fsamples/bookinfo/platform/kube/bookinfo.yaml4.2 验证部署
# 查看所有 Pod,每个 Pod 应有 2 个容器(业务容器 + istio-proxy)kubectl get pods# 查看服务kubectl get services预期输出应包含 details、productpage、ratings、reviews 四个服务,以及各自对应的 Pod。
4.3 配置 Ingress Gateway
为了让外部能够访问 Bookinfo 应用,需要配置 Istio Ingress Gateway:
# 应用 Ingress Gateway 配置kubectl apply-fsamples/bookinfo/networking/bookinfo-gateway.yaml4.4 访问 Bookinfo 应用
方式一:端口转发(本地测试)
kubectl port-forward svc/istio-ingressgateway-nistio-system8080:80然后访问 http://localhost:8080/productpage。
方式二:获取外部 IP
如果集群支持 LoadBalancer,可以直接获取 Ingress Gateway 的外部 IP:
# 获取 Ingress Gateway 的外部 IPkubectl get svc istio-ingressgateway-nistio-system然后访问 http://<EXTERNAL_IP>/productpage。
4.5 验证流量管理
Bookinfo 应用的 reviews 服务有三个版本(v1、v2、v3),默认情况下请求会在这三个版本之间轮询。可以观察到每次刷新页面时,“Reviews”部分的显示会变化(v1 无星标、v2 有黑色星标、v3 有红色星标),这证明了 Istio 的负载均衡功能正在工作。
五、卸载 Istio
如果需要清理 Istio 环境:
# 卸载 Istioistioctl uninstall--purge-y# 删除 Istio 命名空间kubectl delete namespace istio-system# 删除 Bookinfo 应用kubectl delete-fsamples/bookinfo/platform/kube/bookinfo.yaml六、小结
安装方式:istioctl install 是最快捷的安装方式,demo Profile 适合学习测试。
Sidecar 注入:为命名空间添加 istio-injection=enabled 标签即可启用自动注入。
Bookinfo 示例:官方示例应用是验证 Istio 功能的最佳起点。
验证要点:检查 Pod 中是否包含 istio-proxy 容器,以及 Ingress Gateway 是否正常工作。