網路外掛程式

Kubernetes (版本 1.3 至最新的 1.32,以及可能更後續的版本) 讓您可以使用 容器網路介面 (CNI) 外掛程式進行叢集網路。您必須使用與您的叢集相容且符合您需求的 CNI 外掛程式。更廣泛的 Kubernetes 生態系統中提供了不同的外掛程式 (開放原始碼與封閉原始碼皆有)。

需要 CNI 外掛程式來實作 Kubernetes 網路模型

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

安裝

在網路環境中,容器執行期是節點上的守護程序,設定為為 kubelet 提供 CRI 服務。特別是,容器執行期必須設定為載入實作 Kubernetes 網路模型所需的 CNI 外掛程式。

如需關於容器執行期如何管理 CNI 外掛程式的特定資訊,請參閱該容器執行期的文件,例如

如需關於如何安裝與管理 CNI 外掛程式的特定資訊,請參閱該外掛程式或 網路提供者的文件。

網路外掛程式需求

Loopback CNI

除了節點上安裝用於實作 Kubernetes 網路模型的 CNI 外掛程式之外,Kubernetes 也要求容器執行期提供迴路介面 lo,用於每個沙箱 (pod 沙箱、vm 沙箱等等)。實作迴路介面可以透過重複使用 CNI 迴路外掛程式或開發您自己的程式碼來達成 (請參閱 CRI-O 中的此範例)。

支援 hostPort

CNI 網路外掛程式支援 hostPort 功能。您可以使用由 CNI 外掛程式團隊提供的官方 portmap 外掛程式,或者使用您自己的具有 portMapping 功能的外掛程式。

如果您想要啟用 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 控制功能的外掛程式。

如果您想要啟用流量塑形支援,您必須將 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}
    }
  ]
}

現在您可以將 kubernetes.io/ingress-bandwidthkubernetes.io/egress-bandwidth 註解新增到您的 Pod。例如

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

接下來呢