2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

在 Istio 中使用 Kata 容器注入工作负载

  • 2023-03-02
    北京
  • 本文字数:3478 字

    阅读完需:约 11 分钟

在 Istio 中使用 Kata 容器注入工作负载

Kata Containers 是 Intel Clear Containers 和 Hyper runV 两个现有开源项目的合并,致力于创建一种轻量级虚拟机 (VM) 的标准实现,让其运行起来如同普通容器一般的同时,还可以提供虚拟机的工作负载隔离和安全优势。基于上面的定义,我很自然地想到如何在 Istio 中实现 Kata Containers 作为多个容器运行时之一来注入工作负载,好消息是我在我的环境中成功部署了它。这篇文章将介绍我在 Istio 中使用 Kata 容器注入工作负载的实践过程。

使用 Kata Containers 有什么好处?


Kata 希望在提供更好的容器之间的隔离的同时,仍然支持其他运行时提供的性能和效率。 作为一种特殊的容器运行时,Kata 很关键的一点是:Kata 运行时可通过以下方式在容器之间实施比其他运行时更深的隔离:

  • 每个 pod 运行自己的内核,而不是使用 Kata 中的 cgroups 与主机和其他容器共享主机系统的内核

  • Kata Containers 可以利用硬件级虚拟化提供的安全特性(这意味着它内置于 CPU 中并使用 VT 扩展提供的虚拟化功能)


然而,不同于普通虚拟机需要一两分钟启动并在隔离上浪费大量硬件资源,Kata 有与其他容器几乎一样的启动速度和资源消耗消耗,却以最少的成本变得更安全。下图是传统容器运行时与 Kata 容器运行时的对比图:

图 1

如何在 Istio 中使用 Kata 容器部署工作负载注入?


环境准备

  • containerd

  • 1.5.6

  • Kata Runtime

  • 3.0.2

  • Kubernetes Cluster via kubeadm (do not use Kind)

  • 1.23

  • Istio

  • 1.17-dev

  • 安装 Kata 容器

安装指南


安装 Kata Containers 的方法有 6 种,我试过其中 2 种(使用 snap 和 Manual),比较推荐 Manual,因为在使用 snap 时它对我来说很乱。接下来,让我们进入 手册指南


需要特别指出的步骤:

  1. 在解压 Kata Containers 安装包后,将所有 <YOUR-WORKDIR>/opt/kata/ 里的文件移动到 /opt/kata 中。 /opt/kata 目录下应该有 4 个文件夹:bin, libexec, runtime-rs, share

  2. 将/opt/kata/share/defaults/kata-containers/configuration.toml 复制到 /etc/kata-containers/configuration.toml 中注意:请为您选择正确的配置文件,如果不存在 /etc/kata-containers 需要创建此目录

  3. 通过以下命令为 Kata Containers 安装文件创建 5 个符号链接:

$ ln -s /opt/kata/bin/kata-runtime /usr/local/bin/kata-runtime$ ln -s /opt/kata/bin/containerd-shim-kata-v2 /usr/local/bin/containerd-shim-kata-v2$ ln -s /opt/kata/bin/kata-monitor /usr/local/bin/kata-monitor$ ln -s /opt/kata/bin/kata-collect-data.sh /usr/local/bin/kata-collect-data.sh$ ln -s /opt/kata/bin/qemu-system-x86_64 /usr/local/bin/qemu-system-x86_64
复制代码


详情请参考 Kata Containers 安装指南

正确配置 Containerd


此内容包含在如何配置Containerd以使用Kata中,但是,本次实践中我只使用 RuntimeClass 的方式来使用 Kata,下面是 plugins 部分的配置:

[RuntimeClass](https://kubernetes.io/docs/concepts/containers/runtime-class/) 的方式来使用Kata,下面是 `plugins` 部分的配置:[plugins."io.containerd.grpc.v1.cri".containerd]  default_runtime_name = "runc"  [plugins."io.containerd.grpc.v1.cri".containerd.runtimes]    [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.kata]      runtime_type = "io.containerd.kata.v2"      privileged_without_host_devices = true      [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.kata.options]        ConfigPath = "/opt/kata/share/defaults/kata-containers/configuration.toml"    [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]      runtime_type = "io.containerd.runc.v2"      [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]        SystemdCgroup = true
复制代码


在此配置中,我定义了两种类型的运行时:runc 和 kata,默认为 runc。


注意:如果配置发生变化,请通过配置:sudo systemctl daemon-reload 和 sudo systemctl restart containerd 重新启动 Containerd。

正确配置 Kubelet


此内容包含在如何配置 kubelet 以使用 Kata中,部分配置文件/etc/systemd/system/kubelet.service.d/10-kubeadm.conf,如下:

Environment="KUBELET_EXTRA_ARGS=--container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock --cgroup-driver=systemd"
复制代码

在 Istio 中使用 Kata 容器注入工作负载


一般来说,用户安装 K8s 集群和 Istio 应该没有区别,比如我通过 kubeadm 命令安装集群 kubeadm init --cri-socket=unix:///run/containerd/containerd.sock --pod -network-cidr=10.244.0.0/16 --v=5 --ignore-preflight-errors=all 并通过 istioctl 命令 istioctl install -y 安装 Istio。


基于之前的 containerd 配置,runc 是默认的容器运行时,然后通过 sudo systemctl status containerd 查看如下:

图 2


目前只有 Containerd runc 的进程。然后我使用 RuntimeClass 启动 Kata 容器,其 yaml 文件kata-runtimeclass.yaml如下:

apiVersion: node.k8s.io/v1kind: RuntimeClassmetadata:  name: kata-runtimehandler: kata
复制代码


RuntimeClass CR 名称是 kata-runtime,字段 handler 指定为 kata。通过命令创建此 CR:kubectl apply -f kata-runtimeclass.yaml 。我使用 httpbin.yaml 作为示例使用 httpbin,但是,它应该有一点变化,最终的 yaml 如下:

apiVersion: v1kind: ServiceAccountmetadata:  name: httpbin---apiVersion: v1kind: Servicemetadata:  name: httpbin  labels:    app: httpbin    service: httpbinspec:  ports:  - name: http    port: 8000    targetPort: 80  selector:    app: httpbin---apiVersion: apps/v1kind: Deploymentmetadata:  name: httpbinspec:  replicas: 1  selector:    matchLabels:      app: httpbin      version: v1  template:    metadata:      labels:        app: httpbin        version: v1    spec:      runtimeClassName: kata-runtime      serviceAccountName: httpbin      containers:      - image: docker.io/kennethreitz/httpbin        imagePullPolicy: IfNotPresent        name: httpbin        ports:        - containerPort: 80
复制代码


认真观察,然后你会发现在 Deployment 的 containers 部分有额外的字段 runtimeClassName: kata-runtime。我已经定义 RuntimeClass CR kata-runtime。另一个需要注意的是,为 httpbin 创建 serviceaccount 是必需的,因为 Kata 容器需要一个 ClusterRole。然后通过如下命令部署此应用:

kubectl apply -f <(istioctl kube-inject -f httpbin-hsm.yaml)
复制代码

确认工作负载已经使用 Kata


图 3


如上图所示,红色框中表明此 Pod 已经使用 Kata 容器运行时。然后确认一下 Containerd 的状态:

图 4


相比于图 2,除了 Containerd containerd-shim-runc-v2 进程外,还有一些其他的 Kata 进程显示在上面的红色矩形框中,例如 containerd-shim-kata-v2,virtiofsd 和 qemu-system-x86_64 。这多出来的进程是因为我部署了需要 Kata Containers 注入的服务 httpbin 。至此,安装部署成功。


本次实践中,我部署的 Kubernetes 以及 Istio 使用了 containerd runc 默认容器运行时,而对于服务 httpbin 则通过 RuntimeClass 的方式部署使用了 Kata 作为其容器运行时。

结论


根据本次实践,在 Istio 中部署 httpbin 和 bookinfo 等经典服务并注入 sidecar 时,使用 Kata Containers 与使用其他通用容器运行时并没有太大区别,但我们仍然需要验证更多其他内容,例如 Kubernetes CNI 选择和 Istio CNI 启用时会遇到什么情况。


我们还需要意识到的一点是 Istio 的用户后面很可能会在同一个环境中根据不同的需求同时存在多个容器运行时。

作者简介


张怀龙,曾就职于阿尔卡特朗讯、百度、IBM 等企业,从事云计算研发相关工作。目前就职于 Intel 中国,担任云原生开发工程师,目前致力于云原生服务网格等技术领域,是 Istio 的 maintainer 和 Linkerd 的开发者,同时主导并参与了 Istio 的双栈支持工作(已在 Istio 1.17 中正式发布),并在 QCon 全球软件开发大会(北京站)分享了题为《移动云服务网格双栈技术的实践之路》(点击获取完整幻灯片)的演讲。


今年 5 月,QCon全球软件开发大会即将落地广州,从下一代软件架构、金融分布式核心系统、现代编程语言、AIGC、现代数据架构、新型数据库、业务出海的思考、大前端变革等角度与你探讨,点击了解详情

2023-03-02 20:1410617

评论

发布
暂无评论
发现更多内容

超实用!Dify调用Java的3种实现方式!

王磊

Apache Doris 2.1.10 版本正式发布

SelectDB

大数据 开源 实时数仓 Apaache Doris 数据湖分析

多源多表写入、数据格式增强,SeaTunnel 2.3.11 重磅更新来了!

白鲸开源

大数据 开源 数据同步 Apache SeaTunnel 版本发布

社区答疑明星招募令 | 成为SeaTunnel社群“技术担当”,我们等你来!

白鲸开源

开源社区 数据集成 Apache SeaTunnel 开源活动

Web3的成功离不开什么?

PowerVerse

去中心化 云算力 web3 #区块链

高并发下如何防止商品超卖?

量贩潮汐·WholesaleTide

高并发

Fluss 实战:用 Partial Update 构建实时宽表的新范式

Apache Flink

大数据 flink Fluss

会员付费漫画小程序:微擎开源生态下的内容变现新范式

微擎应用市场

智慧酒店多商户合伙人:微擎开源生态下的酒店行业资源整合平台

微擎应用市场

Muu 线下活动:微擎开源生态下的全流程活动管理与营销平台

微擎应用市场

粒子枪仿真和Track Solver追踪求解_CST案例分析

思茂信息

cst cst操作 CST Studio Suite

零风险操作!DolphinScheduler高可用架构下的无损扩缩容指南

白鲸开源

开源 运维 Apache DolphinScheduler 扩缩容 任务调度平台

远控安全进阶之战:TeamViewer/ToDesk/向日葵设备安全策略对比

小喵子

安全 远程办公 远程控制 ToDesk

25年河北等保测评机构名称以及地址一览表

行云管家

等保 等保测评

A路径 VS B路径:先攻新加坡还是直取美国?中国科技出海的生死选择题

白鲸开源

开源 DataOps 出海 商业化 白鲸开源

上新功能!通义灵码行间建议预测 NES 使用方法

阿里云云效

阿里云 通义灵码

一种更简单的方式运行 C# 代码,简化 C# 开发体验!

不在线第一只蜗牛

C#

VMware NSX 4.2.2.1 发布,新增功能简介

sysin

nsx

NetTrace 工具介绍

天翼云开发者社区

网络

前端热更新:无声引擎驱动中国互联网数字化转型

xuyinyin

南开大学赵宏教授解读AI语境下的教育根本问题,相关白皮书已发布

ModelWhale

AI教育 南开大学 人工智能教育 学科+AI白皮书

.NET 9中的异常处理性能提升分析:为什么过去慢,未来快

电子尖叫食人鱼

.NET 7

壹佰门店社区团购:微擎开源生态下的社区零售增长引擎

微擎应用市场

上新功能!通义灵码行间建议预测 NES 使用方法

阿里巴巴云原生

阿里云 通义灵码

DNS攻击类型有哪些?如何应对DNS攻击威胁?

防火墙后吃泡面

人工智能AI在数字化转型有哪些应用?

优秀

人工智能 AI 数字化转型

全球科技巨头云集,展现AI前沿成果|2025深圳人工智能展

AIOTE智博会

高交会 高新技术展 深圳高交会

全维度测试通过!DolphinScheduler 3.2.0单节点部署与验证实录

白鲸开源

大数据 开源 性能测试 Apache DolphinScheduler 工作流任务调度

小白也能轻松上手:ToDesk、Parsec、AnyDesk、TeamViewer 哪款远程软件最适合新手?

小喵子

远程

在 Istio 中使用 Kata 容器注入工作负载_云原生_张怀龙_InfoQ精选文章