kubernetes中pod的隔离策略
配置容器级别的安全控制
使用宿主机的网络模式
可以通过设置pod的spec的hostNetwork参数为true开启容器的“host”network模式
spec:
hostNetwork: true
containers:
- name: name
image: Enter containers image
绑定宿主机的端口
这种方式不需要创建service来做port映射,相当于docker中的-p映射端口的操作
spec:
containers:
- name: name
image: Enter containers image
ports:
# 容器内部的端口
- containerPort: 8080
# 映射在宿主机上的端口
hostPort: 9000
protocol: TCP
使用宿主机的PID和IPC命名空间
通过开启pod的spec.hostPID使用宿主机的pid,同样通过开始hostIPC使用宿主机的ipc
spec:
hostPID: true
hostIPC: true
containers:
- name: name
image: Enter containers image
将hostPID设置为true,pod内就可以看到宿主机上的所有进程pid,同时自己的进程也会有宿主机管理。
将hostIPC设置为true,pod中的进程就可以与宿主机上的其他所有进程进行通信。
配置pod的安全上下文
针对于container级别的控制
指定运行容器的用户
spec:
containers:
- name: name
image: Enter containers image
securityContext:
# 405为容器中用户的id,这里仅可以通过id指定运行容器的用户
runAsUser: 405
阻止容器以root用户运行
有的应用在容器中设置了运行用户,然后可能会有黑客上传一个以root用户运行的镜像到我们的镜像仓库。然后在容器中利用root用户
的权限,这样是很危险的,所以我们可以禁用容器中的root用户,让他不能以root用户启动容器
spec:
containers:
- name: name
image: Enter containers image
securityContext:
runAsNonRoot: true
使用特权模式启动容器
使容器具有宿主机上的所有操作权限,这样容器中就可以使用宿主机上的设备了
spec:
containers:
- name: name
image: Enter containers image
securityContext:
privileged: true
为容器添加linux内核的功能
使用特权模式启动的容器被赋予了过大的权限,我们可以根据需求给予容器所需的linux内核的能力。
spec:
containers:
- name: name
image: Enter containers image
securityContext:
# 通过capabilities开启或者禁用linux的内核功能
capabilities:
# 授予容器能力
add:
- SYS_TIME
# 禁用容器能力
drop:
- CHOWN
注意:在linux中内核功能通常以CAP_开头,这里需要省略掉
阻止容器对根目录的写入
spec:
containers:
- name: test-container
image: test-container
imagePullPolicy: IfNotPresent
securityContext:
# 这个容器的根目录不允许写入操作
readOnlyRootFilesystem: true
volumeMounts:
# 但是允许向volume目录写入,这个目录是一个挂载卷
- mountPath: /volume
name: test-volume
readOnly: false
volumes:
- name: test-volume
emptyDir: {}
问题:如果不采用挂载的方式,可否将一个目录释放出来允许写入呢?
pod级别的安全上下文
容器使用不同用户运行时共享存储卷
当一个pod中的两个容器都使用root用户运行时,他们之前可以互相读取对方的挂载卷。但是,当我们为每个容器配置其他的启动用户时,
可以会出现一些访问权限的问题。
在kubernetes中,可以为pod中的容器指定一个supplemental组,以允许他们无论通过哪个用户启动容器都可以共享文件。
spec:
securityContext:
# 用户组id设置为555,则创建存储卷时存储卷属于用户ID为555的用户组
fsGroup: 555
# 定义了某个用户所关联的额外的用户组
supplementalGroups:
- 666
- 777
containers:
- name: test-A
image: test-container
imagePullPolicy: IfNotPresent
securityContext:
runAsUser: 01
volumeMounts:
- mountPath: /volume
name: test-volume
readOnly: false
- name: test-B
image: test-container
imagePullPolicy: IfNotPresent
securityContext:
runAsUser: 02
volumeMounts:
- mountPath: /volume
name: test-volume
readOnly: false
volumes:
- name: test-volume
emptyDir: {}
在pod级别指定fsGroup与supplementalGroups属性,然后分别指定两个容器的启动用户为01、02。然后在启动容器,在容器中执行id命令
可以查看容器的用户和用户组,然后就可以看到两个容器虽然用户不同,但是都属于“555、666、777”这三个组中。
统一限制pod的安全相关特性 PodSecurityPolicy
PodSecurityPolicy在kubernetes中简称为psp,主要定义了用户能否在pod中使用各种安全相关的特性。
当有人调用api server创建pod时,PodSecurityPolicy会拿到这个pod的信息与自己个规则做比较。如果符合规则,就运行其存入etcd;否则会被拒绝。
因为是在创建pod时校验的,所以修改psp,不会对已创建的pod采取措施。也可以设置默认值,就是用psp中配置的默认值替换掉pod中的值。
主要提供了以下能力:
- 是否允许pod使用宿主节点的PID、IPC、网络命名空间
- pod允许绑定的宿主节点端口
- 容器运行时允许使用的用户ID
- 是否允许拥有特权模式容器的pod
- 允许添加哪些内核功能, 默认添加哪些内核功能, 总是禁用哪些内核功能
- 允许容器使用哪些 SELinux 选项
- 容器是否允许使用可写的根文件系统
- 允许容器在哪些文件系统组下运行
- 允许pod使用哪些类型的存储卷
以下为demo:
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: exporter-node-cluster-monitoring
spec:
allowPrivilegeEscalation: false
# 强制使用只读的根文件系统
readOnlyRootFilesystem: true
# 不允许使用特权方式运行容器
privileged: false
allowedHostPaths:
- pathPrefix: /
readOnly: true
# 指定容器可以使用的用户组id范围
fsGroup:
ranges:
- max: 65535
min: 1
rule: MustRunAs
supplementalGroups:
ranges:
- max: 65535
min: 1
rule: MustRunAs
# 允许使用宿主机的网络命名空间
hostNetwork: true
# 允许使用宿主机的PID
hostPID: true
# 允许使用宿主机的IPC
hostIPC: true
# 只允许绑定宿主机的9796端口,和1000~1080的端口
hostPorts:
- max: 9796
min: 9796
- max: 1000
min: 1080
# 可以使用任意用户运行
runAsUser:
rule: RunAsAny
# 可以使用seLinux的任意规则
seLinux:
rule: RunAsAny
# 支持的挂载方式
volumes:
- configMap
- emptyDir
- projected
- secret
- downwardAPI
- persistentVolumeClaim
- hostPath
配置允许、默认添加、禁用内核功能
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: exporter-node-cluster-monitoring
spec:
# 允许容器添加SYS_TIME功能
allowedCapabilities:
- SYS_TIME
# 为每个容器添加CHOWN能力
defaultAddCapabilities:
- CHOWN
# 要求容器禁用SYS_ADMIN和SYS_MODULE
requiredDropCapabilities:
- SYS_ADMIN
- SYS_MODULE
利用RBAC分配PodSecurityPolicy
psp属于集群级别的资源,所以默认是作用于整个集群的。但是我们有时候只需要针对某些应用采用这些设置。可以通过创建一个ClusterRole然后将其
指向一个psp,再通过使用ClusterRoleBinding到不同的用户,这样的话这个psp的规则就只作用于这个用户创建的pod了。
kubectl create clusterrole psp -privileged --verb=use --resource=podsecuritypolicies --resource-name=privileged
注意:这里的verb采用的是use
然后再将这个clusterrole绑定到用户或者用户组上就可以了
pod间的访问隔离
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: networkPolicy-demo
spec:
# 允许可以访问哪些pod
# 当标签中为空时,表示不允许任何pod访问
podSelector:
配置同一命名空间(foo)下的相互访问权限
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: networkPolicy-demo
namespace: foo
spec:
# 允许哪些pod可以访问当前命名空间中的pod
podSelector:
matchLabels:
app: mysql
ingress:
- from:
# 允许哪个pod可以访问
- podSelector:
matchLabels:
app: service-a
# 允许被访问的pod
- ports:
- 3306
配置跨命名空间的访问权限
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: networkPolicy-demo
namespace: foo
spec:
# 允许哪些pod可以访问当前命名空间中的pod
podSelector:
matchLabels:
app: service-b
ingress:
- from:
# 允许带有标签为(tenant=service-a)的命名空间中的pod访问
- namespaceSelector:
matchLabels:
tenant: service-a
- ports:
- 80
可以通过网段限制进入的流量
ingress:
- from:
# 值允许来自ip端为192.168.1.0/24的流量
- ipBlock:
cidr: 192.168.1.0/24
- ports:
- 3306
限制pod流出流量
spec:
podSelector:
matchLabels:
app: service-b
egress:
- to:
# 只允许流量流出到标签为(app=service-c)的pod
- podSelector:
matchLabels:
app: service-c
kubernetes中pod的隔离策略的更多相关文章
- Kubernetes中pod创建流程
转自:https://blog.csdn.net/yan234280533/article/details/72567261 Pod是Kubernetes中最基本的部署调度单元,可以包含contain ...
- Kubernetes中Pod的健康检查
本文介绍 Pod 中容器健康检查相关的内容.配置方法以及实验测试,实验环境为 Kubernetes 1.11,搭建方法参考kubeadm安装kubernetes V1.11.1 集群 0. 什么是 C ...
- Kubernetes中 Pod 是怎样被驱逐的?
前言 在 Kubernetes 中,Pod 使用的资源最重要的是 CPU.内存和磁盘 IO,这些资源可以被分为可压缩资源(CPU)和不可压缩资源(内存,磁盘 IO).可压缩资源不可能导致 Pod 被驱 ...
- Kubernetes中pod UID的一个用法
Kubernetes中每个工作Node的路径/var/lib/kubelet/pods里,含该Node上生成的每个pod的一些log文件.而该log文件的名字就是pod对应的UID,如下图所示(Nod ...
- Kubernetes中Pod健康检查
目录 1.何为健康检查 2.探针分类 2.1.LivenessProbe探针(存活性探测) 2.2.ReadinessProbe探针(就绪型探测) 3.探针实现方法 3.1.Container Exe ...
- 【JVM故障问题排查心得】「内存诊断系列」JVM内存与Kubernetes中pod的内存、容器的内存不一致所引发的OOMKilled问题总结(上)
背景介绍 在我们日常的工作当中,通常应用都会采用Kubernetes进行容器化部署,但是总是会出现一些问题,例如,JVM堆小于Docker容器中设置的内存大小和Kubernetes的内存大小,但是还是 ...
- Kubernetes之canal的网络策略(NetworkPolicy)
安装要求: 1.我们这里安装的是3.3的版本.kubernetes的要求: 支持的版本 1.10 1.11 1.12 2.CNI插件需要启用,Calico安装为CNI插件.必须通过传递--networ ...
- 关于 Kubernetes 中的 Volume 与 GlusterFS 分布式存储
容器中持久化的文件生命周期是短暂的,如果容器中程序崩溃宕机,kubelet 就会重新启动,容器中的文件将会丢失,所以对于有状态的应用容器中持久化存储是至关重要的一个环节:另外很多时候一个 Pod 中可 ...
- (译)Kubernetes中的多容器Pod和Pod内容器间通信
原文:https://www.mirantis.com/blog/multi-container-pods-and-container-communication-in-kubernetes/Pave ...
- kubernetes之pod生命周期,pod重启策略, 镜像拉取策略
pod声明周期(状态):pending , running, succeeded, failed, unknown 挂起(Pending):Pod 已被 Kubernetes 系统接受,但有一个或者多 ...
随机推荐
- 【Mycat】01 概述
什么是Mycat? 数据库中间件 中间件:是一类连接软件组件和应用的计算机软件,以便于软件各部件之间的沟通. 例子:Tomcat,web中间件. 数据库中间件:连接java应用程序和数据库 为什么要用 ...
- window系统使用经验:新买的window11初始化时最好要选择用Microsoft账户激活,而不要用local账户激活
Windows系统初始化时有两种类型的账户可以选择,一种时Microsoft账户,一种时local账户,Microsoft账户需要联网初始化,而local账户则和传统的初始化方式一致,即账号信息保存在 ...
- ubuntu编译软件报错:fatal error: libnet.h: No such file or directory
参考: https://blog.csdn.net/wuyou1995/article/details/104742326/ ------------------------------------- ...
- python版本的“共轭梯度法”算法代码
在看代码的过程中遇到了共轭梯度法这个概念,对这个算法的数学解释看过几遍,推导看过了,感觉懂了,然后过上一些日子就又忘记了,然后又看了一遍推导,然后过了一些日子也就又忘记了,最后想想这个算法的数学解释就 ...
- vscode中设置Python解释器
以前在设置vscode中的Python解释器时都是采用图形化选择的方式来进行的,但是不知怎么的最近这个vscode在手动选择解释器时会出现时而好用时而不好用的情况,因此这里又给出了一种通过设置work ...
- 【故障排查】10分钟解决Quartz重复调度的疑难杂症
我司使用Apache DolphinScheduler作为调度框架很久了,感兴趣的小伙伴可以看看这些干货文章: 因为之前监控到会出现重复的调度的问题,所以此文记录排查重复调度问题的全过程,希望对社区其 ...
- java关于数组的复制,反转、查找
一.数组的赋值: arr2=arr1;对于该赋值而言,地址值一样,所以arr1会随着arr2的变化而变化.这不能称作数组的复制,因为只是把地址赋过去了.地址一样,指向的是堆空间中唯一的数组实体(数值) ...
- sc2 天梯地图
没记错的话以前 7 张 ban 3 张,非常合理,现在 9 张怎么还是 ban 3 张 好哥哥达蒙星际2教学 Goldenaura ban 三四矿近,挂运输机的地方长,架坦克的点位多,ZvT 打不了一 ...
- MFC 静态拆分视图窗口
今天学习了MFC中拆分窗口,现将方法记录下. 想要在窗口视图中拆分成左右两个视图窗口,首先要注意的是拆分后要加载到左右的视图要符合动态创建的类, 也就是要在自己创建的视图类中添加动态创建机制宏. 类内 ...
- 【工程应用十二】Bayer图像格式中Hamilton-Adams及Zhang Wu 基于LMMSS算法的Demosaic过程优化。
Demosaic,中文直接发翻译为去马赛克, 但是其本质上并不是去除马赛克,这让很多第一次接触这个名词或者概念的人总会想的更多.因此,一般传感器在采集信息时一个位置只采集RGB颜色中的一个通道,这样可 ...