前面在k8s技术圈微信群里面有朋友问到如何在容器中获取 POD 的基本信息,其实kubernetes原生就提供了支持的,那就是Downward API

介绍

Downward API提供了两种方式用于将 POD 的信息注入到容器内部:

  • 环境变量:用于单个变量,可以将 POD 信息和容器信息直接注入容器内部。
  • Volume挂载:将 POD 信息生成为文件,直接挂载到容器内部中去。

环境变量的方式

我们通过Downward API来将 POD 的 IP、名称以及所对应的 namespace 注入到容器的环境变量中去,然后我们在容器中打印全部的环境变量来进行验证,对应的yaml文件如下:(test-env-pod.yaml)

apiVersion: v1
kind: Pod
metadata:
    name: test-env-pod
    namespace: kube-system
spec:
    containers:
    - name: test-env-pod
      image: busybox:latest
      command: ["/bin/sh", "-c", "env"]
      env:
      - name: POD_NAME
        valueFrom:
          fieldRef:
            fieldPath: metadata.name
      - name: POD_NAMESPACE
        valueFrom:
          fieldRef:
            fieldPath: metadata.namespace
      - name: POD_IP
        valueFrom:
          fieldRef:
            fieldPath: status.podIP
复制代码

我们可以看到上面我们使用了一种新的方式来设置env的值:valueFrom。另外我们需要注意的是 POD 的 name 和 namespace 属于元数据,是在 POD 创建之前就已经定下来了的,所以我们使用 metata 获取就可以了,但是对于 POD 的 IP 则不一样,因为我们知道 POD IP 是不固定的,POD 重建了就变了,它属于状态数据,所以我们使用 status 去获取。

除了使用fieldRef获取 POD 的基本信息外,还可以通过resourceFieldRef去获取容器的资源请求和资源限制信息。

接下来我们利用kubectl工具创建上面的 POD:

$ kubectl create -f test-env-pod.yaml
pod "test-env-pod" created
复制代码

POD 创建成功后,我们可以查看日志:

$ kubectl logs test-env-pod -n kube-system |grep POD
POD_IP=172.30.19.24
POD_NAME=test-env-pod
POD_NAMESPACE=kube-system
复制代码

我们可以看到 POD 的 IP、NAME、NAMESPACE 都通过环境变量打印出来了。

Volume挂载

Downward API除了提供环境变量的方式外,还提供了通过Volume挂载的方式去获取 POD 的基本信息。接下来我们通过Downward API将 POD 的 Label、Annotation 等信息通过 Volume 挂载到容器的某个文件中去,然后在容器中打印出该文件的值来验证。 新建文件 yaml 文件:(test-volume-pod.yaml)

apiVersion: v1
kind: Pod
metadata:
    name: test-volume-pod
    namespace: kube-system
    labels:
        k8s-app: test-volume
        node-env: test
    annotations:
        build: test
        own: qikqiak
spec:
    containers:
    - name: test-volume-pod-container
      image: busybox:latest
      command: ["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;sleep 3600;done;
      volumeMounts:
      - name: podinfo
        mountPath: /etc/podinfo
    volumes:
    - name: podinfo
      downwardAPI:
        items:
        - path: "labels"
          fieldRef:
            fieldPath: metadata.labels
        - path: "annotations"
          fieldRef:
            fieldPath: metadata.annotations
复制代码

我们将元数据 labels 和 annotaions 以文件的形式挂载到了/etc/podinfo目录下,创建上面的 POD :

$ kubectl create -f test-volume-pod.yaml
pod "test-volume-pod" created
复制代码

然后查看日志:

$ kubectl logs test-volume-pod -n kube-system
k8s-app="test-volume"
node-env="test"build="test"
kubernetes.io/config.seen="2018-03-02T17:51:10.856356259+08:00"
kubernetes.io/config.source="api"
own="qikqiak"
复制代码

我们通过打印出来的日志可以看到 POD 的 Labels 和 Annotations 信息都被挂载到 /etc/podinfo目录下面的 lables 和 annotations 文件了。

在实际应用中,如果你的应用有获取 POD 的基本信息的需求,一般我们就可以利用Downward API来获取基本信息,然后编写一个启动脚本或者利用initContainer将 POD 的信息注入到我们容器中去,然后在我们自己的应用中就可以正常的处理相关逻辑了。

原文链接:blog.qikqiak.com/post/use-do…

扫描下面的二维码(或微信搜索k8s技术圈)关注我们的微信公众帐号,即可加入到我们的 kubernetes 讨论群里面共同学习。

Kubernetes Downward API 基本用法相关推荐

  1. 深度学习和目标检测系列教程 12-300:常见的opencv的APi和用法总结

    @Author:Runsen 由于CV需要熟练使用opencv,因此总结了opencv常见的APi和用法. OpenCV(opensourcecomputervision)于1999年正式推出,它来自 ...

  2. Boost:原子API的用法测试程序

    Boost:原子API的用法测试程序 实现功能 C++实现代码 实现功能 atomic原子API的用法测试程序 C++实现代码 #include <boost/atomic.hpp> #i ...

  3. Harfbuzz API 基本用法

    [Harfbuzz](http://harfbuzz.org/ 是一个 OpenType 文本整形引擎.当前的 Harfbuzz 代码库,之前被称为 harfbuzz-ng,版本号为 1.x.x,它是 ...

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

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

  5. php单元格字体颜色,PHPExcel API接口用法大全,按模板导入excel,美化excel,导出图片,设置单元格字体颜色背景色边框,合并单元格,设置行高列宽...

    PHPExcel API接口用法大全,按模板导入excel,美化excel,导出图片,设置单元格字体颜色背景色边框,合并单元格,设置行高列宽 2020-08-31 85 一:读取excel表模板$ph ...

  6. kubernetes 实用 api list

    2019独角兽企业重金招聘Python工程师标准>>> kubernetes 实用 api list 博客分类: Kubernetes 收集整理一些可能较常用的api,结合kuber ...

  7. kubernetes的api操作和kubectl的源码剖析

    1.kubernetes的api文档的网址: https://kubernetes.io/docs/concepts/overview/kubernetes-api/ 2.kubernetes的go语 ...

  8. Kubernetes原生api部署微服务5-监听Pod

    我们使用Client-go中的informer来监听用户微服务与文章微服务的Pod. Informer代替Controller去访问k8s-apiserver,而Controller的所有操作(如:查 ...

  9. 关于Kubernetes中API Server使用token、kubeconfig文件认证的一些笔记

    写在前面 学习K8s涉及,整理笔记记忆 博文偏实战,内容涉及: token方式的API Server认证Demo Kubeconfig文件方式的API Server认证Demo Kubeconfig文 ...

  10. 关于 Kubernetes中API Server授权(RBAC)管理的一些笔记

    写在前面 学习K8s涉及,整理笔记记忆 博文偏实战,内容涉及: k8s中API Server的授权策略简述 RBAC授权策略中涉及到的资源对象创建删除 Role ClusterRole RoleBin ...

最新文章

  1. VC 中类型转换(转)
  2. 一个算法对于某个输入的循环次数是可以事先估计出来的_数据结构与算法:算法...
  3. c语言若对函数未加,【单选题】C 语言程序中,若对函数类型未加显式说明,则函数的隐含说明类型为A. void B. double C. int D. char...
  4. 探讨mutex与semaphore
  5. 外网服务器搭建网站并获取域名教程
  6. SQL Server2012如何导出sql脚本并且还原数据库
  7. cad镜像后标注尺寸数字反了_CAD画法大全
  8. 关于计算机中 二进制位(bit)、字节(Byte)、 千字节(KB)等之间的关系
  9. 新浪动作挺快,开始再博客投广告了
  10. Windows10家庭版转为专业版
  11. Jenkins+Gerrit创建新工程手顺
  12. 图的生成树与生成森林
  13. 使用七牛云进行存储图片并返回URL
  14. ICP许可证过期了还能补办吗
  15. Canonical Juju 使用笔记
  16. 京东涉足B2B 叫板阿里巴巴
  17. QGC地面站对PX4无人机速度进行限制
  18. Reids实战——优惠券秒杀(全局唯一ID生成策略)
  19. ajax调用远程webservice,ajax跨域请求调用webservice接口
  20. docker+nginx+tomcat*3在华为云服务器上的负载均衡

热门文章

  1. Windows11 21H2 专业版 64位 v2022 【全新装机】
  2. dll 不是 PML.NET callable问题解决办法
  3. 轻松掌握Logstash的grok匹配
  4. getUserProfile:fail can only be invoked by user TAP gesture
  5. 推荐三款好用的终端开发平台
  6. iphone 蓝牙开发 总结
  7. meta http-equiv=“X-UA-Compatible“ content=““ 的作用
  8. js Qrcode.js实现文字内容通过二维码展示
  9. P2704 [NOI2001] 炮兵阵地
  10. 来自陈沙克日志的收藏