安装 Istio CNI 节点智能体

Istio CNI 节点智能体用于为网格中的 pod 配置流量重定向。 它以 DaemonSet 形式运行在每个节点上,并拥有提升后的权限。 Istio CNI 节点智能体可用于两种 Istio 数据平面模式。

对于 sidecar 数据平面模式,Istio CNI 节点智能体是可选的。 它取消了在网格中每个 pod 内运行具有特权的 init container 的要求, 改为在每个 Kubernetes 节点上运行一个具有特权的单一节点智能体 pod。

在 ambient 数据平面模式中,Istio CNI 节点智能体是必需的

本文重点介绍如何将 Istio CNI 节点智能体作为 sidecar 数据平面模式中的可选部分来使用。

TIP

如果你正在 OpenShift 集群中创建 service mesh,则默认已启用 Istio CNI,因此无需按照本文档中的步骤操作。

前提条件

必须使用 Istio CNI 的环境

  • 华为云 CCE
  • 安全约束较高的环境。(例如,禁止在业务工作负载中使用 NET_ADMINNET_RAW 权限的环境)

可以使用 Istio CNI 的环境

  • 任何启用了 CNI 支持的 Kubernetes 集群

不能使用 Istio CNI 的环境

  • 已禁用 Kubernetes CNI 支持的集群(仅限 KIND 等开发环境)

安装 Istio CNI 节点智能体

首先,照常安装 service mesh。安装完成后,暂时不要添加任何服务(即,不要注入 Sidecar)。然后按照以下步骤安装和配置 Istio CNI。

使用 ServiceMesh Istio CNI 组件安装

在大多数环境中,可以使用以下命令安装一个启用了 istioCni 组件的基础 Istio 集群:

apiVersion: asm.alauda.io/v1alpha1
kind: ServiceMesh
spec:
  componentConfig:
    - name: istioCni
      group: istio
      cni:
        namespace: kube-system
  1. 安装 Istio CNI 节点智能体需要 istioCni
  2. 通常安装在 kube-system 命名空间中。

其他配置

apiVersion: asm.alauda.io/v1alpha1
kind: ServiceMesh
spec:
  componentConfig:
    - name: istioCni
      group: istio
      cni:
        namespace: kube-system
        # 高级配置
        values:
          logLevel: info
          cniBinDir: ""
          cniConfDir: /etc/cni/net.d
          cniConfFileName: ""
          cniNetnsDir:
          excludeNamespaces:
            - istio-system
            - kube-system
          chained: true
          provider: default
CAUTION

在使用 OpenShiftMultus CNI 时:

  • cni.values.chained 应设置为 false
  • cnivalues.provider 应设置为 multus
  1. 日志级别。(默认值:info
  2. CNI 二进制目录。(默认值:/opt/cni/bin
  3. CNI 配置目录。(默认值:/etc/cni/net.d
  4. 用于插入 istioCni 插件配置的配置文件,默认情况下将使用 cniConfiDir 中找到的第一个文件。
  5. 此目录必须存在于节点上,如果不存在,请查阅容器运行时文档以了解正确的路径。(默认值:/var/run/netns,在 minikube/docker/其他环境中可以是 /var/run/docker/netns
  6. 将配置文件作为插件链部署(值为 true),或者作为 conf 目录中的独立文件部署(值为 false)。
  7. 基于 CNI 提供程序进行自定义配置,可能的值为:defaultmultus。(默认值:default

验证

NOTE

在进入下一步之前,请确保所有 CNI 节点智能体 pod 都处于 Running 状态。

# 如果 Istio CNI 智能体安装在其他命名空间,请调整 -nkube-system 部分:
kubectl -nkube-system get po -lk8s-app=istio-cni-node

处理 init container 注入

默认情况下,Istio 使用 webhook 注入 istio-init container,以实现透明流量拦截。 要使用 Istio CNI 替代 istio-init container,需要按如下方式调整 ServiceMesh 资源:

apiVersion: asm.alauda.io/v1alpha1
kind: ServiceMesh
spec:
  istioConfig:
    cni:
      enabled: true
      provider: default
  1. 是否启用 Istio CNI 来替代 istio-init container。(默认值:false
  2. CNI 提供程序。如果使用 Multus CNI,应设置为 multus。(默认值:default

使用与验证

安装并配置完成后,像平常一样使用 service 注入流程,无需进行任何额外更改。

在安装并正确配置 Istio CNI 组件后,pod 将发生以下变化:

  • istio-init container 将不再存在(透明流量拦截将由 Istio CNI 节点智能体处理)。
  • 取而代之的是,Istio 会注入一个名为 istio-validation 的 container,用于检查透明流量拦截的 iptables 规则是否已成功设置。

竞争条件与缓解

Istio CNI DaemonSet 会在每个节点上安装 CNI 网络插件。然而,从 DaemonSet pod 被调度到节点上,到 CNI 插件完成安装并可供使用之间,存在一个时间间隙。 在这段时间内,应用 pod 有可能启动,而 kubelet 并不知道 Istio CNI 插件。 结果就是应用 pod 启动时没有 Istio 流量重定向,并绕过了 Istio sidecar。

为了缓解应用 pod 与 Istio CNI DaemonSet 之间的竞争条件,istio-validation init container 会作为 sidecar 注入的一部分被添加进来;它会检测流量重定向是否已正确建立,并在未正确建立时阻止 pod 启动。 CNI DaemonSet 会检测并处理任何处于这种状态的 pod;pod 的处理方式取决于下面描述的配置。 此缓解机制默认启用,可通过将 cni.values.repair.enabled 设置为 false 来关闭。

apiVersion: asm.alauda.io/v1alpha1
kind: ServiceMesh
spec:
  componentConfig:
    - name: istioCni
      group: istio
      cni:
        values:
          repair:
            enabled: true
            repairPods: true
            deletePods: false
            labelPods: false
  1. 是否启用该缓解机制。(默认值:true
  2. 启用后,pod 会动态重新配置为合适的配置。当 container 重启时,pod 将继续正常执行。(默认值:true
  3. 启用后,pod 会在重新调度时被删除,之后将具有正确的配置。(默认值:false
  4. 启用后,pod 只会被标记为 cni.istio.io/uninitialized=true。用户需要手动采取措施来解决。(默认值:false
NOTE

配置优先级:repairPods > deletePods > labelPods。因此,将使用优先级更高的第一个 true 字段。

例如,要使 deletePods 生效,仅将 deletePods 设为 true 并不够,还需要将 repairPods 设为 false

另请参阅

Istio CNI 插件故障排查