16

使用CNI插件增强Istio服务网格安全性

 3 years ago
source link: https://zhuanlan.zhihu.com/p/315478969
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

为了使服务网格正常工作,Istio需要在网格中的每个Pod中注入一个Envoy代理,然后必须通过iptables规则操纵Pod的流量,从而应用程序进出站的流量劫持到Envoy代理。由于每个Pod的iptables规则都是网络命名空间级别的,因此更改不会影响节点上的其他Pod。

默认情况下,Istio使用名为 istio-init 的initContainer来创建必要的iptables规则,然后再启动Pod中的其他容器。这就要求网格中的Pod具足够的部署 NET_ADMIN容器的 Kubernetes RBAC 权限。NET_ADMIN capabilities 是允许重新配置网络的内核功能。

VV7vqyQ.jpg!mobile

通常,我们要避免为应用程序Pod提供此 capabilities,因为Istio 用户权限的提升,对于某些组织的安全政策来说,可能是难以接受的。

解决此问题的一种方法是使用CNI插件将iptables的规则配置从pod中移除。

CNI插件

CNI,它的全称是 Container Network Interface,即容器网络的 API 接口。

Istio CNI 插件会在 Kubernetes pod 生命周期的网络设置阶段完成 Istio 网格的 pod 流量转发设置工作,因此用户在部署 pods 到 Istio 网格中时,不再需要配置 NET_ADMIN capabilities了。 Istio CNI 插件代替了 istio-init 容器所实现的功能。

rIBfIvV.jpg!mobile

前提条件

  1. 安装支持 CNI 的 Kubernetes 集群,并且 kubelet 使用 --network-plugin=cni 参数启用 CNI 插件。
network-plugin=cni
Kubernetes 需要启用 ServiceAccount 准入控制器
  • Kubernetes 文档中强烈建议所有使用 ServiceAccounts 的 Kubernetes 安装实例都启用该控制器。

安装

  1. 确认 Kubernetes 环境的 CNI 插件的 --cni-bin-dir--cni-conf-dir 设置。 任何非默认设置都需要参考托管 Kubernetes 设置。
  2. 使用 istioctl 安装 Istio CNI 和 Istio。 参考Istio 安装的说明,并设置 --set components.cni.enabled=true--set cni.components.cni.enabled=true 选项。 在上一步中,如果 istio-cni 不是按照默认设置安装的,还需要设置 --set values.cni.cniBinDir=...--set values.cni.cniConfDir=... 选项。

需要流量重定向的Pod

Istio CNI插件通过根据以下条件列表进行检查来查找需要重定向流量的Pod:

  • 该pod不在配置的excludeNamespaces列表中的命名空间中
  • 该pod 包含一个名为 istio-proxy 的容器
  • 该pod 中有多个容器
  • 该pod 无 sidecar.istio.io/inject 注解或该注解值为 true

Istio的CNI插件可作为CNI插件链运行。这意味着其配置将作为新的配置列表元素添加到现有CNI插件的配置中。有关更多详细信息,请参见 CNI的规范

其他

Istio CNI 插件在容器运行时的进程空间内运行。因此 kubelet 进程会将插件的日志记到它的日志中。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK