CKS之安全沙箱运行容器:gVisor

2024-03-31 09:36

本文主要是介绍CKS之安全沙箱运行容器:gVisor,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一、gVisor介绍

二、gVisor架构

三、gVisor使用前置条件

四、Docker中使用gVisor

五、containerd中使用gVisor

六、Kubernetes结合gVisor使用


一、gVisor介绍

        gVisor是Google开源的一种容器沙箱技术,其设计初衷是在提供较高安全性的同时,尽量减少对性能的影响。通过创建一个用户空间内核,gVisor拦截并处理容器内应用程序的系统调用,从而实现对容器内进程与宿主机内核间交互的隔离。这种设计有效防止了恶意程序利用内核漏洞对宿主机造成影响。gVisor兼容OCI标准,可以无缝集成到Docker和Kubernetes(K8s)中,使其部署和使用变得更为便捷。

项目地址:gVisor GitHub

优点:增强了容器的安全性,有效隔离了容器与宿主机内核的直接交互。

缺点:由于增加了一层抽象,会带来额外的性能开销,尤其是在系统调用频繁的场景下更为明显

二、gVisor架构

gVisor的架构主要由以下三个组件构成:

  • Runsc(Runtime Sandbox):一种运行时引擎,负责创建和销毁容器,是gVisor与容器生命周期管理交互的接口。
  • Sentry:核心组件,负责处理容器内的系统调用。Sentry运行在用户空间,模拟Linux内核的行为,处理来自容器内部的系统调用请求。
  • Gofer:负责文件系统的操作代理。所有的IO请求都会通过Gofer转发到宿主机上,从而实现文件系统操作的隔离和控制。

用户可通过Docker或containerd等容器引擎创建基于runsc的容器。容器进程的系统调用会被Sentry拦截处理,需要宿主机文件系统支持的操作会通过Gofer代理转发。

三、gVisor使用前置条件

内核要求:Linux 4.14.77+

Docker版本要求:Docker version 17.09.0及以上

系统架构要求: x86_64 和 ARM64 

四、Docker中使用gVisor

1、安装runsc
下载最新版本runsc二进制文件,放到 PATH 环境变量目录下,如 /usr/local/bin

参考文档:Installation - gVisor

set -e
ARCH=$(uname -m)
URL=https://storage.googleapis.com/gvisor/releases/release/latest/${ARCH}
wget ${URL}/runsc ${URL}/runsc.sha512 \${URL}/containerd-shim-runsc-v1 ${URL}/containerd-shim-runsc-v1.sha512
sha512sum -c runsc.sha512 \-c containerd-shim-runsc-v1.sha512
rm -f *.sha512
chmod a+rx runsc containerd-shim-runsc-v1
mv runsc containerd-shim-runsc-v1 /usr/local/bin

方法一:

2、配置Docker daemon
编辑dockerd配置文件(如/etc/docker/daemon.json),新增以下配置:

 {"runtimes": {"runsc": {"path": "/usr/local/bin/runsc"}}}

方法二:

2、执行install命令

/usr/local/bin/runsc install

 3、重启dockerd使配置生效

systemctl restart docker

4、运行容器时指定 --runtime=runsc 参数,切换到gVisor runsc运行时

docker run --runtime=runsc --rm hello-world

验证

使用gvisor创建的容器,内核版本已经变为4.4

未使用gvisor创建的容器,内核版本已经变为3.10,与宿主机内核版本一致

五、containerd中使用gVisor

containerd通过插件形式支持runsc,需先安装配置runsc插件。

1、安装gVisor containerd shim
下载containerd-shim-runsc-v1并放到/usr/local/bin/目录。

2、生成containerd配置

containerd config default > /etc/containerd/config.toml

3、在 config.toml 的 [plugins."io.containerd.grpc.v1.cri".containerd.runtimes] 段添加:

     [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runsc]runtime_type = "io.containerd.runsc.v1"

4、重启containerd

sudo systemctl restart containerd

在 Pod 或容器运行时,将 runtimeClassName 指定为 runsc 即可。

六、Kubernetes结合gVisor使用

1、安装gvisor,可参考前面 在Docker中使用gVisor 的步骤

2、创建 RuntimeClass,指定gvisor作为runtime handler。
        runtimeclass.yaml

apiVersion: node.k8s.io/v1
kind: RuntimeClass
metadata:name: gvisor    #RuntimeClass名称
handler: runsc    #对应CRI配置名称

3、创建使用gvisor运行时的Pod
在container spec中指定 runtimeClassName: gvisor
        pod.yaml

apiVersion: v1
kind: Pod
metadata:name: mypod
spec:runtimeClassName: gvisorcontainers:- name: helloimage: busybox

这篇关于CKS之安全沙箱运行容器:gVisor的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/864018

相关文章

MySQL多实例管理如何在一台主机上运行多个mysql

《MySQL多实例管理如何在一台主机上运行多个mysql》文章详解了在Linux主机上通过二进制方式安装MySQL多实例的步骤,涵盖端口配置、数据目录准备、初始化与启动流程,以及排错方法,适用于构建读... 目录一、什么是mysql多实例二、二进制方式安装MySQL1.获取二进制代码包2.安装基础依赖3.清

在IntelliJ IDEA中高效运行与调试Spring Boot项目的实战步骤

《在IntelliJIDEA中高效运行与调试SpringBoot项目的实战步骤》本章详解SpringBoot项目导入IntelliJIDEA的流程,教授运行与调试技巧,包括断点设置与变量查看,奠定... 目录引言:为良驹配上好鞍一、为何选择IntelliJ IDEA?二、实战:导入并运行你的第一个项目步骤1

Nginx安全防护的多种方法

《Nginx安全防护的多种方法》在生产环境中,需要隐藏Nginx的版本号,以避免泄漏Nginx的版本,使攻击者不能针对特定版本进行攻击,下面就来介绍一下Nginx安全防护的方法,感兴趣的可以了解一下... 目录核心安全配置1.编译安装 Nginx2.隐藏版本号3.限制危险请求方法4.请求限制(CC攻击防御)

SpringBoot结合Docker进行容器化处理指南

《SpringBoot结合Docker进行容器化处理指南》在当今快速发展的软件工程领域,SpringBoot和Docker已经成为现代Java开发者的必备工具,本文将深入讲解如何将一个SpringBo... 目录前言一、为什么选择 Spring Bootjavascript + docker1. 快速部署与

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

c++中的set容器介绍及操作大全

《c++中的set容器介绍及操作大全》:本文主要介绍c++中的set容器介绍及操作大全,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录​​一、核心特性​​️ ​​二、基本操作​​​​1. 初始化与赋值​​​​2. 增删查操作​​​​3. 遍历方

k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)

《k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)》本文记录在K8s上运行的MySQL/MariaDB备份方案,通过工具容器执行mysqldump,结合定时任务实... 目录前言一、获取需要备份的数据库的信息二、备份步骤1.准备工作(X86)1.准备工作(arm)2.手

Java中常见队列举例详解(非线程安全)

《Java中常见队列举例详解(非线程安全)》队列用于模拟队列这种数据结构,队列通常是指先进先出的容器,:本文主要介绍Java中常见队列(非线程安全)的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一.队列定义 二.常见接口 三.常见实现类3.1 ArrayDeque3.1.1 实现原理3.1.2

Java -jar命令如何运行外部依赖JAR包

《Java-jar命令如何运行外部依赖JAR包》在Java应用部署中,java-jar命令是启动可执行JAR包的标准方式,但当应用需要依赖外部JAR文件时,直接使用java-jar会面临类加载困... 目录引言:外部依赖JAR的必要性一、问题本质:类加载机制的限制1. Java -jar的默认行为2. 类加