实例与宿主机之间的通信

托管工作负载(实例)与其宿主机之间的通信,虽然并非严格必要,但却是非常有用的功能。

在 Incus 中,此功能是通过 /dev/incus/sock 节点实现的,该节点为所有 Incus 实例创建和设置。

此文件是一个 Unix 套接字,实例内部的进程可以连接到它。它是多线程的,因此多个客户端可以同时连接。

注意

security.guestapi 必须设置为 true(默认值),以便实例允许访问套接字。

实现细节

宿主机上的 Incus 绑定 /var/lib/incus/guestapi/sock 并开始监听其上的新连接。

然后,此套接字会暴露到 Incus 在 /dev/incus/sock 启动的每个实例中。

需要单个套接字,以便我们可以超过 4096 个实例,否则,Incus 将不得不为每个实例绑定一个不同的套接字,从而很快达到 FD 限制。

身份验证

/dev/incus/sock 的查询只会返回与请求实例相关的信息。为了确定请求来自何处,Incus 将提取初始套接字的用户凭据,并将其与它管理的实例列表进行比较。

协议

/dev/incus/sock 上的协议是带有 JSON 消息的纯文本 HTTP,因此与 Incus 协议的本地版本非常相似。

与主 Incus API 不同,/dev/incus/sock API 中没有后台操作和身份验证支持。

REST-API

API 结构

  • /

    • /1.0

      • /1.0/config

        • /1.0/config/{key}

      • /1.0/devices

      • /1.0/events

      • /1.0/images/{fingerprint}/export

      • /1.0/meta-data

API 细节

/

GET
  • 描述:支持的 API 列表

  • 返回值:支持的 API 端点 URL 列表(默认情况下为 ['/1.0']

返回值

[
    "/1.0"
]

/1.0

GET
  • 描述:关于 1.0 API 的信息

  • 返回值:JSON 对象

返回值

{
    "api_version": "1.0",
    "location": "foo.example.com",
    "instance_type": "container",
    "state": "Started",
}

PATCH

  • 描述:更新实例状态(有效状态为 ReadyStarted

  • 返回值:无

输入

{
   "state": "Ready"
}

/1.0/config

GET
  • 描述:配置键列表

  • 返回值:配置键 URL 列表

请注意,配置键名称与实例配置中的名称匹配,但并非所有配置命名空间都将导出到 /dev/incus/sock。目前,只有 cloud-init.*user.* 键可供实例访问。

目前,也没有任何实例可写命名空间。

返回值

[
    "/1.0/config/user.a"
]

/1.0/config/<KEY>

GET
  • 描述:该键的值

  • 返回值:纯文本值

返回值

blah

/1.0/devices

GET
  • 描述:实例设备映射

  • 返回值:JSON 对象

返回值

{
    "eth0": {
        "name": "eth0",
        "network": "incusbr0",
        "type": "nic"
    },
    "root": {
        "path": "/",
        "pool": "default",
        "type": "disk"
    }
}

/1.0/events

GET
  • 描述:WebSocket 升级

  • 返回值:无(事件的永不结束的流)

支持的参数为

  • 类型:要订阅的通知的逗号分隔列表(默认为全部)

通知类型如下:

  • config(任何user.*配置键的更改)

  • device(任何设备添加、更改或删除)

此操作不会返回。每个通知都作为单独的 JSON 对象发送。

{
    "timestamp": "2017-12-21T18:28:26.846603815-05:00",
    "type": "device",
    "metadata": {
        "name": "kvm",
        "action": "added",
        "config": {
            "type": "unix-char",
            "path": "/dev/kvm"
        }
    }
}
{
    "timestamp": "2017-12-21T18:28:26.846603815-05:00",
    "type": "config",
    "metadata": {
        "key": "user.foo",
        "old_value": "",
        "value": "bar"
    }
}

/1.0/images/<FINGERPRINT>/export

GET
  • 描述:从主机下载公共/缓存的图像。

  • 返回:原始图像或错误。

  • 访问:需要将security.guestapi.images设置为true

返回值

See /1.0/images/<FINGERPRINT>/export in the daemon API.

/1.0/meta-data

GET
  • 描述:与 cloud-init 兼容的容器元数据。

  • 返回:cloud-init 元数据。

返回值

#cloud-config
instance-id: af6a01c7-f847-4688-a2a4-37fddd744625
local-hostname: abc