系列目录html
在linux系统里,sysctls 接口容许管理员在运行时修改内核参数.参数存在于/proc/sys/
虚拟进程文件系统里.参数涉及到不少子模块,例如:linux
内核(kernel)(常见前缀kernel.
)api
网络(networking)(常见前缀net.
)安全
虚拟内存(virtual memory) (常见前缀 vm.
)bash
MDADM(常见前缀dev.
)cookie
sysctls分为安全和非安全的.除了合理地划分名称空间外一个安全的sysctl必须在同一个节点上的pod间是隔离的.这就意味着为一个pod设置安全的sysctl须要考虑如下:网络
必须不能影响同一节点上的其它podtcp
必须不能危害节点的健康性能
必须不能获取自身pod所限制之外的cpu或内存资源优化
截至目前,大部分名称空间下的sysctls都不被认为是安全的.如下列出被kubernetes安全支持:
kernel.shm_rmid_forced
net.ipv4.ip_local_port_range
net.ipv4.tcp_syncookies
若是往后kubelete支持更好的隔离机制,这份支持的安全列表将会扩展
全部安全sysctls默认被开启
全部的非安全sysctls默认被关闭,管理员必须手动在pod级别启动.包含非安全sysctls的pod仍然会被调度,可是将启动失败.
请牢记以上警告,集群管理员能够在特殊状况下,好比为了高性能或者时实应用系统优化,能够启动相应的sysctls.sysctl能够经过kubelet
在节点级别启动
即须要在想要开启sysctl的节点上手动启动.若是要在多个节点上启动则须要分别进入相应的节点进行设置.
kubelet --allowed-unsafe-sysctls \ 'kernel.msg*,net.ipv4.route.min_pmtu' ...
对于minikube,则能够经过extra-config
来配置
minikube start --extra-config="kubelet.allowed-unsafe-sysctls=kernel.msg*,net.ipv4.route.min_pmtu"...
仅有名称空间的sysctls能够经过这种方式开启
Sysctls
一系列的sysctls被划分在不一样的名称空间内.这意味着他们能够为节点上的pod单独地设置.仅有名称空间的sysctls能够经过pod的securityContext
被设置
如下列出的是已知的有名称空间的.在往后的linux内核版本中可能会改变
kernel.shm*,
kernel.msg*,
kernel.sem,
fs.mqueue.*,
net.*.
没有名称空间的systls被称做节点级别sysctls.若是你须要设置它们,你必须在每一个节点的操做系统上手动设置,或者经过有特权的DaemonSet来设置
使用pod的安全上下文(securityContext)来设置有名称空间的sysctls.安全上下文对pod内的全部容器都产生效果.
如下示例经过pod的安全上下文来设置一个安全的sysctl kernel.shm_rmid_forced
和两个非安全的sysctls net.ipv4.route.min_pmtu
以及kernel.msgmax
.在pod的spec里面,安全的sysctl和非安全的sysctl声明并无区别
在生产环境中,仅仅在你明白了要设置的sysctl的功能时候才进行设置,以避免形成系统不稳定.
apiVersion: v1 kind: Pod metadata: name: sysctl-example spec: securityContext: sysctls: - name: kernel.shm_rmid_forced value: "0" - name: net.ipv4.route.min_pmtu value: "552" - name: kernel.msgmax value: "65536" ...
因为非安全sysctls的非安全特征,设置非安全sysctls产生的后果将由你自行承担,可能产生的后果包含pod行为异常,资源紧张或者节点彻底崩溃
你能够经过设置pod安全策略里的forbiddenSysctls
(和)或者allowedUnsafeSysctls
来进一步控制哪些sysctls能够被设置.一个以*
结尾的sysctl,好比kernel.*
匹配其下面全部的sysctl
forbiddenSysctls
和allowedUnsafeSysctls
均是一系列的纯字符串sysctl名称或者sysctl模板(以*
结尾).*匹配全部的sysctl
forbiddenSysctls
将排除一系列sysctl.你能够排除一系列安全和非安全的sysctls.若是想要禁止设置任何sysctls,可使用*
若是你在allowedUnsafeSysctls
字段设置了非安全sysctls,而且没有出如今forbiddenSysctls
字段里,则使用了此pod安全策略的pods可使用这个(些)(sysctls).若是想启用全部的非安全sysctls,能够设置*
警告,若是你经过pod安全策略的
allowedUnsafeSysctls
把非安全sysctl添加到白名单(便可以执行),可是若是节点级别没有经过sysctl设置--allowed-unsafe-sysctls
,pod将启动失败.
如下示例容许以kernel.msg
开头的sysctls被设置,可是禁止设置kernel.shm_rmid_forced
apiVersion: policy/v1beta1 kind: PodSecurityPolicy metadata: name: sysctl-psp spec: allowedUnsafeSysctls: - kernel.msg* forbiddenSysctls: - kernel.shm_rmid_forced ...