安装 Istio CNI
缺省情况下,Istio 会在网格中部署的 Pod 上注入一个初始化容器——。这个初始化容器会将 Pod 网络的流量劫持到 Istio Sidecar 上。这需要用户或者向网格中部署 Pod 的 Service Account 具有部署 NET_ADMIN
容器的授权。对 Istio 用户的这种授权需要,对于某些组织的安全政策来说,可能是无法接受的。Istio CNI()插件能够代替 istio-init
容器完成同样的网络功能,而且无需 Istio 用户额外申请 Kubernetes RBAC 授权。
Istio CNI 插件会在 Kubernetes Pod 生命周期的网络设置阶段完成 Istio 网格中的 Pod 流量转发设置工作,用户向网格中进行 Pod 部署时,不再有对 。
安装支持 CNI 的 Kubernetes 集群。并且
kubelet
使用—network-plugin=cni
参数启用 CNI插件。- AWS EKS、Azure AKS 以及 IBM Cloud IKS 集群具备这一功能。
- Google Cloud GKE 集群需要启用功能,让 Kubernetes 配置为
network-plugin=cni
。
Kubernetes 集群需要启用 ServiceAccount 准入控制器。
- Kubernetes 文档中强烈建议所有使用
ServiceAccount
的 Kubernetes 集群都应该启用该控制器。
- Kubernetes 文档中强烈建议所有使用
获取 Kubernetes 环境 CNI 插件
—cni-bin-dir
以及—cni-conf-dir
的设置。- 一节中的介绍了非缺省配置的介绍。
- 在使用 Helm 安装 Istio的过程中,加入
—set istio_cni.enabled=true
的设置,来启用 Istio CNI 插件的安装。例如:
可以在 中获取 istio-cni
的完整参数。
下面的例子中对 Istio CNI 插件进行配置,忽略 istio-system
、foo_ns
以及 bar_ns
命名空间中的 Pod:
- 创建一个 Istio 清单文件,其中启用了 Istio CNI 插件,并覆盖了
istio-cni
Helm Chart 的缺省配置中的logLevel
以及excludeNamespaces
参数:
Helm Chart 参数
GKE 配置
- 在 Helm 中使用如下参数安装 Istio
—set istio_cni.enabled=true —set istio-cni.cniBinDir=/home/kubernetes/bin
在 Helm 安装过程中需要用 istio_cni.enabled=true
生成 istio-sidecar-injector
Configmap,使用这一配置对 Kubernetes Pod 进行 Istio 注入才能够使用 Istio 的 CNI 插件。可参看 Istio Sidecar 注入文档,获取更多 Sidecar 注入方面的详细内容。
下列注入方式都是可以支持 Istio CNI 插件的:
- 。
使用
istio-sidecar-injector
Configmap 进行手工注入。- 执行
istioctl kube-inject
,直接使用 Configmap:
- 执行
- 从 Configmap 中获取配置文件,用于执行
istioctl kube-inject
:
Istio CNI 插件会监听 Kubernetes Pod 的创建和删除事件,并作出如下动作:
通过 Istio Sidecar 识别用户应用 Pod 的流量是否需要重定向。
对 Pod 网络命名空间进行配置,将流量转向 Istio Sidecar。
识别 Pod 是否需要流量重定向
- Pod 所在命名空间没有在 中列出。
- Pod 中有一个名为
istio-proxy
的容器。 - Pod 的注解中不包含
sidecar.istio.io/inject
,或者sidecar.istio.io/inject
注解的值为true
。
Istio CNI 插件会配置应用 Pod 的网络命名空间,把流量重定向给 Istio Sidecar 处理。下面的表格中描述了重定向功能的参数。可以通过同名的 Pod 注解来修改这些参数的缺省值。
日志
Istio CNI 插件在容器运行时的进程空间内运行,因此日志条目会加入到 kubelet
进程中。
Istio CNI 插件的兼容性和当前的 NET_ADMIN
istio-init
容器是一样的。
Istio CNI 插件作为一个链式 CNI 插件存在。也就是说它的配置会作为一个新的配置列表元素被加入到现存 CNI 插件配置中。CNI 规范参考中介绍了这方面的更多细节。当 Pod 被创建或删除时,容器运行时会按照列表顺序调用每个插件。Istio CNI 插件只会把应用 Pod 的流量重定向到 Sidecar 中(在 Pod 的网络命名空间中使用 iptables
完成)。