containerd中文翻译系列(五)客户端选项

containerd 客户端的构建是为了方便用户进行扩展。 我们的目标是,调用的执行流程在不同的实现中保持不变,同时编写 Opts 来扩展功能。 为了实现这一目标,我们依赖于 Go 中的 Opts 模式。

方法调用

对于客户端软件包中的许多函数和方法,你通常会看到变量参数作为最后一个参数。

如果我们查看客户端上的 NewContainer 方法,就会发现它有一个必要参数 id 和附加的 NewContainerOpts

有几个内置选项允许使用现有规范创建容器,即 WithSpec,以及用于创建或使用现有快照的选项。

go 复制代码
func (c *Client) NewContainer(ctx context.Context, id string, opts ...NewContainerOpts) (Container, error) {
}

扩展客户端

作为 containerd 客户端的用户,你需要能够添加自己领域的特定功能。 有几种方法可以做到这一点:更改客户端代码、向containerd客户端提交 PR 或fork客户端。 只有在尝试过所有其他方法之后,才能考虑这些扩展客户端的方法。

扩展客户端的正确且受支持的方法是构建一个 Opts包,定义应用程序的特定逻辑。

举例来说,如果 Docker 正在集成 containerd 支持并需要添加卷等概念,他们就会创建一个包含选项的 docker 包。

坏的扩展示例

go 复制代码
// 示例代码
container, err := client.NewContainer(ctx, id)

// 添加卷及其配置并绑定挂载
container.Labels["volumes"] = VolumeConfig{}
container.Spec.Binds  = append({"/var/lib/docker/volumes..."})

好的扩展示例

go 复制代码
// 示例代码
import "github.com/docker/docker"
import "github.com/docker/libnetwork"

container, err := client.NewContainer(ctx, id,
	docker.WithVolume("volume-name"),
	libnetwork.WithOverlayNetwork("cluster-network"),
)

使用这种模式有几个好处。

  1. 您的应用程序代码不会分散在containerd 客户端的执行流中。
  2. 无需模拟 containerd 客户端即可对代码进行单元测试。
  3. 贡献者可以更好地跟踪您的 containerd 实现,并了解何时何地将您的应用逻辑添加到标准 containerd 客户端调用中。

SpecOpt 示例

如果我们想制作一个 SpecOpt 来设置一个容器,以便使用 htop 监控主机系统,这可以很容易地完成,而无需碰触 containerd 代码库中的任何一行代码。

go 复制代码
package monitor

import (
	"github.com/containerd/containerd/v2/oci"
	specs "github.com/opencontainers/runtime-spec/specs-go"
)

// WithHtop配置容器,以便通过 `htop` 监控主机系统
func WithHtop(s *specs.Spec) error {
	// 确保在host pid 命名空间
	if err := oci.WithHostNamespace(specs.PIDNamespace)(s); err != nil {
		return err
	}
	// 确保将 htop 设置为参数
	s.Process.Args = []string{"htop"}
	// 确保为htop设置TTY
	if err := oci.WithTTY(s); err != nil {
		return err
	}
	return nil
}

将新选项添加到规范生成中,就像导入新软件包并在创建规范时添加该选项一样简单。

arduino 复制代码
import "github.com/crosbymichael/monitor"

container, err := client.NewContainer(ctx, id,
	containerd.WithNewSpec(oci.WithImageConfig(image), monitor.WithHtop),
)

您可以在这里查看完整代码并运行监控容器

相关推荐
wb1895 小时前
Kubernetes服务优化
云原生·容器·kubernetes
Waay10 小时前
图文详解|K8s Pod内部结构
docker·云原生·kubernetes
openFuyao11 小时前
以开源之力,突破多样化算力困局——openFuyao开源一周年背后的故事
人工智能·云原生·开源·openfuyao·多样化算力·集群软件
JiaWen技术圈11 小时前
IaC 双引擎:Terraform + Ansible 完整最佳实践
云原生·ansible·terraform
步步为营DotNet16 小时前
深入.NET 11:.NET Aspire 在云原生资源编排与管理的卓越实践
云原生·.net
密瓜智能16 小时前
HAMi 正式接入 Kubernetes DRA:下一代 GPU 资源模型实践指南
云原生·容器·kubernetes
Elastic 中国社区官方博客17 小时前
用于调试 LLM 延迟、成本和 GPU 饱和度的 ES|QL 查询
大数据·人工智能·elasticsearch·搜索引擎·ai·云原生·serverless
李李李li17 小时前
debian13.3安装k8s
云原生·容器·kubernetes
姚不倒17 小时前
Go语言实战:构建一个安全的计算器服务(接口、错误处理与Panic恢复)
云原生·golang
AI云原生17 小时前
远程控制软件进入协作阶段:ToDesk、向日葵、AnyDesk、RustDesk怎么选?
运维·服务器·网络·windows·docker·云原生·开源软件