kubernetes使用securityContext和sysctl
在运行一个容器时,有时候需要使用sysctl
修改内核参数,比如net.
、vm.
、kernel
等,sysctl
需要容器拥有超级权限,容器启动时加上--privileged
参数即可。那么,在kubernetes中是如何使用的呢?
Security Context
kubernetes中有个字段叫securityContext
,即安全上下文
,它用于定义Pod或Container的权限和访问控制设置。其设置包括:
- Discretionary Access Control: 根据用户ID(UID)和组ID(GID)来限制其访问资源(如:文件)的权限
针对pod设置:
-
apiVersion: v1
-
kind: Pod
-
metadata:
-
name: security-context-demo
-
spec:
-
securityContext:
-
runAsUser: 1000
-
fsGroup: 2000
-
volumes:
-
- name: sec-ctx-vol
-
emptyDir: {}
-
containers:
-
- name: sec-ctx-demo
-
image: gcr.io/google-samples/node-hello:1.0
-
volumeMounts:
-
- name: sec-ctx-vol
-
mountPath: /data/demo
-
securityContext:
-
allowPrivilegeEscalation: false
针对container设置:
-
apiVersion: v1
-
kind: Pod
-
metadata:
-
name: security-context-demo-2
-
spec:
-
securityContext:
-
runAsUser: 1000
-
containers:
-
- name: sec-ctx-demo-2
-
image: gcr.io/google-samples/node-hello:1.0
-
securityContext:
-
runAsUser: 2000
-
allowPrivilegeEscalation: false
- Security Enhanced Linux (SELinux): 给容器指定SELinux labels
-
...
-
securityContext:
-
seLinuxOptions:
-
level: "s0:c123,c456"
- Running as privileged or unprivileged:以
privileged
或unprivileged
权限运行
-
apiVersion: v1
-
kind: Pod
-
metadata:
-
name: security-context-demo-4
-
spec:
-
containers:
-
- name: sec-ctx-4
-
image: gcr.io/google-samples/node-hello:1.0
-
securityContext:
-
privileged: true
- Linux Capabilities: 给某个特定的进程privileged权限,而不用给root用户所有的
privileged
权限
-
apiVersion: v1
-
kind: Pod
-
metadata:
-
name: security-context-demo-4
-
spec:
-
containers:
-
- name: sec-ctx-4
-
image: gcr.io/google-samples/node-hello:1.0
-
securityContext:
-
capabilities:
-
add: ["NET_ADMIN", "SYS_TIME"]
-
AppArmor: 使用程序文件来限制单个程序的权限
-
Seccomp: 限制一个进程访问文件描述符的权限
-
AllowPrivilegeEscalation: 控制一个进程是否能比其父进程获取更多的权限,
AllowPrivilegeEscalation
的值是bool值,如果一个容器以privileged权限运行或具有CAP_SYS_ADMIN
权限,则AllowPrivilegeEscalation
的值将总是true。
-
apiVersion: v1
-
kind: Pod
-
metadata:
-
name: security-context-demo-2
-
spec:
-
securityContext:
-
runAsUser: 1000
-
containers:
-
- name: sec-ctx-demo-2
-
image: gcr.io/google-samples/node-hello:1.0
-
securityContext:
-
runAsUser: 2000
-
allowPrivilegeEscalation: false
注意:要开启容器的privileged权限,需要提前在kube-apiserver
和kubelet
启动时添加参数--allow-privileged=true
,默认已添加。
使用sysctl
sysctl -a
可以获取sysctl所有参数列表。
从v1.4开始,kubernetes将sysctl分为safe
和unsafe
,其对safe的sysctl定义如下:
- 不会影响该节点的其他pod
- 不会影响节点的正常运行
- 不会获取超出
resource limits
范围的CPU和内存资源
目前属于safe sysctl
的有:
- kernel.shm_rmid_forced
- net.ipv4.ip_local_port_range
- net.ipv4.tcp_syncookies
其余的都是unsafe sysctl
,当kubelet支持更好的隔离机制时,safe sysctl
列表将在未来的Kubernetes版本中扩展。
使用safe sysctl
例子:
-
apiVersion: v1
-
kind: Pod
-
metadata:
-
name: sysctl-example
-
annotations:
-
security.alpha.kubernetes.io/sysctls: kernel.shm_rmid_forced=1
-
spec:
-
...
而使用unsafe sysctl
时,需要在kubelet的启动参数中指定--experimental-allowed-unsafe-sysctls
,如--experimental-allowed-unsafe-sysctls=net.core.somaxconn
,具体操作如下:
编辑kubelet配置文件,修改ExecStart=/usr/bin/kubelet
那一行,在后面加上--experimental-allowed-unsafe-sysctls=net.core.somaxconn
,如:
ExecStart=/usr/bin/kubelet --experimental-allowed-unsafe-sysctls=net.core.somaxconn
因为我是用kubeadm安装的kubernetes,所以在/etc/systemd/system/kubelet.service.d/10-kubeadm.conf
文件中加了倒数第3行内容:
-
[Service]
-
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
-
Environment="KUBELET_SYSTEM_PODS_ARGS=--pod-manifest-path=/etc/kubernetes/manifests --allow-privileged=true"
-
Environment="KUBELET_NETWORK_ARGS=--network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin"
-
Environment="KUBELET_DNS_ARGS=--cluster-dns=10.96.0.10 --cluster-domain=cluster.local"
-
Environment="KUBELET_AUTHZ_ARGS=--authorization-mode=Webhook --client-ca-file=/etc/kubernetes/pki/ca.crt"
-
Environment="KUBELET_CADVISOR_ARGS=--cadvisor-port=0"
-
Environment="KUBELET_CGROUP_ARGS=--cgroup-driver=systemd"
-
Environment="KUBELET_CERTIFICATE_ARGS=--rotate-certificates=true --cert-dir=/var/lib/kubelet/pki"
-
Environment="KUBELET_EXTRA_ARGS=--experimental-allowed-unsafe-sysctls=net.core.somaxconn"
-
ExecStart=
-
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_SYSTEM_PODS_ARGS $KUBELET_NETWORK_ARGS $KUBELET_DNS_ARGS $KUBELET_AUTHZ_ARGS $KUBELET_CADVISOR_ARGS $KUBELET_CGROUP_ARGS $KUBELET_CERTIFICATE_ARGS $KUBELET_EXTRA_ARGS
重启kubelet:
-
systemctl daemon-reload
-
systemctl restart kubelet
在Pod中使用unsafe sysctl
,开启privileged权限:
-
apiVersion: v1
-
kind: Pod
-
metadata:
-
name: sysctl-example
-
annotations:
-
security.alpha.kubernetes.io/unsafe-sysctls: net.core.somaxconn=65535 #使用unsafe sysctl,设置最大连接数
-
spec:
-
securityContext:
-
privileged: true #开启privileged权限
-
...
总结
线上环境请谨慎使用privileged
权限,使用不慎可能导致整个容器崩掉,相关信息可自行查阅。
参考:
https://kubernetes.io/docs/concepts/cluster-administration/sysctl-cluster/
https://kubernetes.io/docs/tasks/configure-pod-container/security-context/
转载于:https://www.cnblogs.com/sunsky303/p/11090540.html
原文地址:https://www.cnblogs.com/cheyunhua/p/15243214.html
- SNV突变(96种)频谱的制作
- Golang语言社区--go语言执行cmd命令关机、重启等
- 【直播】我的基因组 45:SNV突变(6种)频谱的制作
- 【直播】我的基因组 44:比对文件画profile和heatmap图
- 做过1000遍RNA-seq的老司机告诉你如何翻车
- 【直播】我的基因组 43:简单粗糙的WGS数据分析流程
- 用谷歌搜索来使用ggplot2做可视化(下)
- 如何通过Google来使用ggplot2可视化
- 【直播】我的基因组54:把我的variation跟dbSNP数据库相比较
- 【翻译】MongoDB指南/引言
- TensorFlow从0到1 | 第十二章:TensorFlow构建3层NN玩转MNIST
- 如何通过预加载器提升网页加载速度
- 分钟学会正则表达式(译)
- TensorFlow从0到1 | 第十一章 74行Python实现手写体数字识别
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- CodeReview实践-Gerrit自动触发JenkinsCI
- OpenCV常用图像拼接方法(一) :直接拼接
- ClickHouse|MergeTree引擎之数据分区
- OpenCV常用图像拼接方法(二) :基于模板匹配拼接
- 为了解决 Prometheus 大内存问题,我竟然强行将 Prometheus Operator 给肢解了。。
- 面试官:webpack原理都不会?
- 算法篇:树之对称二叉树
- 算法篇:树之二叉树的恢复
- 算法篇:树之利用数组处理链表
- 灰子的Go笔记:sync.Map
- 最炫酷的 Kubernetes Dashboard:Octant 迎来重大更新!
- 算法篇:树之树的层次遍历
- mybatis-plus:性能分析插件与性能分析打印
- 《RabbitMQ》什么是死信队列
- redis:切片