Docker 与 K8S学习笔记(二十)—— 使用Downward API向容器注入Pod信息
Python微信订餐小程序课程视频
https://edu.csdn.net/course/detail/36074
Python实战量化交易理财系统
https://edu.csdn.net/course/detail/35475
Kubernetes在创建Pod时,会为Pod和容器设置一些额外的信息,比如Pod名称、Pod IP、Node IP、Label、Annotation、资源限制等,我们经常会在应用程序中使用到这些数据,比如利用Pod名称作为应用日志的字段,方便分析日志。为了能在容器内获取这些信息,我们可以使用Downward API机制来实现。
Downward API可以通过环境变量和Volume挂载这两种方式将Pod信息注入容器,我们分别来看一下:
一、环境变量方式
我们还是以Busybox为例进行演示,我们将Pod信息和Container信息以环境变量方式注入容器,在容器启动后通过env命令打印出来,我们Yaml文件内容如下:
apiVersion: v1
kind: Pod
metadata:name: busybox-pod
spec:containers:- name: busyboximage: busyboxcommand: ["/bin/sh", "-c", "env | grep VAR\_"]resources:requests:memory: "16Mi"cpu: "125m"limits:memory: "32Mi"cpu: "250m"env:- name: VAR\_NODE\_NAMEvalueFrom:fieldRef:fieldPath: spec.nodeName- name: VAR\_POD\_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: VAR\_POD\_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespace- name: VAR\_POD\_IPvalueFrom:fieldRef:fieldPath: status.podIP- name: VAR\_SERVICE\_ACCOUNTvalueFrom:fieldRef:fieldPath: spec.serviceAccountName- name: VAR\_CPU\_REQUESTvalueFrom:resourceFieldRef:containerName: busyboxresource: requests.cpu- name: VAR\_CPU\_LIMITvalueFrom:resourceFieldRef:containerName: busyboxresource: limits.cpu- name: VAR\_MEM\_REQUESTvalueFrom:resourceFieldRef:containerName: busyboxresource: requests.memory- name: VAR\_MEM\_LIMITvalueFrom:resourceFieldRef:containerName: busyboxresource: limits.memoryrestartPolicy: Never
我们创建Pod并使用kubtctl logs命令打印下输出:
$ sudo kubectl apply -f busy\_pod.yaml
pod/busybox-pod created
$ sudo kubectl logs busybox-pod
VAR\_MEM\_REQUEST=16777216 # 容器内存请求值
VAR\_NODE\_NAME=ayato # 节点名称
VAR\_SERVICE\_ACCOUNT=default # Pod使用的ServiceAccount名称
VAR\_CPU\_REQUEST=1 # 容器cpu请求值
VAR\_POD\_NAME=busybox-pod # pod名称
VAR\_MEM\_LIMIT=33554432 # 容器内存限制值
VAR\_POD\_NAMESPACE=default # Pod所在命名空间
VAR\_POD\_IP=172.17.0.6 # Pod ip地址
VAR\_CPU\_LIMIT=1 # 容器cpu请求值
二、Volume挂载方式
我们接下来尝试使用Volume挂载方式,将Pod信息注入容器。还是以Busybox为例,由于Pod信息都是以文件方式注入容器,所以我们修改容器启动后执行命令:我们使用cat不断打印注入的文件,修改后的Yaml文件如下:
apiVersion: v1
kind: Pod
metadata:name: busybox-podlabels:cluster: demo-clustertype: tool-podannotations:builder: alalazy
spec:containers:- name: busyboximage: busyboxcommand: ["/bin/sh", "-c"]args:- while true; doif [[ -e /etc/podinfo/labels ]]; thenecho -en '\n\n'; cat /etc/podinfo/labels; fi;if [[ -e /etc/podinfo/annotations ]]; thenecho -en '\n\n'; cat /etc/podinfo/annotations; fi;if [[ -e /etc/podinfo/cpu\_limit ]]; thenecho -en '\n\n'; cat /etc/podinfo/cpu\_limit; fi;if [[ -e /etc/podinfo/cpu\_request ]]; thenecho -en '\n\n'; cat /etc/podinfo/cpu\_request; fi;if [[ -e /etc/podinfo/mem\_limit ]]; thenecho -en '\n\n'; cat /etc/podinfo/mem\_limit; fi;if [[ -e /etc/podinfo/mem\_request ]]; thenecho -en '\n\n'; cat /etc/podinfo/mem\_request; fi;sleep 5;done;volumeMounts:- name: podinfomountPath: /etc/podinforesources:requests:memory: "16Mi"cpu: "125m"limits:memory: "32Mi"cpu: "250m"volumes:- name: podinfodownwardAPI:items:- path: "labels"fieldRef:fieldPath: metadata.labels- path: "annotations"fieldRef:fieldPath: metadata.annotations- path: "cpu\_limit"resourceFieldRef:containerName: busyboxresource: limits.cpudivisor: 1m- path: "cpu\_request"resourceFieldRef:containerName: busyboxresource: requests.cpudivisor: 1m- path: "mem\_limit"resourceFieldRef:containerName: busyboxresource: limits.memorydivisor: 1Mi- path: "mem\_request"resourceFieldRef:containerName: busyboxresource: requests.memorydivisor: 1Mi
我们创建此Pod,并通过kubectl logs查看输出:
$ sudo kubectl apply -f busy\_pod.yaml
pod/busybox-pod created
$ sudo kubectl logs busybox-pod
cluster="demo-cluster"
type="tool-pod"builder="alalazy"
kubectl.kubernetes.io/last-applied-configuration="{\"apiVersion\":\"v1\",\"kind\":\"Pod\",\"metadata\":{\"annotations\":{\"builder\":\"alalazy\"},\"labels\":{\"cluster\":\"demo-cluster\",\"type\":\"tool-pod\"},\"name\":\"busybox-pod\",\"namespace\":\"default\"},\"spec\":{\"containers\":[{\"args\":[\"while true; do if [[ -e /etc/podinfo/labels ]]; then echo -en '\\\\n\\\\n'; cat /etc/podinfo/labels; fi; if [[ -e /etc/podinfo/annotations ]]; then echo -en '\\\\n\\\\n'; cat /etc/podinfo/annotations; fi; if [[ -e /etc/podinfo/cpu\_limit ]]; then echo -en '\\\\n\\\\n'; cat /etc/podinfo/cpu\_limit; fi; if [[ -e /etc/podinfo/cpu\_request ]]; then echo -en '\\\\n\\\\n'; cat /etc/podinfo/cpu\_request; fi; if [[ -e /etc/podinfo/mem\_limit ]]; then echo -en '\\\\n\\\\n'; cat /etc/podinfo/mem\_limit; fi; if [[ -e /etc/podinfo/mem\_request ]]; then echo -en '\\\\n\\\\n'; cat /etc/podinfo/mem\_request; fi; sleep 5; done;\"],\"command\":[\"/bin/sh\",\"-c\"],\"image\":\"busybox\",\"name\":\"busybox\",\"resources\":{\"limits\":{\"cpu\":\"250m\",\"memory\":\"32Mi\"},\"requests\":{\"cpu\":\"125m\",\"memory\":\"16Mi\"}},\"volumeMounts\":[{\"mountPath\":\"/etc/podinfo\",\"name\":\"podinfo\"}]}],\"volumes\":[{\"downwardAPI\":{\"items\":[{\"fieldRef\":{\"fieldPath\":\"metadata.labels\"},\"path\":\"labels\"},{\"fieldRef\":{\"fieldPath\":\"metadata.annotations\"},\"path\":\"annotations\"},{\"path\":\"cpu\_limit\",\"resourceFieldRef\":{\"containerName\":\"busybox\",\"divisor\":\"1m\",\"resource\":\"limits.cpu\"}},{\"path\":\"cpu\_request\",\"resourceFieldRef\":{\"containerName\":\"busybox\",\"divisor\":\"1m\",\"resource\":\"requests.cpu\"}},{\"path\":\"mem\_limit\",\"resourceFieldRef\":{\"containerName\":\"busybox\",\"divisor\":\"1Mi\",\"resource\":\"limits.memory\"}},{\"path\":\"mem\_request\",\"resourceFieldRef\":{\"containerName\":\"busybox\",\"divisor\":\"1Mi\",\"resource\":\"requests.memory\"}}]},\"name\":\"podinfo\"}]}}\n"
kubernetes.io/config.seen="2022-01-15T05:33:53.379386410Z"
kubernetes.io/config.source="api"2501253216
我们进入容器查看下挂载的文件:
$ sudo kubectl exec -it busybox-pod -- sh
/ # cd /etc/podinfo/
/etc/podinfo # ls
annotations cpu\_limit cpu\_request labels mem\_limit mem\_request
三、Downward API的能力
我们可以通过Downward API向容器注入如下信息:
1)可通过fieldRef获得的信息:
- metadata.name:Pod 名称
- metadata.namespace:Pod 名字空间
- metadata.uid:Pod 的 UID
- metadata.labels[’’]:Pod标签 的值 (例如, metadata.labels[‘mylabel’])
- metadata.annotations[’’]:Pod 的注解 的值(例如, metadata.annotations[‘myannotation’])
- metadata.labels:获取所有标签
- metadata.annotations:获取所有注解
- status.podIP:节点 IP
- spec.serviceAccountName:Pod 服务帐号名称, 版本要求v1.4.0-alpha.3
- spec.nodeName:节点名称, 版本要求 v1.4.0-alpha.3
- status.hostIP:节点 IP, 版本要求 v1.7.0-alpha.1
2)可通过 resourceFieldRef 获得的信息:
- 容器的 CPU 约束值
- 容器的 CPU 请求值
- 容器的内存约束值
- 容器的内存请求值
- 容器的巨页限制值(前提是启用了DownwardAPIHugePages 特性门控)
- 容器的巨页请求值(前提是启用了DownwardAPIHugePages 特性门控)
- 容器的临时存储约束值
- 容器的临时存储请求值
Docker 与 K8S学习笔记(二十)—— 使用Downward API向容器注入Pod信息相关推荐
- Docker 与 K8S学习笔记(十八)—— Pod的使用
Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/cou ...
- Mr.J-- jQuery学习笔记(二十八)--DOM操作方法(添加方法总结)
Table of Contents appendTo appendTo(source, target) 源代码 append prependTo prependTo源码 prepend ...
- 嵌入式系统设计师学习笔记二十八:嵌入式程序设计③——高级程序设计语言
嵌入式系统设计师学习笔记二十八:嵌入式程序设计③--高级程序设计语言 解释程序和编译程序 编译器的工作阶段示意图 语法错误:非法字符,关键字或标识符拼写错误 语法错误:语法结构出错,if--endif ...
- uniapp 学习笔记二十二 购物车页面结构搭建
uniapp 学习笔记二十二 购物车页面结构搭建 cart.vue <template><view><view class="flex padding" ...
- Polyworks脚本开发学习笔记(二十)-补充几个常见操作指令的使用
Polyworks脚本开发学习笔记(二十)-补充几个常见操作指令的使用 大概要写到结尾了,最后几篇就将手册的各常用命令再看一遍,组合一下,并列举出常见的一些有用的操作. DATA_COLOR_MAP数 ...
- JVM 学习笔记二十六、JVM监控及诊断工具-GUI篇
二十六.JVM监控及诊断工具-GUI篇 1.工具概述 使用上一张命令行工具或组合能帮您获取目标Java应用性能相关的基础信息,但他们存在下列局限: (1)无法获取方法级别的分析数据,如方法间的调用关系 ...
- JVM 学习笔记二十五、JVM监控及诊断工具-命令行篇
二十五.JVM监控及诊断工具-命令行篇 1.概述 性能诊断是软件工程师在日常工作中经常面对和解决的问题,在用户体验至上的今天,解决好应用软件的性能问题能带来非常大的收益. Java作为最流行的编程语言 ...
- 立创eda学习笔记二十八:在嘉立创购买pcb板并贴片(smt)
完整的写一下,分为两部分: 1.下pcb订单 这个可以看之前写的一个博客: 立创eda学习笔记三:pcb购买_Gutie_bartholomew的博客-CSDN博客 补充一下,买pcb可以直接有几个途 ...
- 【theano-windows】学习笔记二十——LSTM理论及实现
前言 上一篇学习了RNN,也知道了在沿着时间线对上下文权重求梯度的时候,可能会导致梯度消失或者梯度爆炸,然后我们就得学习一波比较常见的优化方法之LSTM 国际惯例,参考网址: LSTM Network ...
- 立创eda学习笔记二十六:手把手教你使用立创eda的官方教程
可以通过以下办法找到教程: 1,在软件界面点帮助-使用教程 2,在网站首页-帮助-教程进入 如何使用教程: 这里是一级目录,其实对新手最有用的是前面3个部分,后面的仿真先不看. 常见问题里面不光是讲的 ...
最新文章
- 继承的综合运用《Point类派生出Circle类而且进行各种操作》
- OPENCV3读取avi,解决返回NULL问题
- 【51NOD】1486 大大走格子
- OkHttp3的连接池及连接建立过程分析
- Interesting Array CodeForces - 483D(思维+线段树)
- UE4 多人联机显示每个人的playid
- 奇妙的安全旅行之DSA算法
- Windows完全卸载oracle11g步骤
- PAT乙级(1006 换个格式输出整数)
- 微信小程序分类小图标导航
- OPA2134UA IC AUDIO 2 CIRCUIT 8SOIC
- Java程序员该如何准备明年的「金三银四」跳槽季,你准备好了吗?
- 网络安全—Linux命令
- 【邮件处理】邮件eml文件解析
- 毛孔很大很难看该怎么处理
- 计算机屏保是不是休眠,计算机上屏保、待机、休眠、睡眠、关机的区别
- 移动端h5开发分辨率自适应
- 学习Web前端开发前景怎么样?
- Java4班题库-传智专修学院Java面试题库二
- 2022年上海市徐汇区创新型中小企业名单公示