哈喽~大家好!昨天我们讲解了ConfigMap的使用,今天我来继续深入的讨论Pod的概念及其用法。

现在我们进入正题。

Downward API

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

Downward API可以通过以下两种方式将Pod信息注入容器内部。
(1)环境变量:用于单个变量,可以将Pod信息和Container信息注入容器内部。
(2)Volume挂载:将数组类信息生成为文件并挂载到容器内部。
下面通过几个例子对Downward API的用法进行说明。

将Pod信息注入为环境变量

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

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


apiVersion: v1
kind: Pod
metadata:name: dapi-test-pod
spec:containers:- name: test-containerimage: busyboxcommand: ["/bin/sh","-c","env"]env:- name: MY_POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: MY_POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespace- name: MY_POD_IPvalueFrom:fieldRef:fieldPath: status.podIP

注意到上面valueFrom这种特殊的语法是Downward API的写法。目前Downward API提供了以下变量。
◎ metadata.name:Pod的名称,当Pod通过RC生成时,其名称是RC随机产生的唯一名称。
◎ status.podIP:Pod的IP地址,之所以叫作status.podIP而非metadata.IP,是因为Pod的IP属于状态数据,而非元数据。
◎ metadata.namespace:Pod所在的Namespace。

查看dapi-test-pod的日志:

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

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

下面的例子通过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-containerimage: busyboximagePullPolicy: Nevercommand: [ "sh", "-c"]args:- while true; doecho -en '\n';printenv MY_CPU_REQUEST MY_CPU_LIMIT;printenv MY_MEM_REQUEST MY_MEM_LIMT;sleep 3600;done;resources:
apiVersion: v1
kind: Pod
metadata:name: dapi-test-pod-container-vars
spec:containers:- name: test-containerimage: busyboximagePullPolicy: Nevercommand: [ "sh", "-c"]args:- while true; doecho -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_REQUESTvalueFrom:resourceFieldRef:containerName: test-containerresource: requests.cpu- name: MY_CPU_LIMITvalueFrom:resourceFieldRef:containerName: test-containerresource: limits.cpu- name: MY_MEM_REQUESTvalueFrom:resourceFieldRef:containerName: test-containerresource: requests.memory- name: MY_MEM_LIMITvalueFrom:resourceFieldRef:containerName: test-containerresource: limits.memoryrestartPolicy: Never

注意valueFrom这种特殊的Downward API语法,目前resourceFieldRef可以将容器的资源请求和资源限制等配置设置为容器内部的环境变量。
◎ requests.cpu:容器的CPU请求值。
◎ limits.cpu:容器的CPU限制值。
◎ requests.memory:容器的内存请求值。
◎ limits.memory:容器的内存限制值。

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

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

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

apiVersion: v1
kind: Pod
metadata:name: dapi-test-pod-volumelabels:zone: us-est-coastcluster: test-cluster1rack: rack-22annotations:build: twobuilder: john-doe
spec:containers:- name: test-containerimage: busyboximagePullPolicy: Nevercommand: ["sh","-c"]args:- while true; doif [[ -e /etc/labels ]]; thenecho -en '\n\n'; cat /etc/labels; fi;if [[ -e /etc/annotations ]]; thenecho -en '\n\n'; cat /etc/annotations; fi;sleep 3600;done;volumeMounts:- name: podinfomountPath: /etcreadOnly: falsevolumes:- name: podinfodownwardAPI:items:- path: "labels"fieldRef:fieldPath: metadata.labels- path: "anntotations"fieldRef:fieldPath: metadata.annotations

╭(╯^╰)╮ 此实例博主没有跑通,这里就理解这来吧~    明天我深入研究一下,是什么问题,报错截图如下:

这里要注意“volumes”字段中downwardAPI的特殊语法,通过items的设置,系统会根据path的名称生成文件。根据上例的设置,系统将在容器内生成/etc/labels和/etc/annotations两个文件。在/etc/labels文件中将包含metadata.labels的全部Label列表,在/etc/annotations文件中将包含metadata.annotations的全部Label列表。

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

带你玩转kubernetes-k8s(第14篇:k8s-深入掌握Pod-在容器内获取Pod信息)相关推荐

  1. kubernetes 容器内获取Pod信息(包括:宿主主机IP)

    kubernetes 自从1.7开始,可以在pod 的container 内获取pod的spec,metadata 等信息. 具体方法可以通过env获取: env:         - name: M ...

  2. 带你玩转kubernetes-k8s(第61篇-Kubernetes之资源紧缺时的Pod驱逐机制)

    资源紧缺时的Pod驱逐机制 如何在系统硬件资源紧缺的情况下保证Node的稳定性,是kubelet需要解决的一个重要问题.尤其对于内存和磁盘这种不可压缩的资源,紧缺就意味着不稳定.下面对驱逐的策略.信号 ...

  3. 带你玩转kubernetes-k8s(第46篇:深入分析k8s网络原理[CNM、CNI]网络模型)

    随着容器技术在企业生产系统中的逐步落地,用户对容器云的网络特性要求也越来越高.跨主机容器间的网络互通已经成为基本要求,更高的要求包括容器固定IP地址.一个容器多个IP地址.多个子网隔离.ACL控制策略 ...

  4. 带你玩转kubernetes-k8s(第38篇:深入分析集群安全机制)

    Kuberetes通过一系列机制来实现集群的安全控制,其中包括API Server的认证授权.准入控制机制及保护敏感信息的Secret机制等.集群的安全性必须考虑如下几个目标. (1) 保证容器与其所 ...

  5. 带你玩转kubernetes-k8s(第54篇-Kubernetes之使用API聚合机制扩展API资源)

    API聚合机制是Kubernetes 1.7版本引入的特性,能够将用户扩展的API注册到kube-apiserver上,仍然通过API Server的HTTP URL对新的API进行访问和操作.为了实 ...

  6. 带你玩转七牛云存储——高级篇

    七牛云图片存储优点 支持各种尺寸的图片缩放: 支持图片自动压缩: 支持水印添加:图片水印.文字水印两种模式: 图片防盗链,限制访问来源: 设置ip黑白名单,防止恶意盗刷.攻击: 自定义图片域名,看起来 ...

  7. 借重新装系统之际,一篇文章带你玩透Windows 10从系统安装到软件选择

    系统安装所需软件 Rufus 一个制作USB-ISO的免费软件,比微软官方工具好的地方在于除了可以制作windows 系统U盘,还可以制作linux 以及安卓X86的系统安装光盘. 借重新装系统之际, ...

  8. Kubernetes 学习总结(25)—— Kubernetes 中的 pod 与容器的区别和联系

    前言 容器本可以成为轻量级虚拟机的替代品.但是由于 Docker/OCI 的标准化,最广泛使用的容器形式是每个容器只有一个进程服务.这种方法有很多优点--增加隔离性.简化水平扩展.更高的可重用性等.但 ...

  9. 我花了10个小时,写出了这篇K8S架构解析

    " 互联网技术飞速发展的今天,为了承载请求的高并发和业务的多样性,微服务的架构成了各个公司的标配. 图片来自 Pexels 每个微服务通过 Docker 进行发布,随着业务的发展,系统中遍布 ...

最新文章

  1. 基于设计模式的学习之旅-----访问者模式(附源码)
  2. 本科生新算法打败NeRF,不用神经网络照片也能动起来,提速100倍
  3. JavaScript 30 - 3 学习笔记
  4. 多租户saas 架构_[译/注] Force.com 多租户互联网应用开发平台的设计
  5. apache jmeter 使用简介
  6. 如果一台通用计算机的,一台计算机,之所以有相当的灵活性和通用性,能解决许多.doc...
  7. php学生宿舍管理系统免费,PHP学生宿舍管理系统
  8. Java项目演示第23期在线购书商城系统
  9. DW——验证注册页面 设计JavaScript
  10. 51单片机-DS1302时钟芯片(自己理解的
  11. iphonex时间显示蓝色_iphonex左上角时间蓝色
  12. YouTuBe油管/头条点赞订阅关注分享提示PR模板Mogrt
  13. ElasticSearch之别名_aliases
  14. 卷积神经网络权重,特征图计算
  15. MATLAB图像二值化函数im2bw与imbinarize对给定阈值的内部处理细节
  16. 计算机设备管理器老是闪烁,Win7系统打开设备管理器后一直自动刷新解决方法...
  17. html5给网页添加视频背景
  18. win7计算机限制不能安装,win7怎么禁止安装软件_windows7禁止安装软件的方法
  19. 『煮酒论史』 [近代风云]外东北、藏南、南沙:如何看待失去的领土
  20. echarts 中国地图(带南海诸岛) 及各省份地图json文件

热门文章

  1. 【机器学习】Goldstein-Armijo line-search
  2. Zabbix(一):server,agent端 安装配置及主机,监控项,触发器,动作,媒介配置步骤...
  3. 使用 SVG 实现圆环日期选择器
  4. 安装CentOS7出现dracut-initqueue timeout的解决办法
  5. 436分复试被刷!山东大学软件学院
  6. 【干货】百度清风算法中标后我是如何恢复的
  7. 王瑞平:挺和合国际收《火火的情怀》建交朱之文高安孟文豪谷传民
  8. 转:C++资源之不完全导引
  9. Unity3D开发之3D按钮的声音播放
  10. android升级小米系统版本,miui7怎么升级?小米升级MIUI7系统两种方法介绍