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数据丢失的情况。

小提示: 如果你在本地测试,可以用Minikube或Kind。我个人更推荐Kind,启动快,资源占用也小。

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 install 本质上是把一堆YAML文件apply到集群里。你可以用 istioctl manifest generate 先看看它到底生成了什么。

3.2.3 配置Sidecar注入

控制面装好了,接下来要让业务Pod用上Sidecar。我建议用命名空间级别的自动注入:

kubectl label namespace default istio-injection=enabled

这样,default命名空间下新创建的Pod都会自动注入Envoy代理。注意,是新创建的,已有的Pod不会自动注入。你需要重启它们。

注意: 我曾经在生产环境犯过一个错——给kube-system命名空间也打了这个标签,结果kube-proxy也被注入了Sidecar,整个集群网络都乱了。所以,千万别给系统命名空间打标签。

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就行了,多方便。

我的经验: 用Operator管理Istio,配合ArgoCD或Flux,可以实现声明式的服务网格管理。我在一个客户那里就是这么干的,升级回滚都很方便。

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的审计功能,记录所有配置变更。
避坑指南: 我曾经在启用STRICT mTLS后,发现有些老服务连不上。排查了半天,原来是那些服务没注入Sidecar。所以,切换前一定要确认所有服务都注入了Sidecar。

3.4.4 监控与可观测性

Istio自带了Prometheus、Grafana和Kiali。但生产环境我建议用外部的监控系统,比如你公司已有的Prometheus集群。这样数据更集中,管理也方便。

另外,别忘了配置日志采样率。默认是100%,流量大的时候日志量会非常恐怖。我一般设成1%或10%,够用就行。

3.4.5 升级策略

Istio的升级不能马虎。我建议遵循这个流程:

  1. 先在测试环境验证新版本
  2. 用canary方式升级控制面
  3. 逐步迁移数据面(先升级少量服务)
  4. 观察一段时间,确认没问题再全量升级

记住,千万别在生产环境直接 istioctl upgrade。我见过有人这么干,结果控制面挂了,所有服务间的通信都断了。

总结一下: Istio的安装部署看似简单,但生产环境要考虑的东西很多。资源规划、安全加固、监控告警、升级策略,每一个环节都不能掉以轻心。希望这些经验能帮你少走弯路。