grpc和.sock文件

53 阅读2分钟

之前写自定义snapshotter时候,了解到containerd和外部snapshotter是通过grpc通信的,个人对grpc不是很了解,所以就学习一下,并记录分享一些个人理解。

.sock文件

本质:1..sock 文件就是 Unix 域套接字 (Unix Domain Socket, UDS) 的一个文件路径形式;2.它和 TCP/UDP socket 类似,都是套接字通信机制,但限定在本机进程之间通信;3.文件系统路径就是它的“地址”,例如 /run/containerd/containerd.sock
特点:1.仅限本机:比 TCP 快,因为不经过网络协议栈。2.安全性好:可以用文件权限(chmod/chown)来控制哪个进程能连接。3.类型:常见是 SOCK_STREAM(流式,像 TCP),gRPC 正是基于它实现。
containerd使用的 .sock 文件 当运行的 snapshotter 插件创建了 socket后,会在磁盘上出现一个文件(xxx.sock)。containerd 配置了这个路径后,会像“电话机插口”一样,通过这个文件找到snapshotter的进程,建立 gRPC 通道。

grpc

gRPC 是基于 HTTP/2protobuf 的远程过程调用框架。用 IDL(protobuf 文件)定义接口,自动生成服务端/客户端代码。通信底层既可以走 TCP,也可以走 Unix socket。

snapshotter和.sock、grpc

自定义snapshotter和containerd是两个独立的进程,他们之间是通过.sock文件通信的,而使用.sock文件通信需要用到grpc框架。
在 snapshotter 场景下:containerd 就是 gRPC 客户端。snapshotter 插件是 gRPC 服务端。通信方式是 gRPC over Unix socket(不是走 TCP 端口)。
对于自定义snapshotter实现的那些方法,containerd 调用时就是一次 gRPC 请求,返回数据就是 protobuf 序列化的响应。

总结

  • .sock门牌号,标识本地进程间通信的入口。
  • gRPC 是电话协议,定义了说什么话(接口)、怎么说(protobuf 序列化)、怎么传输(HTTP/2 over Unix socket)。
  • containerd 通过 .sock 找到你的插件进程,用 gRPC 远程调用 snapshot API。