containerd与安全沙箱的Kubernetes初体验

containerd是一个开源的行业标准容器运行时,关注于简单、稳定和可移植,同时支持Linux和Windows。2016年12月14日,Docker公司宣布将Docker Engine的核心组件 containerd 捐赠到一个新的开源社区独立发展和运营。阿里云,AWS, Google,IBM和Microsoft作为初始成员,共同建设 containerd 社区。2017年3月,Docker 将 containerd 捐献给CNCF(云原生计算基金会)。containerd得到了快速的发展和广泛的支持。Docker引擎已经将containerd作为容器生命周期管理的基础,Kubernetes也在2018年5月,正式支持containerd作为容器运行时管理器。2019年2月,CNCF宣布containerd毕业,成为生产可用的项目。

containerd 从1.1版本开始就已经内置了Container Runtime Interface (CRI) 支持,进一步简化了对Kubernetes的支持。其架构图如下:

在Kubernetes场景下,containerd与完整Docker Engine相比,具有更少的资源占用和更快的启动速度。

红帽主导的cri-o是与containerd竞争的容器运行时管理项目。containerd与cri-o项目相比,在性能上具备优势,在社区支持上也更加广泛。

更重要的是containerd提供了灵活的扩展机制,支持各种符合OCI(Open Container Initiative)的容器运行时实现,比如runc容器(也是熟知的Docker容器),KataContainer, gVisor和Firecraker等安全沙箱容器。

在Kubernetes环境中,可以用不同的API和命令行工具来管理容器/Pod,镜像等概念。为了便于大家理解,我们可以用下图说明如何利用不同层次的API和CLI管理容器生命周期管理。

  • Kubectl:是集群层面的命令行工具,支持Kubernetes的基本概念
  • crictl:是针对节点上CRI的命令行工具,文档
  • ctr:是针对containerd的命令行工具,文档

体验

Minikube是体验containerd作为Kubernetes容器运行时的最简单方式,我们下面将将其作为Kubernetes容器运行时,并支持runc和gvisor两种不同的实现。

早期由于网络访问原因,很多朋友无法直接使用官方Minikube进行实验。在最新的Minikube 1.5版本中,已经提供了完善的配置化的方式,可以帮助大家利用阿里云的镜像地址来获取所需Docker镜像和配置,同时支持Docker/Containerd等不同容器运行时。

我们创建一个Minikube虚拟机环境,注意需要指明 --container-runtime=containerd 参数设置containerd作为容器运行时。同时registry-mirror也要替换成自己的阿里云镜像加速地址。

$ minikube start --image-mirror-country cn \--iso-url=https://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/iso/minikube-v1.5.0.iso \--registry-mirror=https://XXX.mirror.aliyuncs.com \--container-runtime=containerdDarwin 10.14.6 上的 minikube v1.5.0Automatically selected the 'hyperkit' driver (alternates: [virtualbox])
️  您所在位置的已知存储库都无法访问。正在将 registry.cn-hangzhou.aliyuncs.com/google_containers 用作后备存储库。正在创建 hyperkit 虚拟机(CPUs=2,Memory=2000MB, Disk=20000MB)...
️  VM is unable to connect to the selected image repository: command failed: curl -sS https://k8s.gcr.io/
stdout:
stderr: curl: (7) Failed to connect to k8s.gcr.io port 443: Connection timed out
: Process exited with status 7正在 containerd 1.2.8 中准备 Kubernetes v1.16.2…拉取镜像 ...正在启动 Kubernetes ...
⌛  Waiting for: apiserver etcd scheduler controller完成!kubectl 已经配置至 "minikube"$ minikube dashboardVerifying dashboard health ...Launching proxy ...Verifying proxy health ...Opening http://127.0.0.1:54438/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/ in your default browser...

部署测试应用

我们通过Pod部署一个nginx应用

$ cat nginx.yaml
apiVersion: v1
kind: Pod
metadata:name: nginx
spec:containers:- name: nginximage: nginx$ kubectl apply -f nginx.yaml
pod/nginx created$ kubectl exec nginx -- uname -a
Linux nginx 4.19.76 #1 SMP Fri Oct 25 16:07:41 PDT 2019 x86_64 GNU/Linux

然后,我们开启 minikube 对 gvisor 支持

$ minikube addons enable gvisorgvisor was successfully enabled$ kubectl get pod,runtimeclass gvisor -n kube-system
NAME         READY   STATUS    RESTARTS   AGE
pod/gvisor   1/1     Running   0          60mNAME                              CREATED AT
runtimeclass.node.k8s.io/gvisor   2019-10-27T01:40:45Z$ kubectl get runtimeClass
NAME     CREATED AT
gvisor   2019-10-27T01:40:45Z

当 gvisor pod进入 Running 状态的时候,可以部署gvisor测试应用。

我们可以看到K8s集群中已经注册了一个gvisor的“runtimeClassName“。

之后,开发者可以通过在Pod声明中的 ”runtimeClassName“来选择不同类型的容器运行时实现。比如,如下我们创建一个运行在 gvisor 沙箱容器中的 nginx 应用。

$ cat nginx-untrusted.yaml
apiVersion: v1
kind: Pod
metadata:name: nginx-untrusted
spec:runtimeClassName: gvisorcontainers:- name: nginximage: nginx$ kubectl delete -f nginx-untrusted.yaml
pod/nginx-untrusted created$ kubectl exec nginx-untrusted -- uname -a
Linux nginx-untrusted 4.4 #1 SMP Sun Jan 10 15:06:54 PST 2016 x86_64 GNU/Linux

我们可以清楚地发现:由于基于runc的容器与宿主机共享操作系统内核,runc容器中查看到的OS内核版本与Minikube宿主机OS内核版本相同。而gvisor的runsc容器采用了独立内核,它和Minikube宿主机OS内核版本不同。

正是因为每个沙箱容器拥有独立的内核,减小了安全攻击面,具备更好的安全隔离特性。适合隔离不可信的应用,或者多租户场景。

注意:gvisor在minikube中,通过ptrace对内核调用进行拦截,其性能损耗较大。此外gvisor的兼容性还有待增强。

使用ctl和crictl工具

我们现在可以进入进入Minikube虚拟机

$ minikube ssh

containerd支持通过名空间对容器资源进行隔离,查看现有 containerd 名空间

$ sudo ctr namespaces ls
NAME   LABELS
k8s.io
# 列出所有容器镜像
$ sudo ctr --namespace=k8s.io images ls
...# 列出所有容器列表
$ sudo ctr --namespace=k8s.io containers ls

在Kubernetes环境更加简单的方式是利用 crictl 对pods进行操作

# 查看pod列表
$ sudo crictl pods
POD ID              CREATED             STATE               NAME                                         NAMESPACE              ATTEMPT
78bd560a70327       3 hours ago         Ready               nginx-untrusted                              default                0
94817393744fd       3 hours ago         Ready               nginx                                        default                0
...# 查看名称包含nginx的pod的详细信息
$ sudo crictl pods --name nginx -v
ID: 78bd560a70327f14077c441aa40da7e7ad52835100795a0fa9e5668f41760288
Name: nginx-untrusted
UID: dda218b1-d72e-4028-909d-55674fd99ea0
Namespace: default
Status: Ready
Created: 2019-10-27 02:40:02.660884453 +0000 UTC
Labels:io.kubernetes.pod.name -> nginx-untrustedio.kubernetes.pod.namespace -> defaultio.kubernetes.pod.uid -> dda218b1-d72e-4028-909d-55674fd99ea0
Annotations:kubectl.kubernetes.io/last-applied-configuration -> {"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"name":"nginx-untrusted","namespace":"default"},"spec":{"containers":[{"image":"nginx","name":"nginx"}],"runtimeClassName":"gvisor"}}kubernetes.io/config.seen -> 2019-10-27T02:40:00.675588392Zkubernetes.io/config.source -> apiID: 94817393744fd18b72212a00132a61c6cc08e031afe7b5295edafd3518032f9f
Name: nginx
UID: bfcf51de-c921-4a9a-a60a-09faab1906c4
Namespace: default
Status: Ready
Created: 2019-10-27 02:38:19.724289298 +0000 UTC
Labels:io.kubernetes.pod.name -> nginxio.kubernetes.pod.namespace -> defaultio.kubernetes.pod.uid -> bfcf51de-c921-4a9a-a60a-09faab1906c4
Annotations:kubectl.kubernetes.io/last-applied-configuration -> {"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"name":"nginx","namespace":"default"},"spec":{"containers":[{"image":"nginx","name":"nginx"}]}}kubernetes.io/config.seen -> 2019-10-27T02:38:18.206096389Zkubernetes.io/config.source -> api

containerd与Docker的关系

很多同学都关心containerd与Docker的关系,以及是否containerd可以取代Docker?
containerd已经成为容器运行时的主流实现,也得到了Docker社区和Kubernetes社区的大力支持。Docker Engine底层的容器生命周期管理也是基于containerd实现。

但是Docker Engine包含了更多的开发者工具链,比如镜像构建。也包含了Docker自己的日志、存储、网络、Swarm编排等能力。此外,绝大多数容器生态厂商,如安全、监控、开发等对Docker Engine的支持比较完善,对containerd的支持也在逐渐补齐。

所以在Kubernetes运行时环境,对安全和效率和定制化更加关注的用户可以选择containerd作为容器运行时环境。对于大多数开发者,继续使用Docker Engine作为容器运行时也是一个不错的选择。

阿里云容器服务对containerd的支持

在阿里云Kubernetes服务ACK,我们已经采用containerd作为容器运行时管理,来支撑安全沙箱容器和runc容器的混合部署。在现有产品中,我们和阿里云操作系统团队、蚂蚁金服一起支持了基于轻量虚拟化的runV沙箱容器,4Q也将和操作系统团队、安全团队合作发布基于Intel SGX的可信加密沙箱容器。

和Serverless Kubernetes(ASK)中,我们也利用containerd灵活的插件机制定制和剪裁了面向nodeless环境的容器运行时实现。


阿里云双11亿元补贴提前领,进入抽取iPhone 11 Pro:https://www.aliyun.com/1111/2019/home?utm_content=g_1000083110

原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/517592.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Seata 单机环境搭建_01

文章目录一、整合版本说明1. 毕业版本依赖关系(推荐使用)2. 组件版本关系3. 演示版本二、部署单机 TC Server2.1. 下载Seata2.2. 解压缩2.3. 启动2.4. 监听日志2.5. 启动命令讲解一、整合版本说明 1. 毕业版本依赖关系(推荐使用) Spring Cloud VersionSpring Cloud Alibaba V…

学生成绩管理系统java+mysql+swing入门级项目开发

夫陶公清风千古,余又何人,敢称庶几 代码已移至Gitee : https://gitee.com/BreezAm/edu-student 文章目录简要:登陆运行效果主界面运行效果图界面设置运行效果图网络配置界面运行效果图菜单栏运行效果图登陆窗体实现窗体界面设置功…

干货 | 大白话彻底搞懂 HBase RowKey 详细设计

作者 | 且听风吟责编 | Carol封图 | CSDN 付费下载于视觉中国前言RowKey作为HBase的核心知识点,RowKey设计会影响到数据在HBase中的分布,还会影响我们查询效率,所以RowKey的设计质量决定了HBase的质量。是咱们大数据从业者必知必会的&#xf…

Knative 实战:如何在 Knative 中配置自定义域名及路由规则

目前 Knative 中默认支持是基于域名的转发,但域名默认格式是:"{{.Name}}.{{.Namespace}}.{{.Domain}}"(这个可以在 config-network 配置)。但对于用户来说并不能指定全域名。 另外一个问题就是基于Path 转发的能力&…

混合云模式下 MaxCompute + Hadoop 混搭大数据架构实践

摘要:2019杭州云栖大会大数据企业级服务专场,由斗鱼大数据高级专家张龙带来以 “混合云模式下 MaxComputeHadoop 混搭大数据架构实践” 为题的演讲。本文讲述了从 Apache Hadoop 阶段到 Cloudera CDH 阶段斗鱼大数据架构的发展历程。提出了上云过程中斗鱼…

mybatisplus 一次性执行多条SQL语句

文章目录一、Mysql数据库1. Url2. xml映射文件二、Oracle数据库2.1. 关键点2.2. xml映射文件一、Mysql数据库 关键点:在url后面添加&allowMultiQueriestrue,sql后面添加分号; 1. Url 案例: url: jdbc:mysql://localhost:3306/afsdb?…

没错!Python程序员正在消失,HR:你才知道?

Python为什么这么火?学了Python能干什么?Python程序员有前途吗?几乎所有人脑子里都有这个疑问,感觉现在铺天盖地都是Python的消息,就连刷抖音都能刷到Python,Python已经火出圈了!Python为什么这…

swing中模态对话框(setModal(true))和显示对话框(setVisible(true))的编写顺序

今天给大家分享一个鄙人在编程中总结出的一个易错点和最容易让人感到困惑的一个知识点: 当你要从一个窗体跳转到另一个窗体,你把跳转目标的窗体设成模态对话框,设计成模态对话框就是禁止父窗体与子窗体之间操作,简单说就是当调用子…

Service Mesh 初体验

前言 计算机软件技术发展到现在,软件架构的演进无不朝着让开发者能够更加轻松快捷地构建大型复杂应用的方向发展。容器技术最初是为了解决运行环境的不一致问题而产生的,随着不断地发展,围绕容器技术衍生出来越来越多的新方向。 最近几年&a…

mybatisplus 一次性执行多条SQL语句插入(Mysql篇)

文章目录一、数据库部分1. 创建数据库2. 初始化表结构二、代码部分2.1. controller2.2. mapper接口2.3. 映射文件2.4. 参数封装三、测试验证3.1. 发起请求3.2. 查看数据库3.3. 配置文件部分一、数据库部分 1. 创建数据库 创建more-insert 2. 初始化表结构 -- 一次性插入多张…

带领国产数据库走向世界,POLARDB底层逻辑是什么?

POLARDB 是阿里云自主研发的下一代云原生分布式数据库,100%兼容MySQL、PostgreSQL等开源数据库,高度兼容Oracle语法,使用RDS服务的客户不需要修改应用代码,可以一键迁移到POLARDB,体验更大的容量,更高的性能…

基于java+swing+mysql+JFeeChart的企业人力资源管理系统(1)

文章目录一,前言二,项目运行图(1)主界面(管理员界面)(2)员工资料运行图(3)全部员工查看运行图(4)部门管理运行图(5&#x…

十年架构师:我是这样手写Spring的,用300行代码体现优雅之道

起源Spring作为一个开源框架,于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是…

深度 | 打败围棋冠军后,机器智能下一步能战胜黑客吗?

阿里妹导读:从深蓝战胜象棋冠军到AlphaGo战胜围棋冠军,每一次机器智能在特定领域战胜人类,都会引发整个社会的广泛关注。洞察了棋类博弈真相的机器智能,接下来能洞察网络安全的真相并且在黑客博弈中战胜人类吗?在机器智…

mybatisplus 一次性执行多条SQL语句插入(Oracle篇)

文章目录一、数据库部分1. 创建数据库2. 初始化表结构二、代码部分2.1. controller2.2. mapper接口2.3. 映射文件2.4. 参数封装三、测试验证3.1. 发起请求3.2. 查看数据库3.3. 配置文件部分一、数据库部分 1. 创建数据库 创建more-insert 2. 初始化表结构 -- 一次性插入多张…

从310到蚂蚁森林,蚂蚁金服在线图计算的创新与实践

蚂蚁金服过去十五年,重塑支付改变生活,为全球超过十二亿人提供服务,这些背后离不开技术的支撑。在 2019 杭州云栖大会上,蚂蚁金服将十五年来的技术沉淀,以及面向未来的金融技术创新和参会者分享。我们将其中的优秀演讲…

Seata 与 Nacos注册中心整合实现集群环境搭建_02

接上一篇:Seata 单机环境搭建_01 文章目录一、整体架构二、安装步骤2.1. 创建数据库2.2. 初始化表结构2.3. 修改配置文件2.4. 调整数据库驱动2.5. 修改配置中心三、 启动和验证3.1. 启动nacos3.2. 启动TC Server3.3. 验证高可用一、整体架构 我们来学习部署集群 Se…

趣谈程序员真香定律:源码即设计

来源 | 码砖杂役责编 | Carol封图 | CSDN 付费下载自视觉中国我们经常谈论架构,讨论设计,却甚少关注实现和代码本身,架构和设计固然重要,但要说代码本身不重要,我不同意,Robert C.Martin大叔也不同意&#…

Nacos 1.1.4 发布,业界率先支持 Istio MCP 协议

Nacos是阿里巴巴开源的服务发现与配置管理项目,本次发布的1.1.4版本,主要带来的是与Istio的对接功能,使用的是Istio最新的MCP协议。本文将介绍包括这个功能在内的新版本发布的功能。 升级指南 服务端 0.8.0及以上版本: 解压安…

Seata 与 Nacos Config配置中心整合_03

前言:之前我们只将nacos注册中心和seata进行了整合,如果需要实现完整的功能还需要与nacos的配置中心进行整合。 文章目录一、配置管理1. 创建文件config.txt2. 创建nacos-config.sh3. 配置导入nacos配置中心4. 配置验证一、配置管理 1. 创建文件config.…