網路外掛

Kubernetes(從版本 1.3 到最新的 1.34,並且可能在未來持續支援)允許你使用 容器網路介面 (CNI) 外掛來實現叢集網路。你必須使用與你的叢集相容並滿足你需求的 CNI 外掛。在更廣泛的 Kubernetes 生態系統中,有多種外掛可用(包括開源和閉源)。

CNI 外掛需要實現 Kubernetes 網路模型

你必須使用與 CNI 規範的 v0.4.0 或更高版本相容的 CNI 外掛。Kubernetes 專案建議使用與 v1.0.0 CNI 規範相容的外掛(外掛可以相容多個規範版本)。

安裝

在網路上下文中,容器執行時是節點上的一個守護程序,配置為向 kubelet 提供 CRI 服務。具體而言,容器執行時必須配置為載入實現 Kubernetes 網路模型所需的 CNI 外掛。

有關容器執行時如何管理 CNI 外掛的具體資訊,請參閱該容器執行時的文件,例如:

有關如何安裝和管理 CNI 外掛的具體資訊,請參閱該外掛或網路提供商的文件。

網路外掛要求

環回 CNI

除了為實現 Kubernetes 網路模型而安裝在節點上的 CNI 外掛外,Kubernetes 還要求容器執行時提供一個環回介面 lo,該介面用於每個沙箱(Pod 沙箱、VM 沙箱等)。實現環回介面可以透過重用 CNI 環回外掛來完成,或者透過開發你自己的程式碼來實現(參見 CRI-O 的此示例)。

支援 hostPort

CNI 網路外掛支援 hostPort。你可以使用 CNI 外掛團隊提供的官方 portmap 外掛,或者使用你自己的具有埠對映功能的外掛。

如果你想啟用 hostPort 支援,你必須在 cni-conf-dir 中指定 portMappings capability。例如:

{
  "name": "k8s-pod-network",
  "cniVersion": "0.4.0",
  "plugins": [
    {
      "type": "calico",
      "log_level": "info",
      "datastore_type": "kubernetes",
      "nodename": "127.0.0.1",
      "ipam": {
        "type": "host-local",
        "subnet": "usePodCidr"
      },
      "policy": {
        "type": "k8s"
      },
      "kubernetes": {
        "kubeconfig": "/etc/cni/net.d/calico-kubeconfig"
      }
    },
    {
      "type": "portmap",
      "capabilities": {"portMappings": true},
      "externalSetMarkChain": "KUBE-MARK-MASQ"
    }
  ]
}

支援流量整形

實驗性特性

CNI 網路外掛還支援 Pod 的入口和出口流量整形。你可以使用 CNI 外掛團隊提供的官方 bandwidth 外掛,或者使用你自己的具有頻寬控制功能的外掛。

如果你想啟用流量整形支援,你必須將 bandwidth 外掛新增到你的 CNI 配置檔案中(預設為 /etc/cni/net.d),並確保該二進位制檔案包含在你的 CNI bin 目錄中(預設為 /opt/cni/bin)。

{
  "name": "k8s-pod-network",
  "cniVersion": "0.4.0",
  "plugins": [
    {
      "type": "calico",
      "log_level": "info",
      "datastore_type": "kubernetes",
      "nodename": "127.0.0.1",
      "ipam": {
        "type": "host-local",
        "subnet": "usePodCidr"
      },
      "policy": {
        "type": "k8s"
      },
      "kubernetes": {
        "kubeconfig": "/etc/cni/net.d/calico-kubeconfig"
      }
    },
    {
      "type": "bandwidth",
      "capabilities": {"bandwidth": true}
    }
  ]
}

現在你可以為你的 Pod 新增 kubernetes.io/ingress-bandwidthkubernetes.io/egress-bandwidth 註解。例如:

apiVersion: v1
kind: Pod
metadata:
  annotations:
    kubernetes.io/ingress-bandwidth: 1M
    kubernetes.io/egress-bandwidth: 1M
...

下一步