×

在 Linux 中,sysctl 允许管理员在运行时修改内核参数。您可以使用 tuning 容器网络接口 (CNI) 元插件修改接口级网络 sysctl。tuning CNI 元插件与主 CNI 插件一起工作,如下图所示。

CNI plugin

主 CNI 插件分配接口并在运行时将此接口传递给 tuning CNI 元插件。您可以使用 tuning CNI 元插件更改一些 sysctl 和几个接口属性,例如混杂模式、全组播模式、MTU 和网络命名空间中的 MAC 地址。

使用 tuning CNI 配置系统控制

以下步骤配置 tuning CNI 以更改接口级网络net.ipv4.conf.IFNAME.accept_redirects sysctl。此示例启用接受和发送 ICMP 重定向数据包。在 tuning CNI 元插件配置中,接口名称由IFNAME标记表示,并在运行时替换为接口的实际名称。

步骤
  1. 创建一个网络附件定义,例如tuning-example.yaml,内容如下:

    apiVersion: "k8s.cni.cncf.io/v1"
    kind: NetworkAttachmentDefinition
    metadata:
      name: <name> (1)
      namespace: default (2)
    spec:
      config: '{
        "cniVersion": "0.4.0", (3)
        "name": "<name>", (4)
        "plugins": [{
           "type": "<main_CNI_plugin>" (5)
          },
          {
           "type": "tuning", (6)
           "sysctl": {
                "net.ipv4.conf.IFNAME.accept_redirects": "1" (7)
            }
          }
         ]
    }
    1 指定要创建的附加网络附件的名称。此名称在指定的命名空间内必须唯一。
    2 指定对象关联的命名空间。
    3 指定 CNI 规范版本。
    4 指定配置的名称。建议将配置名称与网络附件定义的 name 值匹配。
    5 指定要配置的主 CNI 插件的名称。
    6 指定 CNI 元插件的名称。
    7 指定要设置的 sysctl。接口名称由IFNAME标记表示,并在运行时替换为接口的实际名称。

    此处显示一个示例 YAML 文件

    apiVersion: "k8s.cni.cncf.io/v1"
    kind: NetworkAttachmentDefinition
    metadata:
      name: tuningnad
      namespace: default
    spec:
      config: '{
        "cniVersion": "0.4.0",
        "name": "tuningnad",
        "plugins": [{
          "type": "bridge"
          },
          {
          "type": "tuning",
          "sysctl": {
             "net.ipv4.conf.IFNAME.accept_redirects": "1"
            }
        }
      ]
    }'
  2. 运行以下命令应用 YAML:

    $ oc apply -f tuning-example.yaml
    示例输出
    networkattachmentdefinition.k8.cni.cncf.io/tuningnad created
  3. 创建一个 pod,例如examplepod.yaml,其网络附件定义类似于以下内容:

    apiVersion: v1
    kind: Pod
    metadata:
      name: tunepod
      namespace: default
      annotations:
        k8s.v1.cni.cncf.io/networks: tuningnad (1)
    spec:
      containers:
      - name: podexample
        image: centos
        command: ["/bin/bash", "-c", "sleep INF"]
        securityContext:
          runAsUser: 2000 (2)
          runAsGroup: 3000 (3)
          allowPrivilegeEscalation: false (4)
          capabilities: (5)
            drop: ["ALL"]
      securityContext:
        runAsNonRoot: true (6)
        seccompProfile: (7)
          type: RuntimeDefault
    1 指定已配置的NetworkAttachmentDefinition的名称。
    2 runAsUser控制容器运行的用户 ID。
    3 runAsGroup控制容器运行的主要组 ID。
    4 allowPrivilegeEscalation确定 pod 是否可以请求允许权限提升。如果未指定,则默认为 true。此布尔值直接控制容器进程上是否设置no_new_privs标志。
    5 capabilities允许特权操作,而无需完全 root 访问权限。此策略确保 pod 中的所有功能都被删除。
    6 runAsNonRoot: true要求容器将以任何 UID(而不是 0)的用户身份运行。
    7 RuntimeDefault为 pod 或容器工作负载启用默认 seccomp 配置文件。
  4. 运行以下命令应用 yaml:

    $ oc apply -f examplepod.yaml
  5. 运行以下命令验证 pod 是否已创建:

    $ oc get pod
    示例输出
    NAME      READY   STATUS    RESTARTS   AGE
    tunepod   1/1     Running   0          47s
  6. 运行以下命令登录到 pod:

    $ oc rsh tunepod
  7. 验证已配置 sysctl 标志的值。例如,通过运行以下命令查找值net.ipv4.conf.net1.accept_redirects

    sh-4.4# sysctl net.ipv4.conf.net1.accept_redirects
    预期输出
    net.ipv4.conf.net1.accept_redirects = 1

使用 tuning CNI 启用全组播模式

您可以使用 tuning 容器网络接口 (CNI) 元插件启用全组播模式。

以下步骤描述如何配置 tuning CNI 以启用全组播模式。

步骤
  1. 创建一个网络附件定义,例如tuning-example.yaml,内容如下:

    apiVersion: "k8s.cni.cncf.io/v1"
    kind: NetworkAttachmentDefinition
    metadata:
      name: <name> (1)
      namespace: default (2)
    spec:
      config: '{
        "cniVersion": "0.4.0", (3)
        "name": "<name>", (4)
        "plugins": [{
           "type": "<main_CNI_plugin>" (5)
          },
          {
           "type": "tuning", (6)
           "allmulti": true (7)
            }
          }
         ]
    }
    1 指定要创建的附加网络附件的名称。此名称在指定的命名空间内必须唯一。
    2 指定对象关联的命名空间。
    3 指定 CNI 规范版本。
    4 指定配置的名称。将配置名称与网络附件定义的 name 值匹配。
    5 指定要配置的主 CNI 插件的名称。
    6 指定 CNI 元插件的名称。
    7 更改接口的全组播模式。如果启用,网络上的所有组播数据包都将由接口接收。

    此处显示一个示例 YAML 文件

    apiVersion: "k8s.cni.cncf.io/v1"
    kind: NetworkAttachmentDefinition
    metadata:
      name: setallmulti
      namespace: default
    spec:
      config: '{
        "cniVersion": "0.4.0",
        "name": "setallmulti",
        "plugins": [
          {
            "type": "bridge"
          },
          {
            "type": "tuning",
            "allmulti": true
          }
        ]
      }'
  2. 运行以下命令应用 YAML 文件中指定的设置:

    $ oc apply -f tuning-allmulti.yaml
    示例输出
    networkattachmentdefinition.k8s.cni.cncf.io/setallmulti created
  3. 使用类似于以下examplepod.yaml示例文件中指定的网络附件定义创建 pod:

    apiVersion: v1
    kind: Pod
    metadata:
      name: allmultipod
      namespace: default
      annotations:
        k8s.v1.cni.cncf.io/networks: setallmulti (1)
    spec:
      containers:
      - name: podexample
        image: centos
        command: ["/bin/bash", "-c", "sleep INF"]
        securityContext:
          runAsUser: 2000 (2)
          runAsGroup: 3000 (3)
          allowPrivilegeEscalation: false (4)
          capabilities: (5)
            drop: ["ALL"]
      securityContext:
        runAsNonRoot: true (6)
        seccompProfile: (7)
          type: RuntimeDefault
    1 指定已配置的NetworkAttachmentDefinition的名称。
    2 指定容器运行的用户 ID。
    3 指定容器运行的主要组 ID。
    4 指定 pod 是否可以请求权限提升。如果未指定,则默认为true。此布尔值直接控制容器进程上是否设置no_new_privs标志。
    5 指定容器功能。drop: ["ALL"]语句表示 pod 中的所有 Linux 功能都被删除,从而提供更严格的安全配置文件。
    6 指定容器将以任何 UID(而不是 0)的用户身份运行。
    7 指定容器的 seccomp 配置文件。在本例中,类型设置为RuntimeDefault。Seccomp 是 Linux 内核的一项功能,它限制了可用于进程的系统调用,通过最大限度地减少攻击面来增强安全性。
  4. 运行以下命令应用 YAML 文件中指定的设置:

    $ oc apply -f examplepod.yaml
  5. 运行以下命令验证 pod 是否已创建:

    $ oc get pod
    示例输出
    NAME          READY   STATUS    RESTARTS   AGE
    allmultipod   1/1     Running   0          23s
  6. 运行以下命令登录到 pod:

    $ oc rsh allmultipod
  7. 运行以下命令列出与 pod 关联的所有接口:

    sh-4.4# ip link
    示例输出
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    2: eth0@if22: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8901 qdisc noqueue state UP mode DEFAULT group default
        link/ether 0a:58:0a:83:00:10 brd ff:ff:ff:ff:ff:ff link-netnsid 0 (1)
    3: net1@if24: <BROADCAST,MULTICAST,ALLMULTI,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default
        link/ether ee:9b:66:a4:ec:1d brd ff:ff:ff:ff:ff:ff link-netnsid 0 (2)
    
    1 eth0@if22是主接口
    2 net1@if24是使用支持全组播模式 (ALLMULTI 标志) 的网络附件定义配置的辅助接口