如何使用grpcurl正确调用containerd的gRPC API?
unknown service types.API报错的核心原因是使用了适配containerd 0.x早期测试版的过时proto定义。1.0及以上正式版本的containerd对gRPC API做了全量重构,旧版types.API相关的服务已经被完全移除,不管怎么调整服务名的点/斜杠写法、替换protoset文件都不可能调用成功。
正确操作步骤
- 开启containerd的gRPC反射功能
编辑containerd配置文件(默认路径/etc/containerd/config.toml),在[grpc]配置段下添加配置项:
保存后执行命令重启服务生效:enable_reflection = truesystemctl restart containerd - 查询服务端真实暴露的服务列表
开启反射后不需要手动指定proto或protoset文件,直接执行以下命令就能列出当前containerd实际支持的所有gRPC服务:
正常输出的服务都是sudo grpcurl -plaintext -unix /run/containerd/containerd.sock listcontainerd.services.*前缀,常见服务包括:- 版本查询服务:
containerd.services.version.v1.Version - 容器管理服务:
containerd.services.containers.v1.Containers - 任务/运行时服务:
containerd.services.tasks.v1.Tasks
- 版本查询服务:
- 发起基础gRPC调用示例
查询containerd版本信息直接执行:
命令会直接返回JSON格式的版本号、提交哈希、运行时版本等信息。sudo grpcurl -plaintext -unix /run/containerd/containerd.sock containerd.services.version.v1.Version/Version
你之前要调用的状态/统计接口,对应任务服务下的Metrics方法,调用时需要传入目标容器ID参数:sudo grpcurl -plaintext -unix /run/containerd/containerd.sock -d '{"id":"替换成实际容器ID"}' containerd.services.tasks.v1.Tasks/Metrics
额外说明
你之前下载的api/grpc/types/api.proto是containerd早期0.2.x版本遗留的旧API文件,和现在所有主流发行版、官方源提供的containerd 1.x/2.x版本完全不兼容,不需要再使用这套旧文件做调用。如果不想开启反射,也可以使用对应containerd版本自带的新版proto定义,路径为containerd/services/下按模块、版本划分的proto文件,不要使用旧的types路径下的文件。
内容的提问来源于stack exchange,提问作者itasahobby
相关产品推荐
相关产品推荐

