服务网格ASM的最新版本支持Istio CNI插件,该插件不需要启用Istio-init容器的特权诉求,从而符合更高的安全要求。本文介绍如何启用CNI插件。

背景信息

为了使服务网格ASM正常工作,Istio需要在网格中的每个Pod中放置一个Envoy代理,通过iptables规则操纵Pod的流量,以便注入的Envoy代理将流量重定向到应用程序。因为每个Pod的iptables规则都是网络命名的,所以iptables规则更改不会影响节点上的其他Pod。

默认情况下,Istio在Pod中注入istio-init容器,并在Pod中的其他容器之前设置必要的iptables规则。这就要求网格中的用户或服务账户部署容器时具有足够的特权,从而可以部署具有NET_ADMIN功能的其他容器以及允许重新配置网络。而使用Istio CNI插件可以将iptables的规则配置移出Pod。启用CNI插件

Istio CNI插件提供了相同的功能,但不要求启用Priviledge权限。Istio CNI插件在Pod的网络设置阶段执行流量重定向,从而消除了对NET_ADMIN能力的依赖要求。Istio的CNI插件作为链式CNI插件运行,这意味着其配置将作为新的配置列表元素添加到现有CNI插件的配置中。

Istio CNI插件根据以下条件进行查找需要重定向流量的Pod:
  • Pod的命名空间不在配置的excludeNamespaces列表中。
  • Pod中包含一个名为istio-proxy的容器。
  • Pod中有多个容器。
  • Pod中没有KEY为sidecar.istio.io/inject的注解,或者注释sidecar.istio.io/inject的值不为true

启用CNI插件

  1. 登录ASM控制台
  2. CNI插件页面单击目标实例操作列的更新
  3. 更新面板选中开启,选择需要排除的命名空间,然后单击确定

查看iptables规则

  1. 部署Bookinfo示例,更多信息,请参见通过ASM管理VM非容器应用Bookinfo
  2. 获取Productpage Pod的容器ID。
    ns=default
    podname=productpage-v1-64794f5db4-qtt58
    container_id=$(kubectl get pod -n ${ns} ${podname} -o jsonpath="{.status.containerStatuses[?(@.name=='istio-proxy')].containerID}" | sed -n 's/docker:\/\/\(.*\)/\1/p')
    echo $container_id
  3. 进入运行Productpage Pod的节点之一,获取映射到Conatiner ID的对应进程。
    cpid=$(docker inspect --format '{{ .State.Pid }}' $container_id)
  4. 进入Productpage容器的命名空间。
    nsenter -t $cpid -n iptables -L -t nat -n -v --line-numbers -x
  5. 查看iptables规则。
    iptables -t nat -L -v