Istio Istio

使用 istioctl 安装 Istio 并启用 Sidecar 注入

在本地集群上运行网格,确认它健康,并让你的第一个工作负载注入 sidecar。

12 min 初级

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,并且希望彻底移除而不是留下早先安装的残余,这一点很重要。

热门指南