我们知道,每个 Pod 在被超过创建出来之后,都会被系统分配唯一的名字、IP地址,并且处于某个 Namespace 中,那么我们如何在 Pod 的容器内获取 Pod 的这些重要信息呢?

答案就是使用 Downward API

Downward API 可以通过以下两种方式将 Pod 信息注入容器内部。

  1. 环境变量:用于单个变量,可以将 Pod 信息和 Container 信息注入容器内部。
  2. Volume 挂载:将数组类信息生成为文件并挂载到容器内部。

3.6.1 环境变量方式:将 Pod 信息注入为环境变量

下面的例子通过 Downward API 将 Pod 的IP、名称和所在 Namespace 注入容器的环境变量中,容器应用使用 env 命令将全部环境变量大隐刀标准输出中:

dapi-test-pod.yaml

apiVersion: v1
kind: Pod
metadata:
name: dapi-test-pod
spec:
containers:
- name: test-container
image: busybox
command: ["/bin/sh", "-c", "env"]
env:
- name: MY_POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: MY_POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: MY_POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
restartPolicy: Never

注意到上面 valurFrom 这种特殊的语法是 Downward API 的写法。

目前 Downward API 提供了以下变量。

  • metadata.name: Pod 的名称,当 Pod 通过 RC 生成时,其名称是 RC 随机产生的唯一名称。
  • status.podIP: Pod 的 IP 地址,之所以叫做status.podIP 而非 metadata.IP,是因为 Pod 的 IP 属于状态数据,而非元数据。
  • metadata.namespace: Pod 所在的 Namespace。

运行 kubectl create 命令创建 Pod:

# kubectl create -f dapi-test-pod.yaml
pod "dapi-test-pod" created

查看 dapi-test-pod 的日志:

.....
MY_POD_NAMESPACE=default
MY_POD_IP=172.17.1.2
MY_POD_NAME=dapi-test-pod
.....

从日志中我们可以看到 Pod 的 IP、Name 及 Namespace 等信息都被正确保存到了 Pod 的环境变量中。

3.6.2 环境变量方式:将容器资源信息注入为环境变量

下面的例子通过Downward API将 Container 的资源请求和限制信息注入容器的环境变量中,容器应用使用printenv命令将设置的资源环境变量打印到标准输出中:

dapi-test-pod-container-vars.yaml

apiVersion: v1
kind: Pod
name: dapi-test-pod-container-vars
spec:
containers:
- name: test-container
image: busybox
imagePullPolicy: Never
command: ["sh", "-c"]
args:
- while true; do
echo -en '\n';
printenv MY_CPU_REQUEST MY_CPU_LIMIT;
printenv MY_MEM_REQUEST MY_MEM_LIMIT;
sleep 3600;
done;
resources:
requests:
memory: "32Mi"
cpu: "125m"
limits:
memory: "64Mi"
cpu: "250m"
env:
- name: MY_CPU_REQUEST
valueFrom:
resourceFieldRef:
containerName: test-container
resource: requests.cpu
- name: MY_CPU_LIMIT
valueFrom:
resourceFieldRef:
containerName: test-container
resource: limits.cpu
- name: MY_MEM_REQUEST
valueFrom:
resourceFieldRef:
containerName: test-container
resource: requests.memory
- name: MY_MEM_LIMIT
valueFrom:
resourceFieldRef:
containerName: test-container
resource: limits.memory
restartPolicy: Never

注意 valueFrom 这种特殊的 Downward API 语法,目前 resourceFieldRef 可以将容器的资源请求和资源限制等设置为容器内部的环境变量。

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

运行 kubectl create 命令来创建 Pod:

# kubectl create -f dapi-test-pod-container-vars.yaml
pod "dapi-test-pod-container-vars" created # kubectl get pods
NAME READY STATUS RESTARTS AGE
dapi-test-pod-container-vars 1/1 Running 0 36s

查看 dapi-test-pod-container-vars 的日志:

# kubectl logs dapi-test-pod-container-vars
1
1
33554432
67100864

从日志中我们可以看到 Container 的 requests.cpulimits.cpurequests.memorylimits.memory 等信息都被正确保存到了 Pod 的环境变量中。

3.6.3 Volume 挂载方式

下面的例子通过 Downward API 将 Pod 的 LabelAnnotation 列表通过 Volume 挂载为容器中的一个文件,容器应用使用 echo 命令将文件的内容打印到标准输出中:

dapi-test-pod-volume.yaml

apiVersion: v1
kind: Pod
name: dapi-test-pod-volume
labels:
zone: us-est-coast
cluster: test-cluster1
rack: rack-22
annotations:
build: two
builder: john-doe
spec:
containers:
- name: test-container
image: busybox
imagePullPolicy: Never
command: ["sh", "-c"]
args:
- while true; do
if [[ -e /etc/labels ]]; then
echo -en '\n\n'; cat /etc/labels; fi;
if [[ -e /etc/annotations ]]; then
echo -en '\n\n'; cat /etc/annotations; fi;
sleep 3600;
done;
volumeMounts:
- name: podinfo
mountPath: /etc
readOnly: false
volumes:
- name: podinfo
downwardAPI:
items:
- path: "labels"
fieldRef:
fieldPath: metadata.labels
- path: "annotations"
fieldRef:
fieldPath: metadata.annotations

这里要注意 “volumes” 字段中 downwardAPI 的特殊语法,通过items的设置,系统会根据 path 的名称生成文件。

根据上例的设置,系统将在容器内生成/etc/labels/etc/annotations 两个文件。

/etc/labels 文件中将包含metadata.labels的全部Label列表,在/etc/annotations文件中将包含metadata.annotations 的全部 Label 列表。

运行 kubectl create 命令创建 Pod:

# kubectl create -f dapi-test-pod-volume.yaml
pod "dapi-test-pod-volume" created # kubectl get pods
NAME READY STATUS RESTARTS AGE
dapi-test-pod-volume 1/1 Running 0 39s

查看 dapi-test-pod-valume 的日志:

# kubectl logs dapi-test-pod-volume
cluster="test-cluster1"
rack="rack-22"
zone="us-est-coast" build="two"
builder="john-doe"

从日志中我们看到 Pod 的 Label 和 Annotation 信息都被保存到了容器内的 /etc/labels/etc/annotations 文件中。

那么,Downward API 有什么价值呢?

在某些集群中,集群中的每个节点都需要将自身的标识(ID)及进程绑定的 IP 地址等信息事先写入配置文件中,进程在启动时会读取这些信息,然后将这些信息发布到某个类似服务注册中心的地方,以实现集群节点的自动发现功能。

此时 Downward API 就可以派上用场了,具体做法是先编写一个与启动脚本或 Init Container,通过环境变量或文件方式获取 Pod 自身的名称、IP 地址等信息,然后将这些信息写入主程序的配置文件中,最后启动主程序。

Downward API —— 在容器内部获取 Pod 信息的更多相关文章

  1. Docker 与 K8S学习笔记(二十)—— 使用Downward API向容器注入Pod信息

    Kubernetes在创建Pod时,会为Pod和容器设置一些额外的信息,比如Pod名称.Pod IP.Node IP.Label.Annotation.资源限制等,我们经常会在应用程序中使用到这些数据 ...

  2. Kubernetes(k8s)通过环境变量将 Pod 信息呈现给容器

    Downward API 有两种方式可以将 Pod 和 Container 字段呈现给运行中的容器: 环境变量 卷文件 这两种呈现 Pod 和 Container 字段的方式统称为 Downward ...

  3. Kubernetes Downward API

    目录 说明 环境变量方式 将pod信息注入为环境变量 将容器资源信息注入为环境变量 volume挂载方式 作用 说明 我们知道,每个Pod在成功创建出来之后,都会被系统分配唯一的名字.IP地址,并且处 ...

  4. Kubernetes 教程:根据 PID 获取 Pod 名称

    原文链接:https://fuckcloudnative.io/posts/find-kubernetes-pod-info-from-process-id/ 在管理 Kubernetes 集群的过程 ...

  5. Java 反射理解(三)-- Java获取方法信息

    Java 反射理解(三)-- Java获取方法信息 基本的数据类型.void关键字,都存在类类型. 举例如下: public class ClassDemo2 { public static void ...

  6. kubernetes容器编排之定义环境变量以及通过downwardapi把pod信息作为环境变量传入容器内

    系列目录 在学习docker的时候,大家可能经常看到不少示例在docker run的时候指定环境变量(比如wordpress的docker示例就是通过环境变量传入账户和密码到容器内).这里之所以经常用 ...

  7. 百度api:根据经纬度获取地理位置信息

    调用百度api,根据经度和纬度获取地理位置信息,返回Json. C#代码: using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Syste ...

  8. [整]C#获取天气预报信息(baidu api)包括pm2.5

    /// <summary> /// 获取天气预报信息 /// </summary> /// <returns></returns> public Bai ...

  9. 封装获取网络信息Linux—API类

    封装获取网络信息Linux—API类 封装好的库: #ifndef NETINFORMATION_H #define NETINFORMATION_H #include <netdb.h> ...

随机推荐

  1. Linux系列(31) - rpm命令管理之升级与卸载命令(3)

    升级命令 rpm -Uvh 包全名(要升级到的软件版本),如果没有安装这个软件的任何版本,这个命令可以代替rpm -ivh. rpm -Uvh 包全名 选项: - -U(upgrade):升级 卸载命 ...

  2. python学习笔记(十二)-网络编程

    本文结束使用 Requests 发送网络请求.requests是一个很实用的Python HTTP客户端库,编写爬虫和测试服务器响应数据时经常会用到.可以说,Requests 完全满足如今网络的需求. ...

  3. sql case when 多条件小结

    sql case when 多条件 小结 -- 第一种 格式 : 简单Case函数 : -- 格式说明 -- case 列名 -- when 条件值1 then 选择项1 -- when 条件值2 t ...

  4. asp.net core 中配合响应 html5 的音视频播放流,以及文件下载

    一.asp.net core 中配合响应 html5 的音视频播放流,以及文件下载 问题描述: 目前测试了在 Windows(谷歌浏览器).Android(系统浏览器.QQ.微信).iOS 三个系统不 ...

  5. 借助Cookie实现是否第一次登陆/显示上次登陆时间

    Cookie实现是否第一次登陆/显示上次登陆时间 最近刚好看到Cookie这方面知识,对Servlet部分知识已经生疏,重新翻出已经遗弃角落的<JavaWeb开发实战经典>,重新温习了Co ...

  6. 浅谈机(J)惨(C)技巧——从入门到精通(?)

    JC总是无聊的机房中有意思的一个瞬间... 比如: 这个杰作由 ZSWBWYX 完成 你认为这只是AK-IOI吗?不!注意用户名...也是此人的杰作. 所以,在险恶的机房里,一定要保护好自己的账号. ...

  7. Http Only Cookie保护AccessToken

    前言 JWT认证方式目前已被广泛使用,一直以来我们将token放在请求头中的Authorization中,若通过此种方式,一旦token被恶意窃取,攻击者可肆意对用户可访问资源进行任意索取,我们大多都 ...

  8. B站视频:CocosCreator Bundle 特性三个实例详解,轻松实现大厅子游戏模式

    详细内容:https://forum.cocos.org/t/topic/112146

  9. gRPC,爆赞

    原文链接: gRPC,爆赞 gRPC 这项技术真是太棒了,接口约束严格,性能还高,在 k8s 和很多微服务框架中都有应用. 作为一名程序员,学就对了. 之前用 Python 写过一些 gRPC 服务, ...

  10. 华为Awareness kit,您旅途路上的超智能管家

    前言 前段时间看了一部纪录片<中国游客在巴黎>,讲述了外国人眼中"中国式旅游":热衷景点打卡,沉迷拍照留念,无暇仔细欣赏:留足时间,买买买,不能枉此行.网友总结中国式旅 ...