3、Istio安装与部署:从下载到验证的全流程实战

说实话,Istio的安装部署,是我在服务网格落地过程中踩坑最多的一环。很多同学觉得不就是跑几个yaml文件嘛,但真到了生产环境,Profile选错、资源配少、版本不兼容,哪个都能让你折腾半天。

这一章,我带你从头捋一遍。从下载安装包开始,到选Profile、部署到K8s集群,最后验证安装是否成功。每一步我都会把我踩过的坑我习惯的做法分享给你。

3.1 下载与安装:别用最新版

先说说下载。Istio的官方发布地址是GitHub的release页面,但我个人习惯用命令行搞定:

curl -L https://istio.io/downloadIstio | sh -

这条命令会下载最新稳定版。但我要提醒你——别追最新版。我在项目中遇到过,Istio 1.12刚发布时,和K8s 1.22的API兼容性出了问题,折腾了两天才回退。

我建议你指定版本号,比如:

curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.18.2 sh -
我的习惯:下载后先把 istioctl 加到PATH里。解压目录下的 bin/istioctl 是核心工具,后面所有操作都靠它。

下载完成后,你会看到这样的目录结构:

istio-1.18.2/
├── bin/
│   └── istioctl
├── manifests/
├── samples/
└── tools/

嗯,这里要注意:samples目录里有很多好用的示例,比如Bookinfo应用,后面验证安装时会用到。

3.2 Profile选择:别一上来就用default

Istio提供了几种Profile,说白了就是预配置模板。你想想看,生产环境和开发环境的需求能一样吗?

Profile名称 适用场景 组件数量
default 生产环境(推荐) istiod、ingressgateway、egressgateway
demo 开发/测试 全部组件 + 更多监控
minimal 最小安装 仅istiod
remote 多集群场景 仅istiod(远程控制面)
empty 完全自定义 无组件

我刚开始用Istio时,图省事直接上了demo Profile。结果呢?集群里跑了一堆我用不上的组件,资源占用直接翻倍。后来学乖了,生产环境一律用default,开发环境用demo

避坑指南:我曾经在生产环境误用了demo Profile,导致Kiali和Grafana占用了大量内存,业务Pod被挤占。记住:demo Profile只适合本地测试

查看所有Profile的命令:

istioctl profile list

查看某个Profile的具体配置:

istioctl profile dump default

我个人习惯是先dump出来看看,确认组件列表和配置参数,再决定要不要微调。

3.3 在Kubernetes上部署Istio

好,到了最核心的一步。部署前,先确认你的K8s集群满足条件:

  • K8s版本 ≥ 1.21(我建议用1.24以上)
  • 集群有足够的资源(至少2核4G)
  • 已安装kubectl并配置好kubeconfig

部署命令其实就一行:

istioctl install --set profile=default -y

这条命令会做三件事:

  1. 创建istio-system命名空间
  2. 部署istiod(控制面核心组件)
  3. 部署ingressgateway和egressgateway

等等,你以为这就完了?没那么简单。我在项目中遇到过,有些云厂商的K8s集群默认没有配置LoadBalancer,ingressgateway会一直Pending。这时候你需要手动指定NodePort:

istioctl install --set profile=default \
  --set components.ingressGateways[0].k8s.service.type=NodePort -y

我的经验:部署完成后,别急着走。先看看Pod状态:

kubectl get pods -n istio-system

如果istiod一直CrashLoopBackOff,八成是资源不够。我遇到过好几次,把istiod的requests调低点就好了。

3.4 验证安装:别只看Pod状态

很多人验证安装,就看看Pod是不是Running。嗯,这远远不够。我一般做三步验证:

第一步:检查组件状态

kubectl get all -n istio-system

确保istiod、ingressgateway、egressgateway都处于Running状态。

第二步:用示例应用验证

Istio官方提供了Bookinfo应用,我习惯用它做冒烟测试:

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

然后访问productpage页面,看看能不能正常显示。如果页面加载不出来,八成是Gateway配置有问题。

第三步:检查Sidecar注入

这才是验证的核心。给命名空间打上标签:

kubectl label namespace default istio-injection=enabled

然后重新部署Bookinfo,看看每个Pod是不是都多了个istio-proxy容器:

kubectl get pods -n default

你会看到类似这样的输出:

NAME                              READY   STATUS    RESTARTS
productpage-v1-6c7468f4b8-2x8k9   2/2     Running   0

注意看READY列是2/2,说明Sidecar注入成功了。

一个小技巧:如果Sidecar没注入成功,先检查命名空间标签有没有打上。我曾经手滑打成了"istio-injection=enable"(少了个d),排查了半天才发现。

3.5 卸载与清理

万一装错了,或者想重来,卸载也很简单:

istioctl uninstall -y --purge
kubectl delete namespace istio-system

注意--purge参数会清理所有Istio相关的CRD和资源。我建议卸载后重启一下集群里的Pod,因为Sidecar还在,不重启会报错。

好了,这一章的内容就到这里。从下载到验证,每一步我都把实际踩过的坑我习惯的做法告诉你了。下一章我们聊聊流量管理,那才是Istio真正发力的地方。

本章核心要点:

  • 下载时指定版本,别追最新版
  • 生产环境用default Profile,开发用demo
  • 部署后做三步验证:组件状态、示例应用、Sidecar注入
  • 卸载时加--purge参数,清理干净