说明

我们知道,每个Pod在成功创建出来之后,都会被系统分配唯一的名字、IP地址,并且处于某一个namespace中,那么我们如何在pod的容器内获取pod的这些重要信息呢? 答案就是使用Downward API。

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

  • 环境变量:用于单个变量,可以将pod信息和container信息注入容器内部。
  • volume挂载:将数组类信息生成为文件,挂载到容器内部。

环境变量方式

将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: NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: MY_POD_SERVICE_ACCOUNT
valueFrom:
fieldRef:
fieldPath: spec.serviceAccountName
- 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

注意上面valueFrom这种特殊的语法是Downward API的写法。目前Downward API提供了以下变量:

  • spec.nodeName:Pod所在节点的名称
  • spec.serviceAccountName:pod运行时使用的serivceAccount的名称
  • metadata.name: Pod的名称,当pod通过rc生成时,其名称是rc随机产生的唯一名称
  • status.podIP: Pod的ip地址,之所以叫status.podIP而非metadata.IP,是因为pod的ip属于状态数据,而非元数据
  • metadata.namespace: pod所在的namespace

将容器资源信息注入为环境变量

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

dapi-test-pod-container-vars.yaml内容如下:

apiVersion: v1
kind: Pod
metadata:
name: dapi-test-pod-container-vars
spec:
containers:
- name: test-container
image: busybox
imagePullPolicy: Never
restartPolicy: 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

目前resourceFieldRef可以将容器的资源请求和资源限制等配置设置为容器内部的环境变量。

  • requests.cpu
  • limits.cpu
  • requests.memory
  • limits.memory

volume挂载方式

下面的示例通过Downward API将pod的label、annotation列表通过volume挂载为容器内的一个文件,容器应用使用echo命令将文件内容打印到标准输出:

dapi-test-pod-volume.yaml内容如下:

apiVersion: v1
kind: Pod
metadata:
name: dapi-test-pod-volume
labels:
zone: us-est-coast
cluster: test-cluster1
rack: rack-22
annotations:
build: two
builder: Breeze
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

上面的示例中,通过items的设置,将会以path的名称生成文件。这里将在容器内生成/etc/labels和/etc/annotations两个文件,/etc/labels中将包含metadata.labels的全部label列表,/etc/annotations中将包含metadata.annotations的全部label列表

作用

在某些集群中,集群中每个节点都需要将自身的标识及进程绑定的ip地址等信息事先写入配置文件中,进程启动时读取这些信息,然后发布到某个类似服务注册中心的地方,以实现集群节点的自动发现功能。此时Downward API就可以派上用场了,具体做法是先编写一个预启动脚本或init container,通过环境变量或者文件方式获取pod自身的名称、ip地址等信息,然后写入主程序的配置文件中,最后启动主程序。

参考:《kubernetes权威指南》

Kubernetes Downward API的更多相关文章

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

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

  2. 深入了解Kubernetes REST API的工作方式

    关于Kubernetes REST API的工作方式: 在哪里以及如何定义从REST路径到处理REST调用的函数的映射? 与etcd的交互发生在哪里? 从客户端发出请求到保存在etcd中对象的端到端路 ...

  3. Kubernetes exec API串接分析

    本篇将说明Kubernetes exec API的运作方式,并以简单范例进行开发在前后端上.虽然Kubernetes提供了不同资源的RESTful API来进行CRUD操作,但是部分API并非单纯的回 ...

  4. kubernetes 的API 介绍

    在API conventions doc中描述了API的全部协议. 在API Reference文档中描述了API的端点.资源类型和示例. 在Controlling API Access doc中讨论 ...

  5. Downward API —— 在容器内部获取 Pod 信息

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

  6. ambassador kubernetes native api gateway

    github 上的介绍: Ambassador is an open source Kubernetes-native API Gateway built on Envoy, designed for ...

  7. kubernetes 实用 api list

    https://192.168.20.128:6443/api/v1/pods 原文来自https://segmentfault.com/a/1190000002937665 收集整理一些可能较常用的 ...

  8. 在 Traefik 中使用 Kubernetes Gateway API

    文章转载自:https://mp.weixin.qq.com/s/QYy8ETBB-xqU0IMI7YuTWw Gateway API(之前叫 Service API)是由 SIG-NETWORK 社 ...

  9. Kubernetes通过downwardAPI传递元数据

    应用往往需要获取所运行环境的一些信息,包括应用自身以及集群中其他组件的信息.Kubernetes可以通过环境变量以及DNS进行服务发现,但其他信息如何处理呢?下面将介绍特定pod和容器元数据如何被传递 ...

随机推荐

  1. ./configure的含义

    在实践安装nginx的时候,不知道./configure是什么意思,这里特地记录一下. 在linux中./代表当前目录,属于相对路径../代表上一级目录,属于相对路径/代表根目录,/开头的文件都是绝对 ...

  2. Daily Scrum (2015/10/23)

    这天晚上PM和我一起细算下来这周的确做了不少事儿.由于这天是周五,有的组员今晚有外出活动,有的组员忙了一周想休息一下.所以PM与我讨论提出今晚就布置些阅读的任务,给组员们一些自由分配的时间: 成员 今 ...

  3. Daily Scrumming* 2015.10.25(Day 6)

    一.总体情况总结 1.UI今日总结:初步设计了社团详情界面 2.后端今日总结:讨论并设计数据库,表内容,属性和相互联系等,并在rails的activeRecord和activeModel中实现,同时设 ...

  4. mianshi

    https://blog.csdn.net/u012557610/article/details/80350099 https://blog.csdn.net/liuqiyao_01/article/ ...

  5. python字符串操作、文件操作,英文词频统计预处理

    1.字符串操作: 解析身份证号:生日.性别.出生地等. 凯撒密码编码与解码 网址观察与批量生成 解析身份证号:生日.性别.出生地等 def function3(): print('请输入身份证号') ...

  6. C51学习笔记

    转自:http://blog.csdn.net/gongyuan073/article/details/7856878 单片机C51学习笔记 一,   C51内存结构深度剖析 二,   reg51.头 ...

  7. grep文本处理工具

    grep是一款文本过滤工具,基于正则表达式进行模式匹配sed:stream editor 流编辑器awk:linux上实现为gawk,文本报告生成器(格式化文本)文本搜索工具,根据用户指定的模式,对目 ...

  8. 更改数据库字符集编码引起的问题、textarea标签输出内容时不能顶格(左对齐)输出

    用svn拉下来的项目,部署好的Oracle数据库(gbk编码),用tomcat部署好并发布项目,当访问相关网页时,出现乱码.于是把Oracle的字符编码改成utf8,tomcat也改成UTF-8,重新 ...

  9. 6/5 sprint2 看板和燃尽图的更新

  10. maven编译,控制台中文乱码解决方案

    如下图,在使用maven运行后,在控制台看到中文展示乱码 出现这个的原因是源码使用UTF-8,但是maven编译的时候使用GBK标准,如下图   为了让maven编译的时候使用UTF-8标准,使用在p ...