ECI Pod(即ECI实例)的元数据可以提供关于Pod及其容器的信息用于管理和使用容器,例如名称、ID等基本信息,以及IP地址、网卡等网络信息等。本文介绍如何在容器内获取元数据,将ECI Pod信息和容器Meta数据呈现给运行中的容器。
方式一:通过MetaServer访问元数据
连接容器。具体操作,请参见连接ECI实例。
访问元数据。
说明如果容器环境没有安装curl,请先安装curl。
curl http://100.100.100.200/latest/meta-data/<metadata>
<metadata>
请替换为具体要查询的实例元数据。例如执行以下命令获取实例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角色名称。
方式二:配置容器的环境变量
通过容器环境变量的Value可以获取ECI实例的元数据。支持配置环境变量获取的元数据项如下:
Key | Value | 说明 |
eci_id | __ECI_ID__ | 实例ID。 |
eci_name | __ECI_NAME__ | 实例名称。 |
region_id | __REGION_ID__ | 实例所属地域。 |
zone_id | __ZONE_ID__ | 实例所属可用区。 |
container_name | __CONTAINER_NAME__ | 容器名称。 |
配置示例如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: test
labels:
app: test
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
name: nginx-test
labels:
app: nginx
alibabacloud.com/eci: "true"
spec:
containers:
- name: nginx
image: registry.cn-shanghai.aliyuncs.com/eci_open/nginx:1.14.2
ports:
- containerPort: 80
env:
- name: eci_id
value: __ECI_ID__
- name: eci_name
value: __ECI_NAME__
- name: region_id
value: __REGION_ID__
- name: zone_id
value: __ZONE_ID__
- name: container_name
value: __CONTAINER_NAME__
登入容器查看环境变量,可以看到环境变量已经生效。示例如下:
方式三:Downward API
Kubernetes Downward API提供了以下两种方式:
环境变量
用于单个变量,可以将Pod信息直接注入容器内部。
Volume挂载
可以将Pod信息生成为文件,直接挂载到容器内部。
目前阿ACK+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的注解值。具体请参见ECI Pod Annotation。 |
spec.serviceAccountName | Pod服务账号名称。 |
spec.nodeName | 节点名称。 |
status.podIP | 节点IP。 |
Deployment示例如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: 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
alibabacloud.com/eci: "true"
spec:
containers:
- name: nginx
image: registry-vpc.cn-beijing.aliyuncs.com/eci_open/nginx:1.14.2
env:
- name: METADATA_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: METADATA_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: METADATA_UID
valueFrom:
fieldRef:
fieldPath: metadata.uid
- name: METADATA_LABELS
valueFrom:
fieldRef:
fieldPath: metadata.labels['env']
- name: METADATA_ANNOTATIONS_REGION
valueFrom:
fieldRef:
fieldPath: metadata.annotations['regionId']
- name: METADATA_ANNOTATIONS_ECI_INSTANCE_ID
valueFrom:
fieldRef:
fieldPath: metadata.annotations['k8s.aliyun.com/eci-instance-id']
- name: STATUS_POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: SPEC_SERVICE_ACCOUNT_NAME
valueFrom:
fieldRef:
fieldPath: spec.serviceAccountName
登入容器查看环境变量,可以看到fieldRef已经生效。示例如下:
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/v1
kind: Deployment
metadata:
name: 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
alibabacloud.com/eci: "true"
spec:
containers:
- name: nginx
image: registry-vpc.cn-beijing.aliyuncs.com/eci_open/nginx:1.14.2
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
登入容器查看Volume的挂载目录,可以看到Volume的fieldRef已经生效,并存储在容器指定的目录下。示例如下: