kubernetes高级之集群中使用sysctls
在linux系统里,sysctls 接口允许管理员在运行时修改内核参数.参数存在于/proc/sys/虚拟进程文件系统里.参数涉及到很多子模块,例如:
内核(kernel)(常见前缀
kernel.)网络(networking)(常见前缀
net.)虚拟内存(virtual memory) (常见前缀
vm.)MDADM(常见前缀
dev.)
启用非安全sysctls
sysctls分为安全和非安全的.除了合理地划分名称空间外一个安全的sysctl必须在同一个节点上的pod间是隔离的.这就意味着为一个pod设置安全的sysctl需要考虑以下:
必须不能影响同一节点上的其它pod
必须不能危害节点的健康
必须不能获取自身pod所限制以外的cpu或内存资源
截至目前,大部分名称空间下的sysctls都不被认为是安全的.以下列出被kubernetes安全支持:
kernel.shm_rmid_forcednet.ipv4.ip_local_port_rangenet.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可以通过这种方式开启
为pod设置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安全策略(PodSecurityPolicy)
你可以通过设置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
...
kubernetes高级之集群中使用sysctls的更多相关文章
- Docker Swarm和Kubernetes在大规模集群中的性能比较
Contents 这篇文章主要针对Docker Swarm和Kubernetes在大规模部署的条件下的3个问题展开讨论.在大规模部署下,它们的性能如何?它们是否可以被批量操作?需要采取何种措施来支持他 ...
- Kubernetes集群中Service的滚动更新
Kubernetes集群中Service的滚动更新 二月 9, 2017 0 条评论 在移动互联网时代,消费者的消费行为已经“全天候化”,为此,商家的业务系统也要保持7×24小时不间断地提供服务以满足 ...
- ingress-nginx 的使用 =》 部署在 Kubernetes 集群中的应用暴露给外部的用户使用
文章转载自:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247488189&idx=1&sn=8175f067 ...
- 在Kubernetes集群中使用calico做网络驱动的配置方法
参考calico官网:http://docs.projectcalico.org/v2.0/getting-started/kubernetes/installation/hosted/kubeadm ...
- 初试 Kubernetes 集群中使用 Traefik 反向代理
初试 Kubernetes 集群中使用 Traefik 反向代理 2017年11月17日 09:47:20 哎_小羊_168 阅读数:12308 版权声明:本文为博主原创文章,未经博主允许不得转 ...
- 在kubernetes集群中创建redis主从多实例
分类 > 正文 在kubernetes集群中创建redis主从多实例 redis-slave镜像制作 redis-master镜像制作 创建kube的配置文件yaml 继续使用上次实验环境 ht ...
- Kubernetes集群中修复状态为NotReady的节点
度个假回来发现自己集群中的节点都挂了,全部是NotReady状态 但是除了.10节点外,其他主机并没有挂,可以远程连接上, 那就考虑是kubernetes系统的问题 解决的方法是重启kube-prox ...
- 【转载】浅析从外部访问 Kubernetes 集群中应用的几种方式
一般情况下,Kubernetes 的 Cluster Network 是属于私有网络,只能在 Cluster Network 内部才能访问部署的应用.那么如何才能将 Kubernetes 集群中的应用 ...
- Kubernetes集群中Jmeter对公司演示的压力测试
6分钟阅读 背景 压力测试是评估Web应用程序性能的有效方法.此外,越来越多的Web应用程序被分解为几个微服务,每个微服务的性能可能会有所不同,因为有些是计算密集型的,而有些是IO密集型的. 基于微服 ...
随机推荐
- c++类型所占的字节和表示范围
一:数值类型的大杂烩 (1)short.int 和 long 类型都表示整型值.存储空间的大小不同 一般, short 类型为半个机器字长,int 类型为一个机器字长,而 long 类型为一个或两个机 ...
- jstl fn:replace替换换行符
textarea输入换行符后应该是'\n',在div中展示时替换成'<br>' 找到一种方法用jsp标签 jstl fn:replace方法 使用fn:replace方法之前 先要把jst ...
- yarn 查看任务信息
一.在命令行使用命令查看 (1)查看日志:yarn logs -applicationId application_1469094096026_26612 (2)查看状态:yarn applicait ...
- 批量删除Redis中的key
bin/redis-cli -h 192.168.46.151 -p 6379 keys "rulelist*" | xargs bin/redis-cli -h 192.168 ...
- 转: java语法与ide级入门介绍 from: IBM dev
点评: 讲的比较初级,但是有教你使用ide (Eclipse) frrom:http://www.ibm.com/developerworks/java/tutorials/j-introtojava ...
- javaweb项目自定义错误页面
当我们把一个web项目成功发布出去,但是有些页面还有待完善的时候,会出现404错误页面.这个会给用户很差的体验.如何将这些错误页面修改为自定义的错误页界面,给用户一些友好的提示呢? 首先我们在web. ...
- 关于websocket和ajax无刷新
HTTP无状态: Ajax只能实现用户和服务器单方面响应(单工机制). 如果设置为长轮询(ajax设置多少秒进行一次请求,时间间隙可能会有延迟,且浪费资源) 如果设置为长连接(客户端请求一次,服务器保 ...
- Django——Model的使用
Model使用 首先安装MySQL的python连接驱动,windows下安装可下下载,对应python-2.7: https://code.google.com/p/soemin/downloads ...
- C++ 智能指针详解(转)
C++ 智能指针详解 一.简介 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete.程序员忘记 delete,流程太复杂,最终导致没有 delete,异常 ...
- MySql 删除相同前缀的表名
SELECT CONCAT('drop table ', table_name, ';') FROM information_schema.tables WHERE table_name LIKE ' ...