当前位置: 首页 > news >正文

【K8S系列】深入解析Pod对象(二)

目录

序言

1.Volume 简单介绍

2 Projected Volume 介绍

2.1 Secret

2.1.1 yaml讲解

2.1.2 创建Pod 

2.2 Downward API 

2.2.1 yaml示例

2.2.2 Downward API 支持字段 

3 投票


 

序言

任何一件事情,只要坚持六个月以上,你都可以看到质的飞跃。

在上一篇文章中,【K8S系列】深入解析Pod对象(一)

我们深入解析了 Pod 的 API 对象,讲解了 Pod 和 Container 的关系。

作为 Kubernetes 项目里最核心的编排对象,Pod 携带的信息非常丰富。

今天,从一种特殊的 Volume ——Projected Volume 开始,主要讲解:

  1. Secret
  2. Downward API

从上面这两种类型展开,希望能帮助你更加深入地理解 Pod 对象各个重要字段的含义。

文章标记颜色说明:

  • 黄色:重要标题
  • 红色:用来标记结论
  • 绿色:用来标记一级论点
  • 蓝色:用来标记二级论点

1.Volume 简单介绍

Kubernetes(k8s)中的 Volume 是一种抽象概念,用于表示容器中的存储设备

Volume 可以包含多个容器,以便它们可以在容器之间共享数据。Volume 在容器内部进行挂载,从而使容器中的应用程序可以像使用本地存储设备一样使用它们。

Kubernetes 中的 Volume 具有以下特点:

  1. 生命周期:Volume 可以独立于容器而存在,因此可以在容器之间共享和重用数据。

  2. 类型:Kubernetes 中支持多种类型的 Volume,例如 persistentVolumeClaim(PVC)emptyDir、hostPath、configMap、secret 、downwardAPI、projected、CSI等等。每种 Volume 类型都有其特定的用途和限制。

  3. 挂载方式:Volume 可以通过不同的挂载方式挂载到容器中,例如作为容器的文件夹、作为容器的环境变量等等。每种挂载方式也都有其特定的用途和限制

  4. 存储介质:Volume 可以与不同的存储介质一起使用,例如本地磁盘、网络存储、云存储等等。

Kubernetes 中的 Volume 提供了一种灵活、可扩展的方式来管理容器中的数据存储。通过使用 Volume,可以轻松地实现容器之间的数据共享和数据持久化,从而使 Kubernetes 应用程序更加可靠和可维护。

2 Projected Volume 介绍

在 Kubernetes 中,有几种特殊的 Volume,它们存在的意义不是为了存放容器里的数据,也不是用来进行容器和宿主机之间的数据交换。

这些特殊 Volume 的作用,是为容器提供预先定义好的数据。

所以,从容器的角度来看,这些 Volume 里的信息就是仿佛是被 Kubernetes“投射”(Project)进入容器当中的。这正是 Projected Volume 的含义

详细介绍一下:

Kubernetes(k8s)中的 projected Volume 是一种特殊的 Volume 类型,可以把它翻译为“投射数据卷”。

简单说,它可以将多个 Volume 类型投影到一个 Volume 中

它可以将多个 Volume 挂载到容器中,从而实现更加灵活和高效的容器化部署。

projected Volume 支持以下四种 Volume 类型的投影

  1. Secret:将 Kubernetes 中的 Secret 对象挂载到容器中,从而使容器可以访问加密的敏感信息,如密码、证书等。

  2. ConfigMap:将 Kubernetes 中的 ConfigMap 对象挂载到容器中,从而使容器可以访问 ConfigMap 中的配置信息

  3. DownwardAPI:将容器的元数据(如 Pod 名称、命名空间、标签等)挂载到容器中,从而使容器可以访问自身的元数据

  4. ServiceAccountToken:将 ServiceAccount 的令牌挂载到容器中,从而使容器可以通过 API 服务器与 Kubernetes API 进行通信

使用 projected Volume 可以将多个 Volume 类型投影到一个 Volume 中,从而简化 Volume 的管理和配置

例如,可以将 ConfigMap 和 Secret 投影到一个 Volume 中,并将其挂载到容器中,以便容器可以访问配置信息和加密的敏感信息。

使用 projected Volume 可以提高容器应用程序的灵活性和可维护性,从而更加高效地进行容器化部署。

2.1 Secret

2.1.1 yaml讲解

我们先来看一下Secret,它的作用,是帮你把 Pod 想要访问的加密数据,存放到 Etcd 中。然后,就可以通过在 Pod 的容器里挂载 Volume 的方式,访问到这些 Secret 里保存的信息了。

Secret 最典型的使用场景,是存放数据库的 Credential 信息,比如下面这个例子:

文件名:test-projected-volume.yaml

apiVersion: v1
kind: Pod
metadata:name: test-projected-volume 
spec:containers:- name: test-secret-volumeimage: busyboxargs:- sleep- "86400"volumeMounts:- name: mysql-credmountPath: "/projected-volume"readOnly: truevolumes:- name: mysql-credprojected:sources:- secret:name: user- secret:name: passward

小插曲:

在这个例子中,我们用到了BusyBox镜像,简单介绍下这个镜像:

BusyBox是一个开源项目,提供了一个类似于UNIX操作系统的命令行界面,它包含了许多常用的工具程序,如文件操作、文本处理、网络配置、系统监测等。它被设计成在嵌入式系统中使用,因为它占用的空间很小,可以在资源受限的设备上运行。

在容器技术中,BusyBox通常被用作一个基础镜像,因为它非常轻量级,可以帮助构建小型容器,这也是它被称为"微型容器"的原因

另外,很多容器镜像都会以BusyBox为基础,通过添加其他应用程序和库来构建完整的应用程序容器

言归正传,讲下yaml示例:

在这个 Pod 中,定义了一个简单的容器。它声明挂载的 Volume,是 projected 类型。这个 Volume 的数据来源(sources),则是名为 user 和 pass 的 Secret 对象,分别对应的是数据库的用户名和密码。 

这里用到的数据库的用户名、密码,就是以 Secret 对象的方式交给 Kubernetes 保存的。完成这个操作的指令,如下所示:

$ kubectl create secret generic user --from-file=./username.txt
$ kubectl create secret generic passward --from-file=./password.txt

如果要查看这些 Secret 对象的话,只要执行一条 kubectl get 命令就可以了:

kubectl get secrets

结果如下

NAME           TYPE                                DATA      AGE
user          Opaque                                1         30s
passward      Opaque                                1         30s

又来一个小插曲:

除了使用 kubectl create secret 指令外,我们也可以直接通过编写 YAML 文件的方式来创建这个 Secret 对象,如:

apiVersion: v1
kind: Secret
metadata:name: mytestsecret
type: Opaque
data:user: YWRtaW4=passward: YWRtaW4xMjM0

注意:通过编写 YAML 文件创建出来的 Secret 对象只有一个。

它的 data 字段,是以 Key-Value 的格式保存了两份 Secret 数据。其中,“user”就是第一份数据的 Key,“passward”是第二份数据的 Key。

需要注意的是,Secret 对象要求这些数据必须是经过 Base64 转码的,以免出现明文密码的安全隐患。这个转码操作也很简单,比如:

➜  ~ echo -n 'admin' | base64
YWRtaW4=
➜  ~ echo -n 'admin1234' | base64
YWRtaW4xMjM0

Tips:

需要注意的是,像这样创建的 Secret 对象,它里面的内容仅仅是经过了转码,而并没有被加密。在真正的生产环境中,需要在 Kubernetes 中开启 Secret 的加密插件,增强数据的安全性

2.1.2 创建Pod 

言归正传:

我们来创建一下这个 Pod,文件名为:test-projected-volume.yaml

kubectl create -f test-projected-volume.yaml

查看结果:

$ kubectl exec -it test-projected-volume -- /bin/sh
$ ls /projected-volume/
user
passward
$ cat /projected-volume/user
admin
$ cat /projected-volume/passward
admin1234

从上面结果中,可以看到,保存在 Etcd 里的用户名和密码信息,已经以文件的形式出现在了容器的 Volume 目录里。

而这个文件的名字,就是 kubectl create secret 指定的 Key,或者说是 Secret 对象的 data 字段指定的 Key。

更重要的是,像这样通过挂载方式进入到容器里的 Secret,一旦其对应的 Etcd 里的数据被更新,这些 Volume 里的文件内容,同样也会被更新。其实,这是 kubelet 组件在定时维护这些 Volume。

2.2 Downward API 

2.2.1 yaml示例

Downward API:是让 Pod 里的容器能够直接获取到这个 Pod API 对象本身的信息。

举例:

apiVersion: v1
kind: Pod
metadata:name: test-downwardapi-volumelabels:zone: us-est-coastcluster: test-cluster1rack: rack-22
spec:containers:- name: client-containerimage: k8s.gcr.io/busyboxcommand: ["sh", "-c"]args:- while true; doif [[ -e /etc/podinfo/labels ]]; thenecho -en '\n\n'; cat /etc/podinfo/labels; fi;sleep 5;done;volumeMounts:- name: podinfomountPath: /etc/podinforeadOnly: falsevolumes:- name: podinfoprojected:sources:- downwardAPI:items:- path: "labels"fieldRef:fieldPath: metadata.labels

在这个 Pod 的 YAML 文件中,定义了一个简单的容器,声明了一个 projected 类型的 Volume。

只不过这次 Volume 的数据来源,变成了 Downward API。而这个 Downward API Volume,则声明了要暴露 Pod 的 metadata.labels 信息给容器。

2.2.2 Downward API 支持字段 

Kubernetes Downward API 允许容器在运行时通过环境变量或卷挂载的方式获取 Pod 和容器的元数据信息。支持的字段包括:

  1. metadata.name: Pod 的名称
  2. metadata.namespace: Pod 的命名空间
  3. metadata.labels: Pod 的标签
  4. metadata.annotations: Pod 的注释
  5. spec.nodeName: Pod 调度到的节点名称
  6. spec.serviceAccountName: Pod 使用的服务账户名称
  7. spec.containers[*].name: 容器名称
  8. spec.containers[*].image: 容器使用的镜像名称
  9. spec.containers[*].imagePullPolicy: 容器拉取镜像使用的策略
  10. spec.containers[].ports[].containerPort: 容器暴露的端口号
  11. spec.containers[].env[].name: 容器中定义的环境变量名称
  12. spec.containers[].env[].value: 容器中定义的环境变量值
  13. status.hostIP: Pod 调度到的节点的 IP 地址
  14. status.podIP: Pod 的 IP 地址
  15. status.podIPs[*].ip: Pod 的 IP 地址(多网卡情况下)
  16. status.startTime: Pod 启动时间

需要注意的是,这些字段可能会因 Kubernetes 版本而有所不同,具体的支持情况需要参考相应版本的文档

不过,需要注意的是,Downward API 能够获取到的信息,一定是 Pod 里的容器进程启动之前就能够确定下来的信息

而你如果想要获取 Pod 容器运行后才会出现的信息,比如,容器进程的 PID,那就肯定不能使用 Downward API 了,而应该考虑在 Pod 里定义一个 sidecar 容器。

其实,Secret、ConfigMap,以及 Downward API 这三种 Projected Volume 定义的信息,大多还可以通过环境变量的方式出现在容器里。

但是,通过环境变量获取这些信息的方式,不具备自动更新的能力。所以,一般情况下,都建议你使用 Volume 文件的方式获取这些信息。

3 投票

 

相关文章:

【K8S系列】深入解析Pod对象(二)

目录 序言 1.Volume 简单介绍 2 Projected Volume 介绍 2.1 Secret 2.1.1 yaml讲解 2.1.2 创建Pod 2.2 Downward API 2.2.1 yaml示例 2.2.2 Downward API 支持字段 3 投票 序言 任何一件事情,只要坚持六个月以上,你都可以看到质的飞跃。 在…...

从3千到3万,我的测试之路真的坎坷

其实测试行业未来发展之路是几乎所有关于软件测试工程师都会在意的话题,相信各位看官也很迷茫自己的发展路线。为了方便大家选择和比较,我也将我的经验和观点分享出来,以作参考。如果小伙伴们有更好的观点,欢迎分享和探讨&#xf…...

linux下使用system函数在程序中运行linux的shell命令

一、功能 linux下在程序中调用shell命令实现某个功能&#xff0c;比如拷贝命令cp 二、使用 添加头文件 #include <stdlib.h> 函数原型 int system(const char *command); 描述说明是system的调用过程&#xff1a; 使用fork创建一个子进程&#xff0c;子进程使用 execl 执…...

银行数字化转型导师坚鹏:银行业发展趋势及对人才的需求分析

数字化转型背景下银行业发展趋势及对人才的需求分析 ——洞察先机&#xff0c;重塑人才核心竞争力 课程背景&#xff1a; 数字化转型背景下&#xff0c;很多银行存在以下问题&#xff1a;不知道银行整体发展现状与发展趋势&#xff1f;不清楚金融科技对银行发展有什么影响&…...

NFS挂载

0、创建 mkdir /nfsdata mkfs.xfs /dev/vdb mount /dev/vdb /nfsdata 1、两边主机启动nfs服务 service nfs start 2、被挂载主机查看&#xff0c;文件系统是否可挂载 showmount -e 3、将被挂载主机&#xff0c;设置任何主机可挂载文件系统 vi /etc/exports /nfsdata (in…...

IDEA使用技巧

IntelliJ IDEA是一款流行的Java集成开发环境&#xff08;IDE&#xff09;&#xff0c;它为开发者提供了许多有用的功能和工具来提高他们的工作效率和开发质量。直接使用IntelliJ IDEA就相当于节省了自己的时间&#xff0c;如果先使用其他编译器后来在使用IntelliJ IDEA会觉得非…...

自动化测试之一【接口测试总结】

本文主要分为两个部分&#xff1a;第一部分&#xff1a;主要从问题出发&#xff0c;引入接口测试的相关内容并与前端测试进行简单对比&#xff0c;总结两者之前的区别与联系。但该部分只交代了怎么做和如何做&#xff1f;并没有解释为什么要做&#xff1f;第二部分&#xff1a;…...

科大奥瑞物理实验——傅里叶光学

实验名称&#xff1a;傅里叶光学 1. 实验目的&#xff1a; 加深对傅里叶光学中的一些基本概念和基本理论的理解&#xff0c;如空间频率空间频谱和空间滤波和卷积等。通过实验验证阿贝成像理论&#xff0c;理解透镜成像的物理过程&#xff0c;进而掌握光学信息处理实质。通过阿…...

mysql count(*)的性能如何?

文章目录 为什么会出现这种情况呢?如何优化count(*)性能?增加redis缓存加二级缓存多线程执行减少join的表改成ClickHousecount的各种用法性能对比为什么会出现这种情况呢? 在Mysql中,count(*)的作用是统计表中记录的总行数。 而count()的性能跟存储引擎有直接关系,并非所…...

gan实战(基础GAN、DCGAN)

一、基础Gan 1.1 参数 &#xff08;1&#xff09;输入&#xff1a;会被放缩到6464 &#xff08;2&#xff09;输出&#xff1a;6464 &#xff08;3&#xff09;数据集&#xff1a;https://pan.baidu.com/s/1RY1e9suUlk5FLYF5z7DfAw 提取码&#xff1a;8n89 1.2 实现 import t…...

使用C语言实现服务器/客户端的TCP通信

本文力求使用简单的描述说明一个服务器/客户端TCP通信的基本程序框架,文中给出了服务器端和客户端的实例源程序,本文的程序在ubuntu 20.04中编译运行成功,gcc版本号为:9.4.0 1. 前言 当两台主机间需要通信时,TCP和UDP是两种最常用的传输层协议,TCP是一种面向连接的传输协…...

AI模型训练推理一定要知道的事情

AI训练的算力要求 算力 模型训练需要大量计算资源&#xff0c;包括CPU( Central Processing Unit)、GPU(Graphical Processing Unit)、TPU(Tensor Processing Unit)等&#xff0c;其中GPU是最为常见的硬件加速器。另外还可以通过算法优化提高模型训练效率。例如分布式训练技术…...

SPSS27破解安装后,出现应用程序无法正常启动(0xc000007b)

破解完SPSS 27软件后&#xff0c;点击图标出现下图错误 可以尝试以下方法&#xff1a; 1. 在安装目录下找到VC开头的文件夹 2. 点击此软件进行修复 若修复完成&#xff0c;重新启动SPSS软件即可。 3. 若提示错误&#xff0c;显示如下界面&#xff0c;进行下面的方法j 4. 下…...

央企程序员写了重大bug,会造成用户个人信息泄露,领导已经知道了,需要赶紧跑路吗?...

开发过程中出现bug是很正常的事情&#xff0c;小bug无关紧要&#xff0c;可如果是重大bug该怎么办&#xff1f;一位央企程序员就陷入了这样的困境&#xff1a;因为自己没有考虑周全&#xff0c;不小心写了个重大bug&#xff0c;会造成用户个人信息泄露&#xff08;用爬虫可以攻…...

day14—选择题

文章目录1.定义学生、教师和课程的关系模式 S (S#,Sn,Sd,Dc,SA &#xff09;&#xff08;其属性分别为学号、姓名、所在系、所在系的系主任、年龄&#xff09;&#xff1b; C &#xff08; C#,Cn,P# &#xff09;&#xff08;其属性分别为课程号、课程名、先修课&#xff09;&a…...

翻转链表(力扣刷题)

给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1] 示例 3&#xff1a; 输入…...

JavaEE——锁相关

在开发过程中&#xff0c;如果需要开发者自主实现一把锁&#xff0c;就必须了解锁策略和锁的实现原理。 目录 锁策略 乐观锁和悲观锁 互斥锁和读写锁 轻量级锁和重量级锁 自旋锁和挂起等待锁 公平锁和非公平锁 可重入锁和不可重入锁 死锁 发生死锁的必要条件 synchr…...

C语言指针与数组 进阶

本章主要是补充 指针和数组方面的指示&#xff0c;把前面指针的知识补充下。参考前面的C语言基础—指针 C语言指针与数组 进阶用一级指针访问二维数组❗易错点: 不能直接指针变量数组名指向数组的指针1. 指向指针的指针2. 指向一维数组的指针 (*P)[4]—行指针二维数组名指针数组…...

Java连接SqlServer错误

Java连接SqlServer错误 &#x1f3e0;个人主页&#xff1a;shark-Gao &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是shark-Gao&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f389;目前状况&#xff1a;23届毕业生&#xff0c;目…...

Elastic 可观察性 - 适用于当今 “永远在线” 世界的解决方案

作者&#xff1a;Bahubali Shetti 当今世界&#xff0c;我们的生活很大程度上由应用程序控制。 无论是用于商业用途还是个人用途&#xff0c;我们都希望这些应用程序 “始终在线” 并能够立即做出响应。 这些高期望对开发人员和运营人员提出了巨大的要求。 管理这些应用程序需…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...