第3章 服务网格安装与部署:在Kubernetes上安装Istio、配置Sidecar注入
说到服务网格,Istio 基本就是事实标准了。我刚开始接触这东西时,总觉得它像个黑盒——装上去就自动注入 Sidecar,但具体怎么装、怎么配,踩了不少坑。这一章我带你从头过一遍,把安装和注入这两个关键步骤理清楚。
3.1 安装前的准备
你得先有个正常的 Kubernetes 集群。我用的是 1.25 以上版本,Istio 1.18 及以上都能兼容。嗯,这里要注意:集群资源别太小。Istio 控制面至少需要 2 核 4G,不然启动时经常 OOM。我曾在测试环境用了 1 核 2G 的节点,istiod 反复 CrashLoopBackOff,查了半天才发现是资源不够。
另外,确保集群的 kubectl 能正常工作,当前 context 指向目标集群。最好用专门的命名空间来做实验,别污染生产 namespace。
3.2 选择安装方式
Istio 官方给了三种主流安装方式:istioctl、Helm 和 Operator。我个人的习惯是:生产环境用 istioctl + 配置文件,因为它最灵活,升级也最可控。Helm 适合快速验证,Operator 嘛……说实话,我还没在生产上大规模用过,运维复杂度其实不低。
| 方式 | 适用场景 | 我踩过的坑 |
|---|---|---|
| istioctl | 生产、CI/CD 集成 | 配置变更后必须重新 apply,容易丢自定义资源 |
| Helm | 测试、快速部署 | values 文件太长,升级时容易漏掉参数 |
| Operator | 自动化运维探索 | 版本对齐麻烦,Operator 自身升级需慎重 |
3.3 使用 istioctl 安装 Istio
先下载 istioctl:
curl -L https://istio.io/downloadIstio | sh -
cd istio-1.20.3
export PATH=$PWD/bin:$PATH
你可以先看看内置的配置 profile:
istioctl profile list
常用的 profile 有 default、demo、minimal 和 remote。demo 带全套可观测组件,适合学习;default 用于生产基线。我个人建议:刚上手先用 demo,直观看到效果后,再切到定制配置。
安装命令很简单:
istioctl install --set profile=demo -y
等个一两分钟,看到 ✔ Istio core installed 之类的提示就代表成功了。检查一下核心组件:
kubectl get pods -n istio-system
你应该看到 istiod、ingressgateway、egressgateway 等 Pod。如果 istiod 一直没 Ready,八成是镜像拉取超时或资源不足。在国内环境,记得给 Docker 配个加速器,或者提前把镜像拉到所有节点上。
3.4 配置 Sidecar 自动注入
Sidecar 注入,说白了就是给你的 Pod 自动加上一个 Envoy 代理容器。Istio 通过 Admission Webhook 实现——你给命名空间打上标签 istio-injection=enabled,以后这个命名空间里新建的 Pod 都会自动被注入。
操作很简单:
kubectl create namespace bookinfo
kubectl label namespace bookinfo istio-injection=enabled
搞定了?别急,我先问你:自动注入是在 Pod 创建时触发的,对已经运行的 Pod 无效。如果现有 Pod 想注入,你得重建它们。我曾经在书上看到这句话,实际做的时候忘了重建,等了两小时死磕为啥没注入……后来同事提醒,才反应过来。
kubectl describe pod,看看 Containers 里是否多了 istio-proxy。或者直接用 istioctl analyze 检查配置正确性。3.5 手动注入与自动注入的抉择
自动注入省事,但有时你会希望手动控制——比如 CI/CD 里想先注入再跑测试,或者需要精确控制 Sidecar 配置版本。手动注入命令:
istioctl kube-inject -f deployment.yaml | kubectl apply -f -
我建议:开发/测试环境用自动注入,生产环境也要用自动注入(除非你有特殊原因)。手动注入生成的 YAML 文件脱离了 Istio 控制面的版本管理,升级 Sidecar 时你得全部重新生成,不是闹着玩的。
3.6 验证注入与流量拦截
装好 Istio、打上注入标签后,来跑官方示例 Bookinfo 验证下:
kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml -n bookinfo
然后看 Pod:
kubectl get pods -n bookinfo
如果每个 Pod 都有 2/2 就对了(业务容器 + istio-proxy)。
再测试流量能不能进来:
kubectl exec "$(kubectl get pod -l app=ratings -n bookinfo -o jsonpath='{.items[0].metadata.name}')" -c ratings -n bookinfo -- curl -sS productpage:9080/productpage | head -0
没报错就说明 Sidecar 正确拦截了流量。我遇到过一种情况:Pod 显示 2/2,但 curl 不通。检查日志发现 envoy 没连上 istiod——多半是网络安全策略没放行端口 15012(XDS 推送)。
3.7 本章知识体系
下面这张图概括了 Istio 安装部署与 Sidecar 注入的核心流程与要点:
图里从左到右概括了从准备集群、选择安装方式、执行安装到后续注入验证的完整链条。你可以把它当成一张速查表,每次部署前瞄一眼,能避开不少坑。
好了,这一章的内容就到这里。Istio 装好、注入配好,下一步就该跑透流量管理和安全策略了。记住我开头说的那句话:安装只是开始,真正考验人的是后面的运维和排错。多动手,多 log,总能把 Istio 驯服。