在容器內(nèi)獲取元數(shù)據(jù)
ECI Pod(即ECI實例)的元數(shù)據(jù)可以提供關(guān)于Pod及其容器的信息用于管理和使用容器,例如名稱、ID等基本信息,以及IP地址、網(wǎng)卡等網(wǎng)絡(luò)信息等。本文介紹如何在容器內(nèi)獲取元數(shù)據(jù),將ECI Pod信息和容器Meta數(shù)據(jù)呈現(xiàn)給運行中的容器。
方式一:通過MetaServer訪問元數(shù)據(jù)
連接容器。具體操作,請參見連接ECI實例。
訪問元數(shù)據(jù)。
說明如果容器環(huán)境沒有安裝curl,請先安裝curl。
curl http://100.100.100.200/latest/meta-data/<metadata>
<metadata>
請?zhí)鎿Q為具體要查詢的實例元數(shù)據(jù)。例如執(zhí)行以下命令獲取實例ID。curl http://100.100.100.200/latest/meta-data/instance-id
ECI實例目前能獲取的基本實例元數(shù)據(jù)項如下表所示:
實例元數(shù)據(jù)項
說明
/dns-conf/nameservers
實例的DNS配置。
/eipv4
實例的彈性公網(wǎng)IP(IPv4類型)。
/hostname
實例的主機名,對應(yīng)ContainerGroupName。
/instance-id
實例ID。
/mac
實例的MAC地址。
/network/interfaces/
網(wǎng)卡的MAC地址列表。
/network/interfaces/macs/[mac]/network-interface-id
網(wǎng)卡的標識ID,其中[mac]參數(shù)需要替換為實例MAC地址。
/network/interfaces/macs/[mac]/netmask
網(wǎng)卡對應(yīng)的子網(wǎng)掩碼。
/network/interfaces/macs/[mac]/vswitch-cidr-block
網(wǎng)卡所屬的虛擬交換機IPv4 CIDR段。
/network/interfaces/macs/[mac]/vpc-cidr-block
網(wǎng)卡所屬的VPC IPv4 CIDR段。
/network/interfaces/macs/[mac]/private-ipv4s
網(wǎng)卡分配的私網(wǎng)IPv4地址列表。
/network/interfaces/macs/[mac]/vpc-ipv6-cidr-blocks
網(wǎng)卡所屬的VPC IPv6 CIDR段,僅支持已配置了IPv6的VPC類型實例。
/network/interfaces/macs/[mac]/vswitch-id
網(wǎng)卡所屬安全組的虛擬交換機ID。
/network/interfaces/macs/[mac]/vpc-id
網(wǎng)卡所屬安全組的VPC ID。
/network/interfaces/macs/[mac]/primary-ip-address
網(wǎng)卡主私有IP地址。
/network/interfaces/macs/[mac]/gateway
網(wǎng)卡對應(yīng)的IPv4網(wǎng)關(guān)地址。
/instance/max-netbw-egress
實例規(guī)格的出方向內(nèi)網(wǎng)最大帶寬。單位:Kbit/s。
/instance/max-netbw-ingerss
實例規(guī)格的入方向內(nèi)網(wǎng)最大帶寬。單位:Kbit/s。
/network/interfaces/macs/[mac]/ipv6s
網(wǎng)卡分配的IPv6地址列表,僅支持已配置了IPv6的VPC類型實例。
/network/interfaces/macs/[mac]/ipv6-gateway
網(wǎng)卡所屬的VPC的IPv6網(wǎng)關(guān)地址。
/network/interfaces/macs/[mac]/vswitch-ipv6-cidr-block
網(wǎng)卡所屬的虛擬交換機IPv6 CIDR段,僅支持已配置了IPv6的VPC類型實例。
/private-ipv4
實例的私網(wǎng)IPv4地址。
/ntp-conf/ntp-servers
NTP服務(wù)器地址。
/owner-account-id
實例擁有者的阿里云賬號ID。
/region-id
實例所屬地域。
/serial-number
實例所對應(yīng)的序列號。
/vpc-id
實例所屬VPC ID。
/vpc-cidr-block
實例所屬VPC的CIDR網(wǎng)段。
/vswitch-cidr-block
實例所屬虛擬交換機的CIDR網(wǎng)段。
/vswitch-id
實例所屬虛擬交換機ID。
/zone-id
實例所屬可用區(qū)。
/ram/security-credentials/[role-name]
實例RAM角色策略所生成的STS臨時憑證。只有在實例指定了RAM角色后,您才能獲取STS臨時憑證。其中[role-name]參數(shù)需要替換為實例RAM角色的名稱。如果未指定[role-name],將返回實例RAM角色名稱。
方式二:配置容器的環(huán)境變量
通過容器環(huán)境變量的Value可以獲取ECI實例的元數(shù)據(jù)。支持配置環(huán)境變量獲取的元數(shù)據(jù)項如下:
Key | Value | 說明 |
eci_id | __ECI_ID__ | 實例ID。 |
eci_name | __ECI_NAME__ | 實例名稱。 |
region_id | __REGION_ID__ | 實例所屬地域。 |
zone_id | __ZONE_ID__ | 實例所屬可用區(qū)。 |
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__
登入容器查看環(huán)境變量,可以看到環(huán)境變量已經(jīng)生效。示例如下:
方式三:Downward API
Kubernetes Downward API提供了以下兩種方式:
環(huán)境變量
用于單個變量,可以將Pod信息直接注入容器內(nèi)部。
Volume掛載
可以將Pod信息生成為文件,直接掛載到容器內(nèi)部。
目前ACK+ECI已經(jīng)支持了Downward API的大部分常用字段,下文將為您介紹使用方式。
環(huán)境變量方式
您可以通過Downward API將Pod的名稱、命名空間、IP等信息注入到容器的環(huán)境變量中。通過環(huán)境變量可以獲得的元數(shù)據(jù)項如下表所示。
參數(shù) | 描述 |
metadata.name | Pod名稱。 |
metadata.namespace | Pod命名空間。 |
metadata.uid | Pod的UID。 |
metadata.labels['<KEY>'] | Pod的標簽值。 |
metadata.annotations['<KEY>'] | Pod的注解值。具體請參見ECI Pod Annotation。 |
spec.serviceAccountName | Pod服務(wù)賬號名稱。 |
spec.nodeName | 節(jié)點名稱。 |
status.podIP | 節(jié)點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
登入容器查看環(huán)境變量,可以看到fieldRef已經(jīng)生效。示例如下:
Volume掛載方式
您可以通過Downward API將Pod的Label、Annotation等信息通過Volume掛載到容器的某個文件中。通過Volume掛載可以獲得的元數(shù)據(jù)項如下表所示。
參數(shù) | 描述 |
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已經(jīng)生效,并存儲在容器指定的目錄下。示例如下: