安装 Istio CNI 节点智能体
Istio CNI 节点智能体用于为 mesh 中的 Pod 配置流量重定向。 它以 DaemonSet 形式运行,在每个节点上都拥有更高权限。 Istio CNI 节点智能体可用于两种 Istio 数据平面模式。
对于 sidecar 数据平面模式,Istio CNI 节点智能体是可选的。 它取消了在 mesh 中每个 Pod 里运行特权 init 容器的要求, 改为在每个 Kubernetes 节点上运行一个具有特权的节点智能体 Pod。
在 ambient 数据平面模式下,Istio CNI 节点智能体是必需的。
本文重点介绍将 Istio CNI 节点智能体作为 sidecar 数据平面模式的可选组件来使用。
如果您在 OpenShift 集群中创建 service mesh,则 Istio CNI 默认已启用,因此无需按照本文档中的步骤操作。
目录
前提条件必须使用 Istio CNI 的环境可以使用 Istio CNI 的环境不能使用 Istio CNI 的环境安装 Istio CNI 节点智能体使用 ServiceMesh Istio CNI 组件安装其他配置验证处理 init 容器注入使用与验证竞态条件与缓解另请参阅前提条件
必须使用 Istio CNI 的环境
- Huawei Cloud CCE
- 安全限制较高的环境。(例如,禁止在业务工作负载中使用
NET_ADMIN和NET_RAW权限的环境)
可以使用 Istio CNI 的环境
- 任何已启用 CNI 支持的 Kubernetes 集群
不能使用 Istio CNI 的环境
- 已禁用 Kubernetes CNI 支持的集群(仅限
KIND等开发环境)
安装 Istio CNI 节点智能体
首先,按常规方式安装 service mesh。安装完成后,暂时不要添加任何服务(即不要注入 Sidecar)。然后按照以下步骤安装并配置 Istio CNI。
使用 ServiceMesh Istio CNI 组件安装
在大多数环境中,可以使用以下命令安装启用 istioCni 组件的基础 Istio 集群:
- 安装 Istio CNI 节点智能体时需要 istioCni。
- 通常安装在
kube-system命名空间中。
其他配置
使用 OpenShift 或 Multus CNI 时:
- cni.values.chained 应设置为
false。 - cnivalues.provider 应设置为
multus。
- 日志级别。(默认:
info) - CNI 二进制目录。(默认:
/opt/cni/bin) - CNI 配置目录。(默认:
/etc/cni/net.d) - 用于插入 istioCni 插件配置的配置文件,默认会选择 cniConfiDir 中找到的第一个文件。
- 此目录必须存在于节点上;如果不存在,请参考容器运行时文档以确定合适的路径。(默认:
/var/run/netns,在 minikube/docker/others 中可为/var/run/docker/netns) - 将配置文件作为插件链(值为
true)部署,或作为 conf 目录中的独立文件(值为false)部署。 - 基于 CNI 提供程序进行自定义配置,可用值:
default和multus。(默认:default)
验证
在继续下一步之前,请确保所有 CNI 节点智能体 Pod 都处于 Running 状态。
处理 init 容器注入
默认情况下,Istio 会使用 webhook 注入 istio-init 容器,以实现透明流量拦截。
要使用 Istio CNI 替代 istio-init 容器,需要按如下方式调整 ServiceMesh 资源:
- 是否启用 Istio CNI 来替代
istio-init容器。(默认:false) - CNI 提供程序。如果使用 Multus CNI,应设置为
multus。(默认:default)
使用与验证
安装并配置完成后,使用常规的 service 注入流程即可,无需进行其他更改。
在 Istio CNI 组件安装并正确配置后,Pod 将发生以下变化:
- 不再包含
istio-init容器(透明流量拦截将由 Istio CNI 节点智能体处理)。 - 取而代之的是,Istio 会注入一个名为
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 init 容器,
它会检测流量重定向是否已正确配置,如果未正确配置,则会阻止 Pod 启动。
CNI DaemonSet 会检测并处理任何处于此状态的 Pod;Pod 的处理方式取决于下面描述的配置。
此缓解机制默认启用,可通过将 cni.values.repair.enabled 设置为 false 将其关闭。
- 是否启用该缓解机制。(默认:
true) - 启用后,会动态重新配置 Pod 以应用正确配置。当容器重启后,Pod 将继续正常运行。(默认:
true) - 启用后,Pod 在重新调度时会被删除,随后将具有正确的配置。(默认:
false) - 启用后,仅会为 Pod 添加标签
cni.istio.io/uninitialized=true。用户需要手动采取措施进行处理。(默认:false)
配置优先级:repairPods > deletePods > labelPods。因此,将优先使用第一个值为 true 的字段。
例如,要让 deletePods 生效,仅将 deletePods 设置为 true 并不足够,还需要将 repairPods 设置为 false。