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

简介: k8s教程(pod篇)-容器获取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.name Pod名称
metadata.namespace Pod所在的命名空间名称
metadata.uid Pod的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.labels Pod的Label2列表,每个Labeli都以key为文件名,value为文件内容,每个Label各占一行
metadata.namannotations Pod的Annotation列表,每个Annotation都以key为文件名,value为文件内容,每个Annotation各占一行

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

元数据 描述
status.podIP Pod的IP地址
spec.serviceAccountName Pod使用的ServiceAccount名称
spec.nodeName Pod所在Node的名称,从Kubernetes1.4.0-alpha.3版本开始支持
status.hostIP Pod所在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的信息,希望能帮助到大家,谢谢大家的阅读,本文完!

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
25天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
82 2
|
27天前
|
存储 Kubernetes Docker
【赵渝强老师】Kubernetes中Pod的基础容器
Pod 是 Kubernetes 中的基本单位,代表集群上运行的一个进程。它由一个或多个容器组成,包括业务容器、基础容器、初始化容器和临时容器。基础容器负责维护 Pod 的网络空间,对用户透明。文中附有图片和视频讲解,详细介绍了 Pod 的组成结构及其在网络配置中的作用。
【赵渝强老师】Kubernetes中Pod的基础容器
|
9天前
|
缓存 算法 API
查询域名WHOIS信息免费API接口教程
该API用于查询顶级域名的WHOIS信息,不支持国别域名和中文域名。通过POST或GET请求,需提供用户ID、KEY及待查询域名。返回信息包括域名状态、注册商、时间等详细数据。示例与文档见官网。
|
14天前
|
Kubernetes Cloud Native API
深入理解Kubernetes——容器编排的王者之道
深入理解Kubernetes——容器编排的王者之道
29 1
|
27天前
|
运维 Kubernetes Shell
【赵渝强老师】K8s中Pod的临时容器
Pod 是 Kubernetes 中的基本调度单位,由一个或多个容器组成,包括业务容器、基础容器、初始化容器和临时容器。临时容器用于故障排查和性能诊断,不适用于构建应用程序。当 Pod 中的容器异常退出或容器镜像不包含调试工具时,临时容器非常有用。文中通过示例展示了如何使用 `kubectl debug` 命令创建临时容器进行调试。
|
27天前
|
Kubernetes 调度 容器
【赵渝强老师】K8s中Pod中的业务容器
Pod 是 Kubernetes 中的基本调度单元,由一个或多个容器组成。除了业务容器,Pod 还包括基础容器、初始化容器和临时容器。本文通过示例介绍如何创建包含业务容器的 Pod,并提供了一个视频讲解。示例中创建了一个名为 &quot;busybox-container&quot; 的业务容器,并使用 `kubectl create -f firstpod.yaml` 命令部署 Pod。
|
1天前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
115 77
|
3天前
|
数据建模 应用服务中间件 nginx
docker替换宿主与容器的映射端口和文件路径
通过正确配置 Docker 的端口和文件路径映射,可以有效地管理容器化应用程序,确保其高效运行和数据持久性。在生产环境中,动态替换映射配置有助于灵活应对各种需求变化。以上方法和步骤提供了一种可靠且易于操作的方案,帮助您轻松管理 Docker 容器的端口和路径映射。
24 3
|
15天前
|
Kubernetes Linux 开发者
深入探索容器化技术——Docker 的实战应用
深入探索容器化技术——Docker 的实战应用
45 5
|
18天前
|
运维 Cloud Native 云计算
云原生之旅:Docker容器化实战
本文将带你走进云原生的世界,深入理解Docker技术如何改变应用部署与运维。我们将通过实际案例,展示如何利用Docker简化开发流程,提升应用的可移植性和伸缩性。文章不仅介绍基础概念,还提供操作指南和最佳实践,帮助你快速上手Docker,开启云原生的第一步。