虽然OpenShift中的容器/Pod通过IPv4协议传输数据,通常无需关心IPv6的设置,但有时我们希望只在容器内禁用IPv6,而不影响其他容器/Pod或主机系统。
下面是容器中输出的IPv6信息示例:
|
|
出于安全考虑,容器内无法通过 sysctl -w
修改内核参数。
|
|
因此,需要在DeploymentConfig中修改Kubernetes设置。Kubernetes通过sysctl设置允许用户在容器的命名空间内运行时修改部分内核参数。只有命名空间级别的sysctl可以在Pod内独立设置。 关于命名空间sysctl,详见这里。
操作步骤如下:
在
/etc/origin/node/node-config.yaml
的kubeletArguments字段中添加如下内容,启用Unsafe Sysctls。1 2 3
kubeletArguments: experimental-allowed-unsafe-sysctls: - net.ipv6.conf.all.disable_ipv6
重启node服务以应用更改:
1
systemctl restart atomic-openshift-node
编辑目标Pod的DeploymentConfig。
1
oc edit dc/<你的Pod的DeploymentConfig名称>
在template字段下的metadata中添加如下设置后保存退出(如无annotations字段请新建):
1 2 3 4 5 6
spec: .... template: metadata: annotations: security.alpha.kubernetes.io/unsafe-sysctls: net.ipv6.conf.all.disable_ipv6=1
用更新后的DeploymentConfig部署新容器/Pod。
1
oc deploy dc/<你的Pod的DeploymentConfig名称> --latest
Pod启动后,确认IPv6已被禁用。
1 2 3 4 5 6 7 8 9
[root@ocp37 ~]# oc exec django-ex-2-22znd -- ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 3: eth0@if41: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP link/ether 0a:58:0a:80:00:20 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 10.128.0.32/23 brd 10.128.1.255 scope global eth0 valid_lft forever preferred_lft forever