CNI 插件

CNI 插件

Linkerd数据平面的工作原理是透明地将所有 TCP 流量路由到每个网格化 Pod和从每个 网格化 Pod 到其代理。(请参阅架构文档。)这允许 Linkerd 在应用程序不知情的情况下进行操作。

默认情况下,此重新路由是使用 Init Container 完成的,该容器在 pod 启动时使用 iptablespod 安装路由规则。但是,这需要 CAP_NET_ADMIN 功能;并且在某些集群中,此功能未授予 pod

为了解决这个问题,Linkerd 可以选择在 CNI 插件中而不是在 Init Container 中运行这些 iptables 规则。这避免了对 CAP_NET_ADMIN 功能的需要。

LinkerdCNI 插件旨在与您现有的 CNI 插件一起运行,使用 CNI chaining
它仅处理特定于 Linkerd 的配置,并不会取代对 CNI 插件的需求。

安装

使用 Linkerd CNI 插件需要先在集群上成功安装 linkerd-cni DaemonSet,然后再安装 Linkerd 控制平面

使用 CLI

要安装 linkerd-cni DaemonSet,请运行:

linkerd install-cni | kubectl apply -f -

一旦 DaemonSet 启动并运行,网格化的 pod 不应再使用 linkerd-init Init Container。为此,请在安装控制平面时使用 --linkerd-cni-enabled 标志:

linkerd install --linkerd-cni-enabled | kubectl apply -f -

使用此选项将在 linkerd-config ConfigMap 中设置一个 cniEnabled 标志。代理注入将读取此字段并省略 linkerd-init 初始化容器。

使用 Helm

首先确保您的 Helm 本地缓存已更新:

helm repo update
helm search linkerd2-cni

安装 CNI DaemonSet:

# install the CNI plugin first
helm install linkerd2-cni linkerd2/linkerd2-cni

# ensure the plugin is installed and ready
linkerd check --pre --linkerd-cni-enabled

对于低于 v3Helm 版本,必须专门传递 --name 标志。在 Helm v3 中,它已被弃用,并且是上面指定的第一个参数。

此时,您已准备好在启用 CNI 的情况下安装 Linkerd。按照使用 Helm 安装 Linkerd说明进行操作。

附加配置

linkerd install-cni 命令包括可用于自定义安装的附加标志。有关更多信息,请参阅 linkerd install-cni --help。请注意,许多标志类似于运行 linkerd inject 时可用于配置代理的标志。如果您在运行 linkerd install-cni 时更改了默认值,则需要确保在运行 linkerd inject 时进行相应的更改。

最重要的标志是:

  1. --dest-cni-net-dir: 这是 CNI 配置所在节点上的目录。默认为:/etc/cni/net.d
  2. --dest-cni-bin-dir: 这是 CNI 插件二进制文件所在节点上的目录。它默认为:/opt/cni/bin
  3. --cni-log-level: 将此设置为 debug 将允许更详细的日志记录。为了查看 CNI 插件日志,您必须能够看到 kubelet 日志。一种方法是登录节点并使用 journalctl -t kubelet。字符串 linkerd-cni: 可以用作搜索来查找插件日志输出。

升级 CNI 插件

由于 CNI 插件基本上是无状态的,因此不需要单独的 upgrade 命令。如果您使用 CLI 升级 CNI 插件,您可以执行以下操作:

linkerd install-cni | kubectl apply --prune -l linkerd.io/cni-resource=true -f -