k8s如何访问 pod 元数据

如何访问 pod 元数据

**我们在 pod 中运行容器的时候,是否也会有想要获取当前 pod 的环境信息呢?**咱们写的 yaml 清单写的很简单,实际上部署之后, k8s 会给我们补充在 yaml 清单中没有写的字段,那么我们的 pod 环境信息和容器的元数据如何传递到容器中呢?是不是也是通过获取这些 k8s 默认给我填写的字段呢?

有 3 种方式:

  • 通过环境变量的方式
  • 通过 Downward Api 的方式
  • 通过和 ApiServer 交互的方式

通过环境变量的方式

通过环境变量的方式获取 pod 的信息,还是比较简单的,还记得我们之前将卷中的数据转成环境变量传入到容器中的方式吗?

本次我们也是使用类似的方式来传递数据,应该说比之前的还要简单,不过我们本次传递的是环境信息,例如 pod 的 IP,pod 的 名称,命名空间,pod 所属的服务账号,节点的名称,CPU / 内存的请求 / 限制大小等等

我们任意看一下 pod 的 yaml 清单信息

上述 yaml 清单信息中,每一个字段我们都可以用来传递到容器中作为环境变量,我们可以来尝试写一个

  • 写一个 yaml 清单,创建名称为 my-downward 的 pod
  • 容器里面的使用 busybox 作为基础镜像,由于容器需要运行在 pod 中,因此我们需要运行一个程序在容器中,例如 sleep 8888888 或者其他的任意一个可以长期运行的程序

apiVersion: v1
kind: Pod
metadata:name: my-downward
spec:containers:- name: my-downwardimage: busyboxcommand: ["sleep","8888888"]env:- name: XMT_POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: XMT_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespace- name: XMT_NODENAMEvalueFrom:fieldRef:fieldPath: spec.nodeName- name: XMT_SERVICE_ACCOUNTvalueFrom:fieldRef:fieldPath: spec.serviceAccountName- name: XMT_REQUEST_CPUvalueFrom:resourceFieldRef:resource: requests.cpudivisor: 1m- name: XMT_LIMITS_MEMORYvalueFrom:resourceFieldRef:resource: limits.memorydivisor: 1Ki

上述自己配置了多个 XMT_* 的环境变量,来源都是在 pod 中的对应配置,kubectl create 上述 yaml 文件后,可以查看效果如下

环境变量如上所示,当我们容器里面需要使用该环境变量的时候,就可以随取随用了,很方便

可以看到容器中的环境变量和 yaml 清单上的 env 一一对应

通过 Downward Api 卷的方式

当然,我们也可以使用第二种方式,那就是通过 Downward Api 卷的方式,具体的操作方式和上述环境变量的方式类似,但是使用卷的方式,会在指定的路径下生成文件

Downward Api 看上去会不会想起 Restful Api,是不是都是通过访问接口的方式获取数据呢?

并不是这样的, Downward Api 实际上是将 pod 的定义和状态信息,作为容器的环境变量或者文件的方式,来给容器传递数据的,如图

Downward Api 卷的方式可以这么写:

apiVersion: v1
kind: Pod
metadata:name: my-downward-vvlabels:xmtconf: dev
spec:containers:- name: my-downward-vvimage: busyboxcommand: ["sleep","8888888"]volumeMounts:- name: my-downward-vvmountPath: /etc/myvvvolumes:- name: my-downward-vvdownwardAPI:items:- path: "xmtPodName"fieldRef:fieldPath: metadata.name- path: "xmtNamespace"fieldRef:fieldPath: metadata.namespace- path: "xmtLabels"fieldRef:fieldPath: metadata.labels

看这个 yaml 还是比较简单的,和写挂载的方式类似的,此处使用 downwardAPI 下的 items,来传递每一个数据,数据的来源写法和上述的环境变量类似

我们可以看到,Downward Api 挂载数据,具体的文件里面会以键值对的方式来呈现,也会以文本的形式来呈现

我们来将 pod 的标签修改成 prod,验证容器里面对应的文件是否会对应修改?

kubectl label pod my-downward-vv xmtconf=prod --overwrite

进入容器中查看 /etc/myvv/xmtLabels 文件是否有变化

通过上述效果,可以看出,当使用 Downward Api 卷的时候,对应的环境变量会以文件的形式存在于我们指定的目录下

若我们在程序运行中修改了环境变量对应的值,那么卷中的文件内容也会相应修改

如何与 APiServer 进行交互?

既然可以用第三种方式与 ApiServer 的方式,咋还使用环境变量和 Downward Api 的方式呢?

自然是因为 Downward Api 的方式有所局限,局限就是 Downward Api 的方式只能获取自身 pod 的数据,如果我们想获取其他 pod 的资源信息,这个时候我们就需要和 Api Server 进行交互了

类似于这样:

那么我们来写一个 pod, 让 pod 里面的容器与 ApiServer 进行交互,此处我们需要注意两点:

  • 我们要确定 ApiServer 的位置,我们才能有机会正确访问到
  • 需要通过 ApiServer 的认证

咱们写一个 pod ,用于在这个 pod 里面使用 curl 访问 ApiServer

自己制作一个简单的带有 curl 的镜像

FROM ubuntu:latest
RUN  apt-get update -y
RUN  apt install curl -y
ENTRYPOINT ["sleep", "8888888"]

制作该镜像,推送镜像到 dockerhub

docker build -t xiaomotong888/xmtcurl .
docker push xiaomotong888/xmtcurl

写一个简单的 yaml,运行 pod

mycurl.yaml

apiVersion: v1
kind: Pod
metadata:name: xmt-curl
spec:containers:- name: xmt-curlimage: xiaomotong888/xmtcurlcommand: ["sleep","8888888"]

pod 运行成功后,咱们进入到 容器里面

kubectl exec -it xmt-curl bash

咱们可以在 k8s 环境中查看一下 kubernetes 服务的 ip ,我们可以这样来访问

在容器中访问 kubernetes

这是因为没有证书,我们需要导入证书和 token , 这样才能正确的访问到 ApiServer,并且还需要一个重要的操作

创建一个 clusterrolebinding,需要创建了该绑定之后,才能正常的访问到 ApiServer,若没有创建该绑定,那么后面的步骤都做好了,ApiServer 也会报 403 Forbidden

kubectl create clusterrolebinding gitlab-cluster-admin --clusterrole=cluster-admin --group=system:serviceaccounts --namespace=dev

证书的位置还记的吗?

之前我们查看过默认的 k8s 挂载的位置,/var/run/secrets/kubernetes.io/serviceaccount 这里面有 命名空间,证书,token

这个时候,我们访问 k8s ApiServer 的时候,可以加上该证书

curl --cacert /var/run/secrets/kubernetes.io/serviceaccount/ca.crt https://kubernetes

我们可以导入一个环境变量,访问 k8s ApiServer 的时候就不需要收到导入证书了

export CURL_CA_BUNDLE=/var/run/secrets/kubernetes.io/serviceaccount/ca.crt

https://gitee.com/common_dev/mypic20220206/raw/master/image-20220204152125059.png

可以看到效果和刚才不一样了,现在报 403 是因为没有 token ,这个时候,我们在加上 token 即可

TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)

这样就可以看到 apiServer 都有哪些 api 了 , 这些 api 可都是我们在写 yaml 清单时候 apiVersion 的是时候填写的

那么用一个图来结束今天的分享

容器里面的应用通过证书与 ApiServer 完成认证,通过 token 和 namespace 和 ApiServer 完成接口的交互

今天就到这里,学习所得,若有偏差,还请斧正

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~
更多的可以查看 零声每晚八点直播:https://ke.qq.com/course/417774

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/5196.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数学建模-典型相关分析

上节回顾 论文:常州大学一等奖淡水养殖… 要进行 pearson 相关系数 画散点图、折线图看是否相关检验正态分布满足上述,利用pearson相关系数 刚开始推导不会没关系,会应用就行,推导过程略,之后学习了后续知识&#xff…

❤️创意网页:HTML5,canvas创作科技感粒子特效(科技感粒子、js鼠标跟随、粒子连线)

✨博主:命运之光 🌸专栏:Python星辰秘典 🐳专栏:web开发(简单好用又好看) ❤️专栏:Java经典程序设计 ☀️博主的其他文章:点击进入博主的主页 前言:欢迎踏入…

算法设计方法之回溯算法

回溯算法 介绍 回溯算法是算法设计中的一种方法。回溯算法是一种渐进式寻找并构建问题解决方式的策略。回溯算法会先从一个可能的动作开始解决问题,如果不行,就回溯并选择另一个动作,直到将问题解决。 就像你在一个迷宫里面遇到了当前有三…

Ubuntu 的安装及其设置

文章目录 安装 Ubuntu屏幕分辨率设置修改软件源服务器锁屏时间设置设置 dash跨系统拖拽复制文件的设置 安装 Ubuntu 首先安装 VMware 虚拟机,虚拟机的安装比较简单,一步步点击Next即可完成安装。 安装完成后启动虚拟机,点击创建新的虚拟机。…

AC+AP 旁挂式连接配置(华为)

AR1路由器配置 # interface GigabitEthernet0/0/0 ip address 10.1.30.1 255.255.255.0 ip route-static 10.1.20.0 255.255.255.0 10.1.30.2 # LSW1核心交换机 # dhcp enable vlan batch 10 20 30 interface Vlanif20 ip address 10.1.20.1 255.255.255.0 dhcp select in…

回归预测 | MATLAB实现基于ELM-Adaboost极限学习机结合AdaBoost多输入单输出回归预测

回归预测 | MATLAB实现基于ELM-Adaboost极限学习机结合AdaBoost多输入单输出回归预测 目录 回归预测 | MATLAB实现基于ELM-Adaboost极限学习机结合AdaBoost多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现基于ELM-Adaboost极限学…

模拟面试2

1.说一说ArrayList的实现原理? ArrayList底层基于数组实现,内部封装了Object类型的数组,实现了list接口,通过默认构造器创建容器时,该数组被初始化为一个空数组,首次添加数据时再将其初始化为容量为10的数组…

【个人笔记】linux的cd命令与目录结构理解

cd命令 cd(英文全拼:change directory)命令用于改变当前工作目录的命令,切换到指定的路径。 若目录名称省略,则变换至使用者的 home 目录 (也就是刚 login 时所在的目录)。 另外,~ 也表示为 home 目录 的…

【二分查找】LCP 18. 早餐组合

📍前言 🕺作者: 迷茫的启明星 学习路线C语言从0到1C初阶数据结构从0到1 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇码字不易,你的👍点赞🙌收藏❤️关注对…

菜鸟编程-python-函数,模块

目录 Python 函数 定义一个函数 语法 实例(Python 2.0+) Python 模块 support.py 模块: import 语

Java集合(List、Set、Map)

Java中的集合是用于存储和组织对象的数据结构。Java提供了许多不同的集合类,包括List、Set和Map等,以满足不同的需求。下面将介绍一些常见的Java集合类及其使用方法。 一、List List是一个有序的集合,它允许元素重复出现,并提供…

ArcGIS Pro工具一部分解释

序号 工具 功能介绍 1. 打包工程(PackageProject) 把工程所有内容打包一个文件 2. 合并工程(ConsolidateProject) 把工程和数据整理到同一个文件夹下 3. 要素转线(FeatureToLine) 把面要素转线要素或线要素打断 4. 定义投影(DefineProjection)

three.js学习记录(基础)

前言: 页面渲染3D特效,可以从各种图表库(例如ECharts)中寻找各种适用的模版,也可以寻找第三方插件。。。 一直以来都对three.js充满向往,终于偷闲找了个借口学了起来 参考资料 Three.js – JavaScript 3D…

什么?微信朋友圈能够一键转发了?

作为「国民级」聊天软件,微信朋友圈功能一直备受关注,毕竟社交 3 大巨头中,QQ 和微博都可以转发动态。那微信朋友圈能不能也像 QQ 空间这样,点击转发能分享到 QQ、微信和朋友圈呢? 那到底朋友圈转发怎么个转法&#xf…

流程图实现,基于vue2实现的流程图

1.基本思路 flex布局 伪元素实现竖直的连接线组件递归 2.效果图 2.1基础的(未截全,大致长这样) 2.2带有收缩功能的,可以展开和收缩并显示数量 3.待需要优化的点,根节点居中是基于整个流程图大小的来居中的&#xf…

使用 appium 进行微信小程序的自动化测试

目录 前言: 微信小程序结构 自动化用例的调整 示例代码 后记 前言: 微信小程序是一种流行的移动应用程序,它在移动设备上提供了丰富的功能和用户体验。为了确保微信小程序的质量和稳定性,自动化测试是必不可少的一环。Appiu…

肖sir___环境相关的面试题

环境相关面试题 1、请简述多有米环境的搭建、用到了哪些工具和流程介绍? jdk、服务器、代码包、数据库 2、查看当前端口被哪个应用程序占用了? netstat -ntlp |grep 端口号 lsof -i :端口号 ps -ef|grep 端口号 3、Tomcat和Nginx的区别,ngi…

VCSEL器件的常见参数有哪些?如何测试?

概述 垂直腔面发射激光器(VCSEL)是一种激光发射方向垂直于P-N结平面,而谐振腔面平行于P-N结平面的半导体激光器,它属于面发射激光器的一种。而EEL边射型激光器的光则是沿着水平方向,由芯片的边缘射出。与EEL相比, VCSEL的生产过程更具经济效益并且响应快,因此在越来越多的应用中…

element-ui message消息提示组件 ①延长提示消息在页面停留时间②提示消息换行

以实现下面的效果为示例 完整代码&#xff1a; let msgList ["数据1被引用", "数据2被引用"];// 使用html的换行标签拼接信息&#xff0c;默认行距太小&#xff0c;此处用两个<br/><br/>let message 以下数据不能删除&#xff0c;原因是&…

oracle常见面试回答

以下是Oracle面试中常见的一些问题和附加答案&#xff1a; 问题&#xff1a;什么是Oracle分区表&#xff1f; 答案&#xff1a;Oracle分区表是一种将表分成多个部分的机制&#xff0c;这些部分被称为分区。每个分区都是一个独立的对象&#xff0c;可以单独管理和维护。分区表…