kubernetes Downward API
kubernetes 官方Downward API
有两种方式可以将Pod信息呈现:
- 环境变量
- 卷文件
一、可提供的信息
下面这些信息可以通过环境变量
和 downwardAPI 卷
提供给容器:
fieldRef
环境变量 | 名称 |
---|---|
metadata.name | Pod 名称 |
metadata.namespace | Pod 名称空间 |
metadata.uid | Pod的UID |
metadata.labels | Pod 标签 |
metadata.annotations | Pod 的注解 |
resourceFieldRef
- 容器的 CPU 约束值
- 容器的 CPU 请求值
- 容器的内存约束值
- 容器的内存请求值
直接可通过环境变量显示Pod信息
环境变量 | 名称 |
---|---|
status.podIP | Pod的 IP |
spec.serviceAccountName | Pod 服务帐号名称 |
spec.nodeName | 节点名称 |
status.hostIP | 节点 IP |
其中: 如果容器未指定 CPU 和内存限制
,则 Downward API 默认将节点可分配值 视为容器的 CPU 和内存限制。
二、Downward API测试
存储(卷挂载文件)
1、书写资源清单
vim downwardapi-volume.yaml
apiVersion: v1
kind: Pod
metadata:name: downwardapi-volumelabels: #标签部分zone: testcluster: kubernetesrack: jenkinspipelineannotations: #注解部分build: dockfilebuilder: jenkinsfile
spec:containers:- name: downwardapi-volumeimage: busyboxcommand: ["sh", "-c"] #执行脚本(相当于docke entrypoint)args: #执行脚本(相当于docker cmd)- 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/name ]]; thenecho -en '\n\n';cat /etc/podinfo/name;fi;if [[ -e /etc/podinfo/namespace ]]; thenecho -en '\n\n';cat /etc/podinfo/namespace;fi;if [[ -e /etc/podinfo/UID ]]; thenecho -en '\n\n';cat /etc/podinfo/UID;fi;sleep 5;done;volumeMounts:- name: podinfomountPath: /etc/podinfo #挂载在容器种的绝对路径volumes:- name: podinfodownwardAPI:items:- path: "labels" #/etc/podinfo路径下的文件名称fieldRef:fieldPath: metadata.labels- path: "annotations"fieldRef:fieldPath: metadata.annotations- path: "name"fieldRef:fieldPath: metadata.name- path: "namespace"fieldRef:fieldPath: metadata.namespace- path: "UID"fieldRef:fieldPath: metadata.uid
2、生成资源清单
kubectl apply -f downwardapi-volume.yaml
3、查看注入信息
kubectl logs downwardapi-volume
环境变量
方式一:卷挂载型
1、书写资源清单
vim downwardapi-volume-resources.yaml
apiVersion: v1
kind: Pod
metadata:name: downwardapi-volume-resources
spec:containers:- name: downwardapi-volume-resourcesimage: busyboxcommand: ["sh", "-c"]args:- while true; doecho -en '\n';if [[ -e /etc/podinfo/cpu_limit ]]; thenecho -en '\n'; cat /etc/podinfo/cpu_limit; fi;if [[ -e /etc/podinfo/cpu_request ]]; thenecho -en '\n'; cat /etc/podinfo/cpu_request; fi;if [[ -e /etc/podinfo/mem_limit ]]; thenecho -en '\n'; cat /etc/podinfo/mem_limit; fi;if [[ -e /etc/podinfo/mem_request ]]; thenecho -en '\n'; cat /etc/podinfo/mem_request; fi;sleep 5;done;resources:requests:memory: "32Mi"cpu: "125m"limits:memory: "64Mi"cpu: "250m"volumeMounts:- name: podinfomountPath: /etc/podinfovolumes:- name: podinfodownwardAPI:items:- path: "cpu_limit"resourceFieldRef:containerName: downwardapi-volume-resourcesresource: limits.cpudivisor: 1m- path: "cpu_request"resourceFieldRef:containerName: downwardapi-volume-resourcesresource: requests.cpudivisor: 1m- path: "mem_limit"resourceFieldRef:containerName: downwardapi-volume-resourcesresource: limits.memorydivisor: 1Mi- path: "mem_request"resourceFieldRef:containerName: downwardapi-volume-resourcesresource: requests.memorydivisor: 1Mi
2、生成资源清单
kubectl apply -f downwardapi-volume-resources.yaml
3、查看注入信息
kubectl logs downwardapi-volume-resources -f
方式二:直接注入环境
vim downwardapi-env.yaml
apiVersion: apps/v1
kind: Deployment #控制器
metadata:name: downwardapi-env #这个标签为启动pod时候的名字
spec:replicas: 3 #启动副本数selector: #设置标签matchLabels:app: downwardapi-env #这个标签相当于分组,查看(kubectl get pods --show-labels)minReadySeconds: 5 #等待设置的时间后才进行升级,(如果没有设置该值,在某些极端情况下可能会造成服务不正常运行)revisionHistoryLimit: 2 #要保留以允许回滚的旧复制集数strategy: #策略type: RollingUpdate #默认为滚动更新(可以不写)rollingUpdate: #滚动更新maxSurge: 1 #升级过程中最多可以比原先设置多出的POD数量maxUnavailable: 1 #升级过程中最多有多少个POD处于无法提供服务的状态(该不为0)template: #模板(相当于定义好的一个python中的模块)metadata:labels:app: downwardapi-env #这个标签需要selector定义的标签一个,划分在同一个组spec:containers: #模板(容器模板)- name: downwardapi-env #node节点启动的容器名字(kind控制器名字+标签名)image: nginx #镜像名imagePullPolicy: IfNotPresent #拉取镜像(选择方式——直接使用本地拥有的镜像)env:- name: MY_NODE_NAME #容器的环境变量名称valueFrom:fieldRef:fieldPath: spec.nodeName- name: MY_NODE_IPvalueFrom:fieldRef:fieldPath: status.hostIP- name: MY_POD_IPvalueFrom:fieldRef:fieldPath: status.podIP- name: MY_POD_SAvalueFrom:fieldRef:fieldPath: spec.serviceAccountNameports:- containerPort: 80 #容器开放的监听端口resources: #资源limits: #限制memory: "500M"cpu: "0.2" #0.1代表200mrequests: #请求memory: "250M"cpu: "0.1" #0.1代表100mrestartPolicy: Always #重新启动pod中所有容器的策略
kubectl exec -it downwardapi-env-787b88b6cf-26gqk -- env |grep MY
这里不知道status.hostIP没有生效,我的版本已经大于v1.7.0-alpha.1。
三、Downward API的动机
对于容器来说,有时候拥有自己的信息是很有用的,可避免与 Kubernetes 过度耦合。 Downward API 使得容器使用自己或者集群的信息
,而不必通过
Kubernetes 客户端或 API 服务器来获得。
一个例子是有一个现有的应用假定要用一个非常熟悉的环境变量来保存一个唯一标识
。 一种可能是给应用增加处理层,但这样是冗余和易出错的,而且它违反了低耦合的目标
。 更好的选择是使用 Pod 名称作为标识
,把 Pod 名称注入这个环境变量中
总结:更好的选择是使用 Pod 名称作为标识
kubernetes Downward API相关推荐
- 深入了解Kubernetes REST API的工作方式
关于Kubernetes REST API的工作方式: 在哪里以及如何定义从REST路径到处理REST调用的函数的映射? 与etcd的交互发生在哪里? 从客户端发出请求到保存在etcd中对象的端到端路 ...
- kubernetes 实用 api list
2019独角兽企业重金招聘Python工程师标准>>> kubernetes 实用 api list 博客分类: Kubernetes 收集整理一些可能较常用的api,结合kuber ...
- kubernetes的api操作和kubectl的源码剖析
1.kubernetes的api文档的网址: https://kubernetes.io/docs/concepts/overview/kubernetes-api/ 2.kubernetes的go语 ...
- Kubernetes原生api部署微服务5-监听Pod
我们使用Client-go中的informer来监听用户微服务与文章微服务的Pod. Informer代替Controller去访问k8s-apiserver,而Controller的所有操作(如:查 ...
- 关于Kubernetes中API Server使用token、kubeconfig文件认证的一些笔记
写在前面 学习K8s涉及,整理笔记记忆 博文偏实战,内容涉及: token方式的API Server认证Demo Kubeconfig文件方式的API Server认证Demo Kubeconfig文 ...
- 关于 Kubernetes中API Server授权(RBAC)管理的一些笔记
写在前面 学习K8s涉及,整理笔记记忆 博文偏实战,内容涉及: k8s中API Server的授权策略简述 RBAC授权策略中涉及到的资源对象创建删除 Role ClusterRole RoleBin ...
- 解析kubernetes Aggregated API Servers
kubernetes的 Aggregated API是什么呢?它是允许k8s的开发人员编写一个自己的服务,可以把这个服务注册到k8s的api里面,这样,就像k8s自己的api一样,你的服务只要运行在k ...
- Kubernetes Cluster API(OpenStack)
描述 此文章的内容主要是通过 kubernetes cluster-api 对象,管理多个部署在 openstack 平台上的 kubernetes 集群. · 资源说明 此次实验需要的资源: 一个支 ...
- tekton入门 - 起步
介绍 Tekton是Kubernetes原生的持续集成和交付CI/CD解决方案.它允许开发人员跨云提供商和本地系统构建.测试和部署 包含以下四个组件 Pipelines triggers cli da ...
- 资深专家深度剖析Kubernetes API Server第1章(共3章)
欢迎来到深入学习Kubernetes API Server的系列文章,在本系列文章中我们将深入的探究Kubernetes API Server的相关实现.如果你对Kubernetes的内部实现机制比较 ...
最新文章
- 【追寻javascript高手之路04】理解prototype
- 如何运行Perl和查看帮助
- 洛谷P1908求逆序对【树状数组】
- POJ 3621 Sightseeing Cows
- bose耳机信号断续_最强真无线降噪耳机?BOSE QC Earbuds消噪耳塞上手评测
- 递归算法分析-最简单的例子
- linux免费商用字体,免费可商用字体~文泉驿正黑体
- 黑苹果声卡id注入对照表_声卡,给苦苦做AppleALC的新人一个提示,试着先原版AppleALC.kext,注入ID驱动试试...
- 服务器双系统快捷键,mac双系统切换快捷键
- 文件夹下载器案例实战
- 史上最全的 SQL 注入资料,收藏不谢
- Eclipse护眼背景及字体设置
- 【洛谷2791】 幼儿园篮球题 第二类斯特林数+NTT
- R语言关于心脏病相关问题的预测和分析
- 二叉树的先序遍历(源代码)
- Popular MVC框架请求响应数据加解密@Decrypt和@Encrypt的使用示例
- 一场世界杯比赛的时间把热情从38.5降到36.5
- bootstrap开发tab选项卡事例
- 视频如何制作虚化边框背景的效果?
- 嵌入式驱动编写-点亮LED驱动程序