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的信息,希望能帮助到大家,谢谢大家的阅读,本文完!

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
3月前
|
Cloud Native 中间件 调度
云原生信息提取系统:容器化流程与CI/CD集成实践
本文介绍如何通过工程化手段解决数据提取任务中的稳定性与部署难题。结合 Scrapy、Docker、代理中间件与 CI/CD 工具,构建可自动运行、持续迭代的云原生信息提取系统,实现结构化数据采集与标准化交付。
128 1
云原生信息提取系统:容器化流程与CI/CD集成实践
|
6月前
|
Kubernetes 调度 异构计算
生产环境 K8S + Deepseek 实现大模型部署 和 容器调度(图解+史上最全)
生产环境 K8S + Deepseek 实现大模型部署 和 容器调度(图解+史上最全)
生产环境 K8S + Deepseek 实现大模型部署 和 容器调度(图解+史上最全)
|
6月前
|
数据采集 消息中间件 Kubernetes
容器化爬虫部署:基于K8s的任务调度与自动扩缩容设计
随着业务复杂度提升,传统定时任务和手工扩缩容难以满足高并发与实时性需求。本文对比两种基于 Kubernetes 的爬虫调度与扩缩容方案:CronJob+HPA 和 KEDA。从调度灵活性、扩缩容粒度、实现难度等维度分析,并提供 YAML+Python 示例。方案 A(CronJob+HPA)适合固定定时任务,配置简单;方案 B(KEDA)支持事件驱动,适合高并发与异步触发场景。根据实际需求可混合使用,优化资源利用与效率。
198 4
|
7月前
|
Kubernetes API 网络安全
当node节点kubectl 命令无法连接到 Kubernetes API 服务器
当Node节点上的 `kubectl`无法连接到Kubernetes API服务器时,可以通过以上步骤逐步排查和解决问题。首先确保网络连接正常,验证 `kubeconfig`文件配置正确,检查API服务器和Node节点的状态,最后排除防火墙或网络策略的干扰,并通过重启服务恢复正常连接。通过这些措施,可以有效解决与Kubernetes API服务器通信的常见问题,从而保障集群的正常运行。
490 17
|
10月前
|
Prometheus Kubernetes 监控
OpenAI故障复盘 - 阿里云容器服务与可观测产品如何保障大规模K8s集群稳定性
聚焦近日OpenAI的大规模K8s集群故障,介绍阿里云容器服务与可观测团队在大规模K8s场景下我们的建设与沉淀。以及分享对类似故障问题的应对方案:包括在K8s和Prometheus的高可用架构设计方面、事前事后的稳定性保障体系方面。
|
7月前
|
存储 运维 Kubernetes
容器数据保护:基于容器服务 Kubernetes 版(ACK)备份中心实现K8s存储卷一键备份与恢复
阿里云ACK备份中心提供一站式容器化业务灾备及迁移方案,减少数据丢失风险,确保业务稳定运行。
|
9月前
|
Kubernetes Linux 虚拟化
入门级容器技术解析:Docker和K8s的区别与关系
本文介绍了容器技术的发展历程及其重要组成部分Docker和Kubernetes。从传统物理机到虚拟机,再到容器化,每一步都旨在更高效地利用服务器资源并简化应用部署。容器技术通过隔离环境、减少依赖冲突和提高可移植性,解决了传统部署方式中的诸多问题。Docker作为容器化平台,专注于创建和管理容器;而Kubernetes则是一个强大的容器编排系统,用于自动化部署、扩展和管理容器化应用。两者相辅相成,共同推动了现代云原生应用的快速发展。
2423 11
|
11月前
|
运维 Kubernetes Shell
【赵渝强老师】K8s中Pod的临时容器
Pod 是 Kubernetes 中的基本调度单位,由一个或多个容器组成,包括业务容器、基础容器、初始化容器和临时容器。临时容器用于故障排查和性能诊断,不适用于构建应用程序。当 Pod 中的容器异常退出或容器镜像不包含调试工具时,临时容器非常有用。文中通过示例展示了如何使用 `kubectl debug` 命令创建临时容器进行调试。
200 1
|
11月前
|
Kubernetes 调度 容器
【赵渝强老师】K8s中Pod中的业务容器
Pod 是 Kubernetes 中的基本调度单元,由一个或多个容器组成。除了业务容器,Pod 还包括基础容器、初始化容器和临时容器。本文通过示例介绍如何创建包含业务容器的 Pod,并提供了一个视频讲解。示例中创建了一个名为 &quot;busybox-container&quot; 的业务容器,并使用 `kubectl create -f firstpod.yaml` 命令部署 Pod。
150 1
|
11月前
|
Kubernetes 容器 Perl
【赵渝强老师】K8s中Pod中的初始化容器
Kubernetes的Pod包含业务容器、基础容器、初始化容器和临时容器。初始化容器在业务容器前运行,用于执行必要的初始化任务。本文介绍了初始化容器的作用、配置方法及优势,并提供了一个示例。
199 1

热门文章

最新文章