安装 Istio CNI 节点代理

Istio CNI 节点代理用于为网格中的 Pods 配置流量重定向。它作为 DaemonSet 在每个节点上以提升权限运行。Istio CNI 节点代理可以在两种 Istio 数据平面模式中使用。

在 Sidecar 数据平面模式下,Istio CNI 节点代理是可选的。它消除了在网格中的每个 Pod 内运行特权初始化容器的需求,以一个特权节点代理 Pod 替换该模型,该 Pod 在每个 Kubernetes 节点上运行。

在 Ambient 数据平面模式下,Istio CNI 节点代理是 强制性的

本文档专注于将 Istio CNI 节点代理作为 Sidecar 数据平面模式的可选部分使用。

TIP

如果您在 OpenShift 集群中创建服务网格,则默认启用 Istio CNI,因此您无需遵循本文档中的步骤。

环境要求

必须使用 Istio CNI 的环境

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

可以使用 Istio CNI 的环境

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

无法使用 Istio CNI 的环境

  • 禁用 Kubernetes CNI 支持的集群(仅限于 KIND 这样的开发环境)

安装 Istio CNI 节点代理

首先,照常安装服务网格。安装后,暂时不要添加任何服务(即,不要注入 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. istioCni 是安装 Istio CNI 节点代理所必需的。
  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
  • cni.values.provider 应设置为 multus
  1. 日志级别。(默认值:info
  2. CNI 二进制目录。(默认值:/opt/cni/bin
  3. CNI 配置目录。(默认值:/etc/cni/net.d
  4. 要插入 istioCni 插件配置的配置文件,默认情况下这是在 cniConfDir 中找到的第一个文件。
  5. 此目录必须在节点上存在;如果不存在,请参考您的容器运行时文档以获取适当的路径。(默认值:/var/run/netns,在 minikube/docker/其他环境中可以是 /var/run/docker/netns
  6. 将配置文件部署为插件链(值 true)或作为独立文件放置在配置目录中(值 false)。
  7. 自定义配置基于 CNI 提供者,可能的值包括:defaultmultus。(默认值为 default

验证

NOTE

确保所有 CNI 节点代理 Pods 处于运行状态,然后再进行下一步。

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

处理初始化容器注入

默认情况下,Istio 使用一个 webhook 来注入 istio-init 容器以实现透明流量拦截。为了使用 Istio CNI 代替 istio-init 容器,需要调整 ServiceMesh 资源,如下所示:

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

使用与验证

安装和配置完成后,使用正常的服务注入过程,无需任何额外更改。

安装并正确配置 Istio CNI 组件后,Pods 将发生以下更改:

  • 不再存在 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 初始化容器,该容器检测流量重定向是否正确设置,如果没有则阻止 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. 启用后,pods 会被动态重新配置以拥有适当的配置。容器重新启动时,pod 将继续正常执行。(默认值:true
  3. 启用后,pods 在重新调度时将被 删除 以获取正确的配置。(默认值:false
  4. 启用后,仅为 pods 添加标签 cni.istio.io/uninitialized=true。用户需要手动采取行动以解决问题。(默认值:false
NOTE

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

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

另见

故障排除 Istio CNI 插件