Istio CNI 节点代理用于为网格中的 Pods 配置流量重定向。它作为 DaemonSet 在每个节点上以提升权限运行。Istio CNI 节点代理可以在两种 Istio 数据平面模式中使用。
在 Sidecar 数据平面模式下,Istio CNI 节点代理是可选的。它消除了在网格中的每个 Pod 内运行特权初始化容器的需求,以一个特权节点代理 Pod 替换该模型,该 Pod 在每个 Kubernetes 节点上运行。
在 Ambient 数据平面模式下,Istio CNI 节点代理是 强制性的。
本文档专注于将 Istio CNI 节点代理作为 Sidecar 数据平面模式的可选部分使用。
如果您在 OpenShift 集群中创建服务网格,则默认启用 Istio CNI,因此您无需遵循本文档中的步骤。
NET_ADMIN
和 NET_RAW
权限的环境)KIND
这样的开发环境)首先,照常安装服务网格。安装后,暂时不要添加任何服务(即,不要注入 Sidecar)。然后按照以下步骤安装和配置 Istio CNI。
在大多数环境中,可以通过以下命令安装启用 istioCni 组件的基本 Istio 集群:
使用 OpenShift 或 Multus CNI 时:
false
。multus
。info
)/opt/cni/bin
)/etc/cni/net.d
)/var/run/netns
,在 minikube/docker/其他环境中可以是 /var/run/docker/netns
)true
)或作为独立文件放置在配置目录中(值 false
)。default
和 multus
。(默认值为 default
)确保所有 CNI 节点代理 Pods 处于运行状态,然后再进行下一步。
默认情况下,Istio 使用一个 webhook 来注入 istio-init
容器以实现透明流量拦截。为了使用 Istio CNI 代替 istio-init
容器,需要调整 ServiceMesh 资源,如下所示:
istio-init
容器。(默认值:false
)multus
。(默认值:default
)安装和配置完成后,使用正常的服务注入过程,无需任何额外更改。
安装并正确配置 Istio CNI 组件后,Pods 将发生以下更改:
istio-init
容器(透明流量拦截将由 Istio CNI 节点代理处理)。istio-validation
的容器,检查透明流量拦截的 iptables 规则是否设置成功。Istio CNI DaemonSet 在每个节点上安装 CNI 网络插件。然而,在 DaemonSet pod 安排到节点和 CNI 插件安装并准备就绪之间存在时间差。在此时间差期间,应用程序 pod 可能启动,而 kubelet
对 Istio CNI 插件一无所知。其结果是,应用程序 pod 启动而没有 Istio 流量重定向,从而绕过 Istio Sidecar。
为了解决应用程序 pod 与 Istio CNI DaemonSet 之间的竞争,在 Sidecar 注入中添加了一个 istio-validation
初始化容器,该容器检测流量重定向是否正确设置,如果没有则阻止 pod 启动。CNI DaemonSet 将检测并处理卡在这种状态下的任何 pod;具体如何处理 pod 将取决于下面描述的配置。此缓解措施默认启用,可以通过将 cni.values.repair.enabled
设置为 false
来禁用。
true
)true
)false
)cni.istio.io/uninitialized=true
。用户需要手动采取行动以解决问题。(默认值:false
)配置优先级:repairPods
> deletePods
> labelPods
。因此,第一个具有更高优先级的 true
字段将被使用。
例如,要使 deletePods
生效,不仅需将其设置为 true
,还需将 repairPods
设置为 false
。