全部產品
Search
文件中心

Elastic Container Instance:在容器內擷取中繼資料

更新時間:Jul 06, 2024

ECI Pod(即ECI執行個體)的中繼資料可以提供關於Pod及其容器的資訊用於管理和使用容器,例如名稱、ID等基本資料,以及IP地址、網卡等網路資訊等。本文介紹如何在容器內擷取中繼資料,將ECI Pod資訊和容器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

    執行個體的Elastic IP Address(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__

登入容器查看環境變數,可以看到環境變數已經生效。樣本如下:

K8s擷取中繼資料

方式三: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已經生效。樣本如下:

downward

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已經生效,並儲存在容器指定的目錄下。樣本如下:

K8s擷取中繼資料2