说明

我们知道,每个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. console.log() 替代函数

    var log = console.log.bind(console); log('d')

  2. python处理xml实例

    """ Author = zyh FileName = read_xml_1.py Time = 18-9-26 下午5:19 """ fr ...

  3. Task 5.1 电梯调度程序需求调研报告

    1.任务概述: 1.1任务背景:试想一下,石家庄铁道大学基础教学楼的电梯配置如下:大厦有18层, 4部电梯,很多乘客使用这些电梯的日常(旅客重量:平均70公斤最大120公斤,最小45公斤).其他常量数 ...

  4. mvc拦截请求IHttpModule

    代码: using System; using System.Collections.Generic; using System.Linq; using System.Web; using Syste ...

  5. JSPatch 原理

    原理 JSPatch用iOS内置的JavaScriptCore.framework作为JS引擎,但没有用它JSExport的特性进行JS-OC函 数互调,而是通过Objective-C Runtime ...

  6. profibus总线和profibus dp的区别

    profibus总线和profibus dp的区别:PROFBUS是一种国际性的开放式的现场总线标准,它既可以用于高速并且对于时间苛求的数据传输,也可以用于大范围的复杂通讯场合.PROFBUS-DP是 ...

  7. delphi 删除字符串的回车、空格、Tab键

    myStr:=StringReplace(myStr, chr(13)+chr(10), '', [rfReplaceAll]);//删除回车      myStr:=StringReplace(my ...

  8. android自动化之appium的环境搭建

    简介appium     appium是C/S架构,appium的核心是一个web服务器,它提供了一套REST的接口,他会接收客户端的连接,监听到命令.执行会再将结果通过HTTP响应返还给客户端.ap ...

  9. PHP 常用函数总结(一)

    重点: 看函数的 ‘参数’ 和 ‘返回值’ 文档:http://www.w3school.com.cn/php/php_ref_array.asp http://www.w3school.com.cn ...

  10. golang build 的简单用法.(菜鸟初学)

    1. golang 里面的 go build 可以编译代码. go build helloworld.go 2. 这里面有一个注意事项事项. 如果引用非go语言的 内置package的话 需要在环境变 ...