全部产品
Search
文档中心

在容器内获取元数据

更新时间: 2021-07-21

本文介绍如何在容器内获取元数据。

目前ECI提供三种方式可以将Pod(ECI实例)信息和容器Meta数据呈现给运行中的容器。

方式一:通过MetaServer访问元数据

您可以使用以下方式获取ECI实例元数据。

  1. 连接容器。具体操作,请参见调试ECI实例

  2. 执行以下命令访问元数据的根目录。

    curl http://100.100.100.200/latest/meta-data/
  3. 在URL中添加具体的元数据名称即可获取具体的元数据。

    例如:执行以下命令获取实例ID。

    curl http://100.100.100.200/latest/meta-data/instance-id

    ECI实例目前能获取的基本实例元数据项如下表所示:

    实例元数据项

    说明

    /dns-conf/nameservers

    实例的DNS配置。

    /eipv4

    实例的弹性公网IP(IPv4类型)。

    /hostname

    实例的主机名,对应ContainerGroupName。

    /instance-id

    实例ID。

    /mac

    实例的MAC地址。

    /network/interfaces/

    网卡的MAC地址列表。

    /network/interfaces/macs/[mac]/network-interface-id

    网卡的标识ID,其中[mac]参数需要替换为实例MAC地址。

    /network/interfaces/macs/[mac]/netmask

    网卡对应的子网掩码。

    /network/interfaces/macs/[mac]/vswitch-cidr-block

    网卡所属的虚拟交换机IPv4 CIDR段。

    /network/interfaces/macs/[mac]/vpc-cidr-block

    网卡所属的VPC IPv4 CIDR段。

    /network/interfaces/macs/[mac]/private-ipv4s

    网卡分配的私网IPv4地址列表。

    /network/interfaces/macs/[mac]/vpc-ipv6-cidr-blocks

    网卡所属的VPC IPv6 CIDR段,仅支持已配置了IPv6的VPC类型实例。

    /network/interfaces/macs/[mac]/vswitch-id

    网卡所属安全组的虚拟交换机ID。

    /network/interfaces/macs/[mac]/vpc-id

    网卡所属安全组的VPC ID。

    /network/interfaces/macs/[mac]/primary-ip-address

    网卡主私有IP地址。

    /network/interfaces/macs/[mac]/gateway

    网卡对应的IPv4网关地址。

    /instance/max-netbw-egress

    实例规格的出方向内网最大带宽。单位:Kbit/s。

    /instance/max-netbw-ingerss

    实例规格的入方向内网最大带宽。单位:Kbit/s。

    /network/interfaces/macs/[mac]/ipv6s

    网卡分配的IPv6地址列表,仅支持已配置了IPv6的VPC类型实例。

    /network/interfaces/macs/[mac]/ipv6-gateway

    网卡所属的VPC的IPv6网关地址。

    /network/interfaces/macs/[mac]/vswitch-ipv6-cidr-block

    网卡所属的虚拟交换机IPv6 CIDR段,仅支持已配置了IPv6的VPC类型实例。

    /private-ipv4

    实例的私网IPv4地址。

    /ntp-conf/ntp-servers

    NTP服务器地址。

    /owner-account-id

    实例拥有者的阿里云账号ID。

    /region-id

    实例所属地域。

    /serial-number

    实例所对应的序列号。

    /vpc-id

    实例所属VPC ID。

    /vpc-cidr-block

    实例所属VPC的CIDR网段。

    /vswitch-cidr-block

    实例所属虚拟交换机的CIDR网段。

    /vswitch-id

    实例所属虚拟交换机ID。

    /zone-id

    实例所属可用区。

    /ram/security-credentials/[role-name]

    实例RAM角色策略所生成的STS临时凭证。只有在实例指定了RAM角色后,您才能获取STS临时凭证。其中[role-name]参数需要替换为实例RAM角色的名称。如果未指定[role-name],将返回实例RAM角色名称。

方式二:配置容器环境变量

通过配置ECI实例容器环境变量的Value便可获取实例相关信息,ECI实例目前可以获取到实例ID、实例名称、实例所属地域、实例所属可用区、实例容器名称等元数据项。

Key

Value

说明

eci_id

__ECI_ID__

实例ID。

eci_name

__ECI_NAME__

实例名称。

region_id

__REGION_ID__

实例所属地域。

zone_id

__ZONE_ID__

实例所属可用区。

container_name

__CONTAINER_NAME__

实例容器名称。

params = {
        'Container.1.Image': 'registry-vpc.cn-shanghai.aliyuncs.com/eci_open/nginx:alpine',
        'Container.1.Name': 'nginx',
        'SecurityGroupId': 'sg-uf6biempwqvodk7a****',
        'VSwitchId': 'vsw-uf6mhqg2wiq9iifhn****',
        'ContainerGroupName': 'test-env',
        # 自定义环境变量
        'Container.1.EnvironmentVar.1.Key': 'eci_id',
        'Container.1.EnvironmentVar.2.Key': 'eci_name',
        'Container.1.EnvironmentVar.3.Key': 'region_id',
        'Container.1.EnvironmentVar.4.Key': 'zone_id',
        'Container.1.EnvironmentVar.5.Key': 'container_name',
        'Container.1.EnvironmentVar.1.Value': '__ECI_ID__',
        'Container.1.EnvironmentVar.2.Value': '__ECI_NAME__',
        'Container.1.EnvironmentVar.3.Value': '__REGION_ID__',
        'Container.1.EnvironmentVar.4.Value': '__ZONE_ID__',
        'Container.1.EnvironmentVar.5.Value': '__CONTAINER_NAME__',
    }

您可以通过控制台连接容器查看是否生效。具体操作,请参见调试ECI实例view

方式三:Downward API

Kubernetes Downward API提供了以下两种方式:

  • 环境变量(Environment variables)

    用于单个变量,可以将Pod信息直接注入容器内部。

  • Volume挂载(Volume Files)

    可以将Pod信息生成为文件,直接挂载到容器内部。

目前阿里云容器服务Kubernetes(ACK和ASK)和弹性容器实例(ECI),已经支持了Downward API的大部分常用字段,下文将为您介绍使用方式。

  • 环境变量方式

您可以通过Downward API将Pod的名称、命名空间、IP等信息注入到容器的环境变量中。通过环境变量可以获得的值如下表所示。

参数

描述

metadata.name

Pod名称。

metadata.namespace

Pod命名空间。

metadata.uid

Pod的UID。

metadata.labels['<KEY>']

Pod的标签值。

metadata.annotations['<KEY>']

Pod的注解值。

spec.serviceAccountName

Pod服务账号名称。

spec.nodeName

节点名称。

status.podIP

节点IP。

Deployment示例如下:

apiVersion: apps/v1 # for versions before 1.8.0 use apps/v1beta1
kind: Deployment
metadata:
  name: vk-downward-env
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
        annotations: 
            regionId: cn-beijing
            platform: Aliyun ECI
        labels:
            app: nginx
            env: test
    spec:
      containers:
      - name: nginx
        image: nginx
        env:
        - name: MY_metadata.name
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: MY_metadata.namespace
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: MY_metadata.uid
          valueFrom:
            fieldRef:
              fieldPath: metadata.uid
        - name: MY_metadata.labels
          valueFrom:
            fieldRef:
              fieldPath: metadata.labels['env']
        - name: MY_metadata.annotations
          valueFrom:
            fieldRef:
              fieldPath: metadata.annotations['regionId']
        - name: MY_status.podIP
          valueFrom:
            fieldRef:
              fieldPath: status.podIP
        - name: MY_spec.serviceAccountName
          valueFrom:
            fieldRef:
              fieldPath: spec.serviceAccountName
        - name: MY_spec.nodeName
          valueFrom:
            fieldRef:
              fieldPath: spec.nodeName

登入容器查看环境变量,可以看到fieldRef已经生效。示例如下:

root@default-vk-downward-env:/# env
MY_spec.nodeName=virtual-kubelet
MY_spec.serviceAccountName=default
MY_metadata.annotations=cn-beijing
MY_metadata.namespace=default
MY_metadata.uid=f4881309-f3dd-11e9-bcf9-9efaf54dcfa7
MY_metadata.name=vk-downward-env
MY_metadata.labels=test
MY_status.podIP=192.168.6.245
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_SERVICE_PORT=6443
PWD=/
PKG_RELEASE=1~buster
HOME=/root
KUBERNETES_PORT_443_TCP=tcp://172.22.*.*:443
NJS_VERSION=0.3.5
TERM=xterm
SHLVL=1
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_ADDR=172.22.*.*
KUBERNETES_SERVICE_HOST=192.168.*.*
KUBERNETES_PORT=tcp://172.22.*.*:443
KUBERNETES_PORT_443_TCP_PORT=443
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
NGINX_VERSION=1.17.4
_=/usr/bin/env
  • Volume挂载方式

您可以通过Downward API将Pod的Label、Annotation等信息通过Volume挂载到容器的某个文件中。通过Volume挂载可以获得的值如下表所示。

参数

描述

metadata.name

Pod名称。

metadata.namespace

Pod命名空间。

metadata.uid

Pod的UID。

metadata.labels['<KEY>']

Pod的标签值。

metadata.annotations['<KEY>']

Pod的注解值。

metadata.labels

Pod的所有标签。

metadata.annotations

Pod的所有注解。

说明

目前仅支持Pod字段,还不支持容器字段,例如:limits.cpu、requests.cpu、limits.memory、requests.memory、limits.ephemeral-storage、requests.ephemeral-storage。

Deployment示例如下:

apiVersion: apps/v1beta2 # for versions before 1.8.0 use apps/v1beta1
kind: Deployment
metadata:
  name: vk-downward-down-volume
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
        annotations: 
            regionId: cn-beijing
            platform: Aliyun ECI
        labels:
            app: nginx
            env: test
    spec:
      containers:
      - name: nginx
        image: nginx
        volumeMounts:
        - name: podinfo
          mountPath: /etc/podinfo
          readOnly: false
      volumes:
      - name: podinfo
        downwardAPI:
          items:
            - path: "metadata.name"
              fieldRef:
                fieldPath: metadata.name
            - path: "metadata.namespace"
              fieldRef:
                fieldPath: metadata.namespace
            - path: "metadata.uid"
              fieldRef:
                fieldPath: metadata.uid
            - path: "metadata.labels"
              fieldRef:
                fieldPath: metadata.labels
            - path: "metadata.annotations"
              fieldRef:
                fieldPath: metadata.annotations
      nodeName: virtual-kubelet

登入容器查看volume的挂载目录,可以看到volume的fieldRef已经生效,并存储在容器指定的目录下。示例如下:

Welcome to Alibaba Cloud Elastic Container Instance!
root@default-vk-downward-down-volume:/# cd /etc/podinfo/
root@default-vk-downward-down-volume:/etc/podinfo# ls
metadata.annotations  metadata.labels  metadata.name  metadata.namespace  metadata.uid
root@default-vk-downward-down-volume:/etc/podinfo# cat metadata.namespace 
default
root@default-vk-downward-down-volume:/etc/podinfo# cat metadata.name
vk-downward-down-volume
root@default-vk-downward-down-volume:/etc/podinfo# cat metadata.uid 
fa50b2b2-f3e3-11e9-bcf9-9efaf54dcfa7
root@default-vk-downward-down-volume:/etc/podinfo# cat metadata.annotations 
platform="Aliyun ECI"
regionId="cn-beijing"
root@default-vk-downward-down-volume:/etc/podinfo# cat metadata.labels 
app="nginx"
env="test"
root@default-vk-downward-down-volume:/etc/podinfo#