使用 istioctl 安装 Istio 并启用 Sidecar 注入
在本地集群上运行网格,确认它健康,并让你的第一个工作负载注入 sidecar。
istioctl 是在集群上运行 Istio 的最快方式,这使它成为学习网格的正确起点,尽管(下一篇指南介绍的)Helm 更适合你要长期管理的生产安装。本指南安装 Istio,确认它健康,并向一个真实的工作负载注入 sidecar。
安装之前:集群资源
Istio 的控制平面和 ingress/egress 网关需要真实的 CPU 和内存,比默认的本地集群通常分配的更多。具体到 minikube,请为集群启动时留出余量:
minikube start --cpus=4 --memory=8192
资源不足是首次安装时 Istio Pod 卡在 Pending 或 CrashLoopBackOff 的常见原因,在排查其他任何问题之前值得先排除它。
安装 istioctl
从 Istio 的发布页面下载适合你平台的版本,或使用安装脚本:
curl -L https://istio.io/downloadIstio | sh -
cd istio-*
export PATH=$PWD/bin:$PATH
istioctl version --remote=false
export PATH 这一行只对你当前的 shell 会话生效;如果你想让 istioctl 在每个新终端中无需重复这一步就可用,请把它加入你的 shell 配置文件(~/.bashrc、~/.zshrc)。
将 Istio 安装到集群中
istioctl install --set profile=demo -y
-y 跳过确认提示。demo profile 会安装控制平面以及 ingress 和 egress 网关,资源设置足够轻量,适合本地集群;生产安装通常从更精简的 default profile 开始,Helm 指南会介绍。如果你想在选择之前查看每个 profile 包含什么,可以列出可用的 profile:
istioctl profile list
确认安装:
kubectl get pods -n istio-system
你应该会看到 istiod,并且在使用 demo profile 时还有 istio-ingressgateway 和 istio-egressgateway,全部处于 Running 状态。
确认安装 Istio 还没有改变任何东西
这一点值得明确检查,因为它第一次会让人感到意外:安装 Istio 对现有的工作负载没有任何影响。不会出现 sidecar,你的应用运行方式不会有任何变化,直到你显式启用注入。Istio 在集群中闲置,代价只是它自己的控制平面和网关所消耗的资源,仅此而已。
为命名空间启用 sidecar 注入
kubectl label namespace default istio-injection=enabled
kubectl get namespace default --show-labels
这只会影响在应用标签之后创建的 Pod。对于该命名空间中已经存在的 Pod,请重新创建它们:
kubectl delete pods --all -n default
kubectl rollout restart deployment -n default
(或者重新应用最初创建它们的任何清单;先 kubectl delete 再 kubectl apply 同样未经修改的文件,效果相同;清单本身不需要任何改动,注入就会生效。)
确认 sidecar 确实落地了
kubectl get pods -n default
拥有 sidecar 的 Pod 在 READY 下显示 2/2 而不是 1/1。确认那第二个容器实际是什么:
kubectl describe pod <pod-name> -n default
你应该会在输出的 Containers 下看到一个 istio-init init 容器(用于配置流量拦截),以及与你应用自己的容器并列的 istio-proxy 容器。
手动注入单个工作负载,而无需给命名空间打标签
有时,让整个命名空间进入网格并不是你想要的,你只想要某一个特定的工作负载。istioctl kube-inject 会在清单被应用之前把 sidecar 添加进去,而不是依赖命名空间范围的自动注入:
istioctl kube-inject -f my-deployment.yaml | kubectl apply -f -
这是命名空间标签自动触发行为的手动等价操作:一个由 istioctl 生成、合并进你的清单的 sidecar 规格,一步应用。对于混有已入网格和未入网格工作负载的命名空间,这很有用,因为给整个命名空间打标签会让超出你本意的范围入网。
卸载
istioctl uninstall --purge -y
kubectl delete namespace istio-system
--purge 会移除安装所添加的一切,包括当前激活之外其他 profile 的资源,如果你在测试期间切换过 profile,并且希望彻底移除而不是留下早先安装的残余,这一点很重要。
热门指南
-
Istio 架构:Sidecar、数据平面与控制平面 istiod 究竟做什么,Envoy sidecar 如何融入,以及为什么你的应用及其清单都不需要知道 Istio 的存在。 -
使用 Helm 安装并定制 Istio 官方推荐的生产环境运行 Istio 的方式,以及取代已被移除的 Istio Operator 的方案。 -
使用 istioctl 验证并调试 Istio 安装 在配置错误咬你一口之前就发现它:analyze、validate、proxy-status,以及网格悄悄依赖的那个标签。 -
观测你的网格:Prometheus、Grafana、追踪与 Kiali 每个 sidecar 已经在发出指标和追踪 —— 安装那些能把它变成你真正可以查看的东西的插件。