3. Istio安装与部署:从环境准备到生产落地
好,咱们直接进入正题。这一章聊Istio的安装,我敢说这是很多初学者第一个栽跟头的地方。我自己刚开始接触时也踩过不少坑,今天就把这些经验掰开揉碎了讲给你听。
3.1 安装环境准备:别急着动手
先说说环境。很多人上来就敲命令,结果装到一半发现k8s版本不对,或者资源不够。嗯,这里要注意,准备工作做足了,后面才顺。
3.1.1 Kubernetes集群要求
Istio对k8s版本有明确要求。我个人习惯是先用 kubectl version 确认一下。别小看这一步,我曾经在1.16的老集群上硬装Istio 1.12,结果一堆CRD不兼容,折腾了大半天。
| Istio版本 | 支持的K8s版本 | 推荐K8s版本 |
|---|---|---|
| 1.16.x | 1.23 - 1.27 | 1.25 |
| 1.17.x | 1.24 - 1.28 | 1.26 |
| 1.18.x | 1.25 - 1.29 | 1.27 |
另外,集群至少要有4个vCPU和8GB内存。你想想看,光一个控制面就要占不少资源,再加上数据面的Envoy代理,资源给少了肯定跑不起来。
3.1.2 网络与存储准备
网络方面,我建议提前规划好Pod CIDR和Service CIDR。Istio的Sidecar注入依赖CNI插件,如果你用Calico或Flannel,记得确认它们和Istio的兼容性。
存储倒不是必须的,但如果你要用Istio的遥测功能,建议提前准备好持久化存储。我在项目中就遇到过因为没配PV,导致Prometheus数据丢失的情况。
3.2 使用istioctl安装:最直接的方式
istioctl是官方推荐的安装工具。说白了,它就是Istio的瑞士军刀,什么都能干。
3.2.1 下载istioctl
先下载对应版本的istioctl。我一般去GitHub Release页面找,或者直接用脚本:
curl -L https://istio.io/downloadIstio | sh -
cd istio-1.18.0
export PATH=$PWD/bin:$PATH
下载完后,记得把istioctl加到PATH里。我习惯在 ~/.bashrc 里写死,省得每次都要export。
3.2.2 安装Istio控制面
安装命令很简单,但配置项很多。先来个最基础的:
istioctl install --set profile=demo -y
这里用了demo配置,它包含了所有组件,适合学习和测试。但生产环境千万别这么干,后面我会说为什么。
安装完成后,用 kubectl get pods -n istio-system 检查一下。如果所有Pod都Running了,恭喜你,第一步走通了。
istioctl manifest generate 先看看它到底生成了什么。
3.2.3 配置Sidecar注入
控制面装好了,接下来要让业务Pod用上Sidecar。我建议用命名空间级别的自动注入:
kubectl label namespace default istio-injection=enabled
这样,default命名空间下新创建的Pod都会自动注入Envoy代理。注意,是新创建的,已有的Pod不会自动注入。你需要重启它们。
3.3 使用Istio Operator安装:更优雅的方式
istioctl适合一次性安装,但如果你需要频繁更新配置,或者想用GitOps管理,Operator是更好的选择。
3.3.1 安装Istio Operator
Operator本身也是一个Pod,它负责管理Istio的生命周期。安装方式:
istioctl operator init
这条命令会在istio-operator命名空间下创建一个Operator Pod。之后,你只需要定义 IstioOperator 这个CRD就行了。
3.3.2 通过CRD定义Istio配置
举个例子,我想装一个最小化的Istio,只包含Pilot和Ingress Gateway:
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
name: minimal-istio
namespace: istio-system
spec:
profile: minimal
components:
ingressGateways:
- name: istio-ingressgateway
enabled: true
然后apply这个YAML,Operator会自动帮你完成安装。你想想看,以后想加个Egress Gateway,改一下YAML再apply就行了,多方便。
3.4 生产环境部署建议:别踩这些坑
前面讲的都是基础操作,接下来才是重点。生产环境部署Istio,有很多细节需要注意。我把自己踩过的坑和总结的经验都列出来。
3.4.1 选择合适的Profile
Istio提供了几个内置Profile:
| Profile | 适用场景 | 包含组件 |
|---|---|---|
| default | 生产环境基础配置 | Pilot, Ingress Gateway, Egress Gateway |
| demo | 开发测试 | 全部组件 + 遥测工具 |
| minimal | 资源受限环境 | 仅Pilot |
| external | 多集群场景 | 仅Pilot(无Gateway) |
我个人建议生产环境用default Profile,然后按需添加组件。别图省事用demo,它开了太多调试功能,性能会受影响。
3.4.2 资源限制与HPA
Istio控制面的Pod一定要设置资源限制。我见过一个案例,Pilot因为没设limits,被业务流量打爆了,整个网格都瘫痪了。
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
components:
pilot:
k8s:
resources:
requests:
cpu: 500m
memory: 1Gi
limits:
cpu: 1000m
memory: 2Gi
hpaSpec:
maxReplicas: 5
minReplicas: 2
另外,建议给Pilot和Ingress Gateway都配上HPA。流量是动态的,手动扩缩容太累了。
3.4.3 安全加固
生产环境的安全不能马虎。我建议至少做这几件事:
- 启用mTLS:默认是PERMISSIVE模式,建议改成STRICT。这样所有服务间通信都加密。
- 限制Ingress Gateway的权限:别给Gateway绑定cluster-admin角色。
- 审计日志:开启Istio的审计功能,记录所有配置变更。
3.4.4 监控与可观测性
Istio自带了Prometheus、Grafana和Kiali。但生产环境我建议用外部的监控系统,比如你公司已有的Prometheus集群。这样数据更集中,管理也方便。
另外,别忘了配置日志采样率。默认是100%,流量大的时候日志量会非常恐怖。我一般设成1%或10%,够用就行。
3.4.5 升级策略
Istio的升级不能马虎。我建议遵循这个流程:
- 先在测试环境验证新版本
- 用canary方式升级控制面
- 逐步迁移数据面(先升级少量服务)
- 观察一段时间,确认没问题再全量升级
记住,千万别在生产环境直接 istioctl upgrade。我见过有人这么干,结果控制面挂了,所有服务间的通信都断了。