在 Linux 中,sysctl 允许管理员在运行时修改内核参数。您可以使用 tuning 容器网络接口 (CNI) 元插件修改接口级网络 sysctl。tuning CNI 元插件与主 CNI 插件一起工作,如下图所示。
主 CNI 插件分配接口并在运行时将此接口传递给 tuning CNI 元插件。您可以使用 tuning CNI 元插件更改一些 sysctl 和几个接口属性,例如混杂模式、全组播模式、MTU 和网络命名空间中的 MAC 地址。
以下步骤配置 tuning CNI 以更改接口级网络net.ipv4.conf.IFNAME.accept_redirects
sysctl。此示例启用接受和发送 ICMP 重定向数据包。在 tuning CNI 元插件配置中,接口名称由IFNAME
标记表示,并在运行时替换为接口的实际名称。
创建一个网络附件定义,例如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"
}
}
]
}'
运行以下命令应用 YAML:
$ oc apply -f tuning-example.yaml
networkattachmentdefinition.k8.cni.cncf.io/tuningnad created
创建一个 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 配置文件。 |
运行以下命令应用 yaml:
$ oc apply -f examplepod.yaml
运行以下命令验证 pod 是否已创建:
$ oc get pod
NAME READY STATUS RESTARTS AGE
tunepod 1/1 Running 0 47s
运行以下命令登录到 pod:
$ oc rsh tunepod
验证已配置 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-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
}
]
}'
运行以下命令应用 YAML 文件中指定的设置:
$ oc apply -f tuning-allmulti.yaml
networkattachmentdefinition.k8s.cni.cncf.io/setallmulti created
使用类似于以下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 内核的一项功能,它限制了可用于进程的系统调用,通过最大限度地减少攻击面来增强安全性。 |
运行以下命令应用 YAML 文件中指定的设置:
$ oc apply -f examplepod.yaml
运行以下命令验证 pod 是否已创建:
$ oc get pod
NAME READY STATUS RESTARTS AGE
allmultipod 1/1 Running 0 23s
运行以下命令登录到 pod:
$ oc rsh allmultipod
运行以下命令列出与 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 标志) 的网络附件定义配置的辅助接口 |