• metadata服务
    • 如何获取Metadata
    • Metadata的版本
      • 版本变化
        • V1 vs. V2
        • 范例
    • 纯文本 vs JSON
      • 纯文本
      • JSON
    • Metadata属性
      • 容器
      • 服务
      • 应用
      • 主机
    • 为服务添加用户自定义Metadata
      • Example rancher-compose.yml
      • 按照JSON格式查询
      • 按照纯文本格式查询

    metadata服务


    Rancher通过基础设施中的Metadata服务为服务和容器提供数据。这些数据用来管理运行中的docker实例。这些数据可以通过调用基于HTTP的API来访问。这些数据包括创建容器,服务时的静态数据,也包括运行时数据,例如:在同一个服务里的其他容器的相关信息。

    通过Rancher的Metadata服务,您可以进到任何使用Rancher托管网络的容器的命令行中,并查看运行在Rancher中的容器的信息。通过Metadata服务您可以获取容器,服务,容器所在的应用,容器所在的主机。Metadata是JSON格式的。

    有多种方式可以将容器运行在Rancher托管网络中。Rancher网络的原理详见网络相关文档。

    如何获取Metadata

    通过Rancher UI,您可以通过容器的下拉菜单的执行命令行进入运行命令界面。在鼠标悬停在容器上时,会显示容器名和右侧的下拉菜单。

    您可以通过curl命令获取metadata信息。

    1. # If curl is not installed, install it
    2. $ apt-get install curl
    3. # Basic curl command to obtain a plaintext response
    4. $ curl http://rancher-metadata/<version>/<path>

    curl请求的路径取决于您想要获取的metadata信息和格式。

    Metadata路径描述
    容器self/container提供运行命令的容器的metadata信息
    容器所在服务self/service提供运行命令的容器对应服务的metadata信息
    容器所在应用self/stack提供运行命令的容器对应应用的metadata信息
    容器所在主机self/host提供运行命令的容器对应主机的metadata信息
    其他容器containers提供所有容器的metadata信息。在纯文本格式时,提供了带上索引序号的所有容器。在JSON格式,提供了所有容器的所有metadata信息。使用序号或者名字。都可以获取指定容器的metadata信息。
    其他服务services提供了所有服务的metadata信息。在纯文本格式时,提供了带上索引序号的所有服务。在JSON格式,提供了所有服务的所有metadata信息。在路径中使用序号或者名字,都可以获取指定服务的metadata信息。当访问容器详细信息时,在V1 (2015-07-25)只返回容器名称,但是在V2 (2015-12-19),容器实例也会返回。
    其他应用stacks/<stack-name>提供了所有应用的metadata信息。在纯文本格式,提供了带上索引序号的所有应用。在JSON格式,提供了所有应用的所有metadata信息。使用序号或者名字。都可以获取指定容器的metadata信息。在路径中使用序号或者名字,都可以获取指定应用的metadata信息。当访问container详细信息时,在V1 (2015-07-25)只返回容器名称,但是在V2 (2015-12-19),容器实例也会返回。

    Metadata的版本

    curl命令中,我们强烈建议使用确定的版本号,但是您也可以选者latest

    注意: 因为latest版本会包含最新的代码变动,各个版本的返回的数据可能不同,需要确认是否和您之前的代码能够兼容。

    metadata的版本是基于日期的。

    Version ReferenceVersion
    V22015-12-19
    V12015-07-25

    版本变化

    V1 vs. V2

    当通过http请求访问路径 /services/<service-name>/containers或者/stacks/<stack-name>/services/<service-name>/containers时, V1 返回容器名称,V2返回容器实例。更多详细信息在V2 metadata服务中提供。

    范例

    在Rancher中,名为foostack的应用包含一个有三个容器的服务 barservice

    1. # 在V1只返回service的container names
    2. $ curl --header 'Accept: application/json' 'http://rancher-metadata/2015-07-25/services/barservice/containers'
    3. ["foostack_barservice_1", "foostack_barservice_2", "foostack_barservice_1"]
    4.  
    5. # 在V2中返回service的container objects
    6. $ curl --header 'Accept: application/json' 'http://rancher-metadata/2015-12-19/services/barservice/containers'
    7. [{"create_index":1, "health_state":null,"host_uuid":...
    8. ...
    9. # 获取service中所有容器的metadata信息
    10. ...
    11. ...}]
    12.  
    13. # 在V2,可以获取指定的container object
    14. $ curl --header 'Accept: application/json' 'http://rancher-metadata/2015-12-19/services/barservice/containers/foostack_barservice_1'
    15. [{"create_index":1, "health_state":null,"host_uuid":...
    16. ...
    17. # 获取service中所有容器的metadata信息
    18. ...
    19. ...}]
    20.  
    21. # 通过路径 /stacks/<service-name>,可以访问services和containers
    22.  
    23. # 使用V1只返回service的container names
    24. $ curl --header 'Accept: application/json' 'http://rancher-metadata/2015-07-25/stacks/foostack/services/barservice/containers'
    25. ["foostack_barservice_1", "foostack_barservice_2", "foostack_barservice_1"]
    26.  
    27. # 使用V2返回service的container objects
    28. $ curl --header 'Accept: application/json' 'http://rancher-metadata/2015-12-19/stacks/foostack/services/barservice/containers'
    29. [{"create_index":1, "health_state":null,"host_uuid":...
    30. ...
    31. # 获取service中所有容器的metadata信息
    32. ...
    33. ...}]

    纯文本 vs JSON

    Metadata返回有纯文本和JSON两种格式,根据需要选择相应格式.

    纯文本

    通过curl命令,会获得请求路径的纯文本格式返回。您可以通过从第一层路径开始,层层推进,找到您需要的信息。

    1. $ curl 'http://rancher-metadata/2015-12-19/self/container'
    2. create_index
    3. dns/
    4. dns_search/
    5. external_id
    6. health_check_hosts/
    7. health_state
    8. host_uuid
    9. hostname
    10. ips/
    11. labels/
    12. memory_reservation
    13. milli_cpu_reservation
    14. name
    15. network_from_container_uuid
    16. network_uuid
    17. ports/
    18. primary_ip
    19. primary_mac_address
    20. service_index
    21. service_name
    22. stack_name
    23. stack_uuid
    24. start_count
    25. state
    26. system
    27. uuid
    28. $ curl 'http://rancher-metadata/2015-12-19/self/container/name'
    29. # Note: Curl 不会返回新的行,只有一个数据时返回会输出在同一行
    30. Default_Example_1$root@<container_id>
    31. $ curl 'http://rancher-metadata/2015-12-19/self/container/label/io.rancher.stack.name'
    32. Default$root@<container_id>
    33. # Arrays可以通过序号或者名字访问
    34. $ curl 'http://rancher-metadata/2015-12-19/services'
    35. 0=Example
    36. # 使用序号或者名字
    37. $ curl 'http://rancher-metadata/2015-12-19/services/0'
    38. $ curl 'http://rancher-metadata/2015-12-19/services/Example'

    JSON

    JSON格式的返回可以通过在curl命令中增加header Accept: application/json

    1. $ curl --header 'Accept: application/json' 'http://rancher-metadata/2015-12-19/self/container'
    2. $ curl --header 'Accept: application/json' 'http://rancher-metadata/2015-12-19/self/stack'
    3. # 获取stack中另一个service的信息
    4. $ curl --header 'Accept: application/json' 'http://rancher-metadata/2015-12-19/services/<service-name>'

    Metadata属性

    容器

    属性描述
    create_index容器启动的序号 例如 2 代表的是服务中启动的第二个容器。注意: Create_index不会被重用。 如果您的服务包含两个容器,删除了第二个容器,下一个启动的容器的create_index会是3,即使服务中只包含2个容器
    dns容器的DNS服务器。
    dns_search容器的搜索域。
    external_id在主机上的Docker容器ID。
    health_check_hosts列出运行健康检查的主机的的UUIDs。
    health_state开启健康检查的容器的健康状态 健康检查。
    host_uuidRancher Server分配给主机的唯一标识。
    hostname容器的hostname。
    ips支持多NIC时的IP列表
    labels容器标签列表。格式为key:value
    memory_reservation容器可以使用内存的软限制。
    milli_cpu_reservation容器可以使用CPU的软限制,值为正整数,1代表1/1000CPU。所以,1000 代表1个CPU,500代表半个CPU。
    name容器的名字。
    network_from_container_uuid容器网络来源的容器UUID。
    network_uuidRancher分配的网络唯一标识
    ports列出容器使用的端口。格式为: hostIP:publicIP:privateIP[/protocol].
    primary_ip容器IP
    primary_mac_address容器的MAC地址
    service_index服务中容器名称的最后一个数字
    service_name服务名称(如果存在)
    stack_name服务所在的应用的名称(如果存在)
    stack_uuidRancher分配的应用的唯一标识
    start_count容器启动的次数
    state容器状态
    system容器是否是Rancher基础设施服务
    uuidRancher分配容器唯一标识

    服务

    属性描述
    containers列出服务中的容器名称
    create_index服务中最后启动的容器的序号 例如 2代表的是服务中启动的第二个容器。注意: Create_index不会被重用。 如果您的服务包含2个容器,删除了第二个容器,下一个启动的容器的create_index会是3,即使服务中只包含2个容器
    expose对主机暴露,但是不对外暴露的端口
    external_ips内部服务的IP列表
    fqdn服务的全称域名
    health_check服务的健康检查配置
    hostname内部服务的CNAME
    kindRancher的服务类型
    labels服务标签列表,格式为 key:value.
    lb_config负载均衡的配置
    links列出服务的链接,格式为stack_name/service∂_name:service_alias. links(例如 stack_name/service_name 获取所有链接)根据返回的service_alias,获取进一步的详细信息。
    metadata用户添加的metadata
    name服务名称
    ports服务使用的端口。格式hostIP:publicIP:privateIP[/protocol].
    primary_service_name主服务名,如果有从服务
    scale服务中容器的规模数量
    sidekicks从容器服务的名称列表
    stack_name服务所在的应用的名称
    stack_uuidRancher分配的应用的唯一标识
    system是否是基础设施服务
    uuidRancher分配的服务的唯一标识

    应用

    属性描述
    environment_name应用所在的环境的名字
    environment_uuidRancher分配的环境的唯一标识
    name应用名称
    services应用中的服务列表
    system应用是否为基础设施服务
    uuidRancher分配的应用的唯一标识

    主机

    属性描述
    agent_ipRancher Agent的IP,例如 CATTLE_AGENT_IP环境变量值。
    hostname主机的名称
    labels主机标签列表。格式为key:value.
    local_storage_mb主机的存储大小,单位为MB
    memory主机的内存大小,单位为MB
    milli_cpu主机的CPU。数值为整数,1代表1/1000的cpu。所以,1000代表1 CPU.
    name主机的名称
    uuidRancher分配的主机的唯一标识

    为服务添加用户自定义Metadata

    Rancher支持为服务添加用户metadata。现在只支持通过Rancher Compose添加,metadata是rancher-compose.yml的一部分。metadatakey对应的部分,yaml会被转化成在metadata-service中使用的JSON格式

    Example rancher-compose.yml

    1. service:
    2. # Scale of service
    3. scale: 3
    4. # User added metadata
    5. metadata:
    6. example:
    7. name: hello
    8. value: world
    9. example2:
    10. foo: bar

    服务启动后,可以使用metadata服务在…/self/service/metadata或者…/services/<service_id>/metadata看到metadata数据

    按照JSON格式查询

    1. $ curl --header 'Accept: application/json' 'http://rancher-metadata/latest/self/service/metadata'
    2. {"example":{"name":"hello","value":"world"},"example2":{"foo":"bar"}}

    按照纯文本格式查询

    1. $ curl 'http://rancher-metadata/latest/self/service/metadata'
    2. example/
    3. $ curl 'http://rancher-metadata/latest/self/service/metadata/example'
    4. name
    5. value
    6. $ curl 'http://rancher-metadata/latest/self/service/metadata/example/name'
    7. # # Note: Curl 不会返回新的行,只有一个数据时返回会输出在同一行
    8. hello$root@<container_id>