• k8s教程(09)-容器获取pod信息(Downward API)


    01 引言

    声明:本文为《Kubernetes权威指南:从Docker到Kubernetes实践全接触(第5版)》的读书笔记

    为了在容器内获取Pod级别的信息,Kubernetes提供了Downward API机制来将Pod和容器的某些元数据信息注入容器环境内,供容器应用方便地使用。

    Downward API可以通过以下两种方式将Pod和容器的元数据信息注入容器内部:

    1. 环境变量:将Pod或Container信息设置为容器内的环境变量;
    2. Volume挂载:将Pod或Container信息以文件的形式挂载到容器内部。

    本文来讲解这两种方式。

    02 容器获取pod信息方式

    2.1 环境变量方式

    通过环境变量的方式可以将Pod信息或Container信息注入容器运行环境中,下面举两个例子。

    2.1.1 设置Pod信息为容器内的环境变量

    下面的例子 通过Downward API将Pod的 IP、名称和所在命名空间 注入容器的环境变量中,Pod的YAML文件内容如下:
    在这里插入图片描述
    yaml设置的环境变量有:

    • spec.nodeName:Pod所在Node的名称;
    • metadata.name:Pod名称;
    • metadata.namespace:Pod所在命名空间的名称;
    • status.podIP:Pod的IP地址;
    • spec.serviceAccountName:Pod使用的ServiceAccount名称。

    使用命令创建pod之后,进入容器,可以看到环境变量的配置了:
    在这里插入图片描述

    2.1.2 设置Container信息为容器内的环境变量

    下面的例子 通过Downward API将 Container的资源请求 和 资源限制信息 设置为容器内的环境变量,Pod的YAML文件内容如下:
    在这里插入图片描述
    在这里插入图片描述
    环境变量如下:

    • requests.cpu:容器的CPU请求值;
    • limits.cpu:容器的CPU限制值;
    • requests.memory:容器的内存请求值;
    • limits.memory:容器的内存限制值。

    查看日志,从日志中可以看到Containerrequests.cpu、limits.cpu 、 requests.memory、limits.memory等信息都被正确保存到了容器内的环境变量中:
    在这里插入图片描述

    2.2 volume挂载方式

    通过Volume挂载方式可以 将Pod信息或Container信息 挂载为容器内的文件。

    2.2.1 挂载Pod信息为容器内的文件

    下面的例子 通过Downward API将Pod的Label、Annotation信息通过Volume 挂载为容器中的文件:
    在这里插入图片描述
    在这里插入图片描述
    volumes字段中使用Downward API的方法,通过fieldRef字段设置需要引用Pod的元数据信息,将其设置到volumeitems中。Pod元数据信息如下:

    • metadata.labels:Pod的Labelz列表.
    • metadata.namannotations:Pod的Annotation列表.

    然后,通过容器级别volumeMounts的设置,系统会基于volume中各item的 path名称生成文件

    根据上面的设置,系统将在容器内的/etc/podinfo目录下生成 labelsannotations两个文件,在labels文件中将包含Pod的全部Label列表,在annotations文件中将包含Pod的全部Annotation列表

    进入容器,查看挂载的文件:
    在这里插入图片描述
    查看labels的内容:
    在这里插入图片描述

    2.2.2 挂载Containert信息为容器内的文件

    下面的例子通过Downward API将 Container的资源限制信息通过Volume挂载为容器中的文件
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在本例中通过Downward API设置将以下Container的资源限制信息设置到
    Volume中
    ,内容如下:

    • requests.cpu:容器的CPU请求值;
    • limits.cpu:容器的CPU限制值;
    • requests.memory:容器的内存请求值;
    • limits…nemory:容器的内存限制值。

    进入容器,查看挂载文件:
    在这里插入图片描述
    查看cpu_limit内容:
    在这里插入图片描述

    03 Downward API 总结

    3.1 支持设置的元数据

    下面讲解 Downward API支持设置的Pod和Container信息

    ① 可以通过fieldRefi设置的元数据如下:

    元数据描述
    metadata.namePod名称
    metadata.namespacePod所在的命名空间名称
    metadata.uidPod的UID,从Kubernetes1.8.o-alpha.2版本开始支持
    metadata.labels[‘<KEY>’]Pod某个Label的值,通过进行引用,从Kubernetes1.9版本开始支持;
    metadata.annotations[‘<KEY>’]Pod某个Annotation的值,通过<KEY>进行引用,从Kubernetes1.9版本开始支持

    ② 可以通过resourceFieldRef设置的数据如下:

    • Container级别的CPU Limit;
    • Container级别的CPU Request;
    • Container级别的Memory Limit;
    • Container级别的Memory Request;
    • Container级别的临时存储空间(ephemeral-storage)Limit,从Kubernetes1.8.0-beta.o版本开始支持;
    • Container级别的临时存储空间(ephemeral-storage)Request,从Kubernetes1.8.0-beta.o版本开始支持。

    ③ 对以下信息通过fieldRef字段进行设置:

    元数据描述
    metadata.labelsPod的Label2列表,每个Labeli都以key为文件名,value为文件内容,每个Label各占一行
    metadata.namannotationsPod的Annotation列表,每个Annotation都以key为文件名,value为文件内容,每个Annotation各占一行

    ④ 以下Pod的元数据信息可以被设置为容器内的环境变量:

    元数据描述
    status.podIPPod的IP地址
    spec.serviceAccountNamePod使用的ServiceAccount名称
    spec.nodeNamePod所在Node的名称,从Kubernetes1.4.0-alpha.3版本开始支持
    status.hostIPPod所在Node的IP地址,从Kubernetes1.7.0-alpha.l版本开始支持

    3.2 在volume subPath中的应用

    有时容器内挂载目录的子路径(volumeMounts.subPath)也需要使用Pod Container的元数据信息。

    Kubernetes从1.11版本开始支持通过Downward API对子路径的名称进行设置,引入了一个新的subPathExpr字段,到1.17版本达到Stable阶段。

    用户可以将Pod或Container信息先使用Downward API设置到环境变量上,再通过subPathExpr将其设置为subPath的名称

    通过Kubernetes提供的Downward API机制,只需经过一些简单配置容器内的应用就可以直接使用Pod和容器的某些元数据信息了。

    04 文末

    本文主要讲解Kubenetes使用Downward API的方式,使容器能通过环境变量及volume的方式来获取pod的信息,希望能帮助到大家,谢谢大家的阅读,本文完!

  • 相关阅读:
    cetos7 Docker 安装 gitlab
    力扣刷题记录106.1-----322. 零钱兑换
    对于《数据结构与算法之美》的理解
    Python Django 零基础从零到一部署服务,Hello Django!全文件夹目录和核心代码!
    任务28 成绩管理系统
    STM32CubeMX教程31 USB_DEVICE - HID外设_模拟键盘或鼠标
    创建自定义 Spring Cloud Gateway 过滤器 - spring.io
    容器docker安装,以及paddle容器环境安装
    关于c++中和java中 集合添加元素的区别
    数据结构——栈和队列(栈的顺序存储结构和链式存储结构)
  • 原文地址:https://blog.csdn.net/qq_20042935/article/details/127102519