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

news2025/1/18 6:21:22

目录

序言

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-volume
    image: busybox
    args:
    - sleep
    - "86400"
    volumeMounts:
    - name: mysql-cred
      mountPath: "/projected-volume"
      readOnly: true
  volumes:
  - name: mysql-cred
    projected:
      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-volume
  labels:
    zone: us-est-coast
    cluster: test-cluster1
    rack: rack-22
spec:
  containers:
    - name: client-container
      image: k8s.gcr.io/busybox
      command: ["sh", "-c"]
      args:
      - while true; do
          if [[ -e /etc/podinfo/labels ]]; then
            echo -en '\n\n'; cat /etc/podinfo/labels; fi;
          sleep 5;
        done;
      volumeMounts:
        - name: podinfo
          mountPath: /etc/podinfo
          readOnly: false
  volumes:
    - name: podinfo
      projected:
        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 投票

 

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

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

相关文章

SqlServer实用系统视图,你了解多少?

SqlServer实用系统视图,你了解多少?前言master..spt_valuessysdatabasessysprocesses一套组合拳sysobjectssys.all_objectssyscolumnssystypessyscommentssysindexes结束语前言 在使用任何数据库软件的时候,该软件都会提供一些可能不是那么公…

小规模容器编排使用Docker Swarm不香么,用个锤子的kubernetes

文章目录一、Docker Swarm是什么?二、Swarmkit和Swarm Mode是什么?三、Docker Swarm的核心设计四、Docker Swarm安装部署4.1、初始化Swarm节点14.2、新节点加入Swarm集群4.3、使用swarm部署服务4.4、swarm集群管理一、Docker Swarm是什么? D…

“QT 快速上手指南“ 之 计算器(二)组件,坐标,窗口

文章目录前言一、QT 基本组件用法介绍:1. QLabel :2. QPushButton :3. QLineEdit:二、坐标系统三、窗口部件的大小设置1. setSize( ) 函数:2. resize( )函数:3. setFixedSize( )函数:4. setFixedWidth( ) 和 setFixedHeight( )函数…

标准化归一化方法

一、经典机器学习的归一化算法 分别是0-1标准化(Max-Min Normalization)和Z-Score标准化。 1.1 0-1标准化方法 每一列中的元素减去当前列的最小值,再除以该列的极差。 不过在深度学习领域,我们更希望输入模型的数据是Zero-Ce…

使用Serv-U搭建FTP服务器并公网访问【内网穿透】

文章目录1. 前言2. 本地FTP搭建2.1 Serv-U下载和安装2.2 Serv-U共享网页测试2.3 Cpolar下载和安装3. 本地FTP发布3.1 Cpolar云端设置3.2 Cpolar本地设置4. 公网访问测试5. 结语1. 前言 科技日益发展的今天,移动电子设备似乎成了我们生活的主角,智能手机…

这些IT行业趋势,将改变2023

上一周,你被"AI"刷屏了吗? 打开任何一家科技媒体,人工智能都是不变的热门话题。周初大家还在用ChatGPT写论文、查资料、写代码,到周末的时候大家已经开始用GPT-4图像识别来做饭、Microsoft 365 Copilot 来写PPT了。 GP…

【周末闲谈】AI的旅途

个人主页:【😊个人主页】 系列专栏:【❤️周末闲谈】 系列目录 ✨第一周 二进制VS三进制 ✨第二周 文心一言,模仿还是超越? ✨第二周 畅想AR 文章目录系列目录前言AIAI的开端第一个AI程序AI的寒冬关于AI的思考末尾前言…

憨批的语义分割重制版11——Keras 搭建自己的HRNetV2语义分割平台

憨批的语义分割重制版11——Keras 搭建自己的HRNetV2语义分割平台学习前言什么是HRNetV2模型代码下载HRNetV2实现思路一、预测部分1、主干网络介绍a、Section-1b、Section-2c、Section-3d、Section-42、特征整合部分3、利用特征获得预测结果二、训练部分1、训练文件详解2、LOSS…

【Python童年游戏】满满的回忆杀—那些年玩过的童年游戏你还记得吗?那个才是你的菜?看到第一个我就泪奔了(致我们逝去的青春)

导语 滴一一学生卡🙌 结伴上车的学生仔子们 用笑声打破车厢的沉默 大人眼里的晚高峰 是给放学后快乐😀时光的加时 下车的学生匆匆起身带起 一阵熟悉的栀子香于💓 是关于校园的记忆 开始零零散散地闪现 放学后集合的秘密基地/跟着城…

Half-UNet:用于医学图像分割的简化U-Net架构

Half-UNet简化了编码器和解码器,还使用了Ghost模块(GhostNet)。并重新设计的体系结构,把通道数进行统一。 论文动机 编码器的不同类型的架构图,编码器(A-C)的结构分别来源于U-Net的编码器、解码器和全的Unet结构。 下面是上图的一些结果指标…

4.2学习周报

文章目录前言文献阅读摘要介绍时间序列预测目前存在的问题时间序列预测方法分类未来方向时间序列预测总结前言 本周阅读文献《Forecast Methods for Time Series Data: A Survey》,本文主要对目前时间序列数据建模方法进行分类,主要分为了三类&#xff…

Linux->文件系统磁盘文件管理

目录 1 磁盘结构 2 逻辑抽象管理磁盘 2.1 逻辑抽象 2.2 管理磁盘 2.3 补充知识 3 软硬连接 1 磁盘结构 本篇的学习需要建立在大家在脑海中有一副磁盘的结构才能进行下去,所以我会以图解的方式为大家简单讲解一下,注:博主对这一部分并不是…

深度学习实战——卷积神经网络/CNN实践(LeNet、Resnet)

忆如完整项目/代码详见github:https://github.com/yiru1225(转载标明出处 勿白嫖 star for projects thanks) 系列文章目录 本系列博客重点在深度学习相关实践(有问题欢迎在评论区讨论指出,或直接私信联系我&#xf…

详细介绍别人电脑访问到自己电脑运行的项目

文章目录 让别人远程访问你的代码网站项目或临时演示你的项目给客户的方式详解 引言一、创建一个你想要别人访问的项目二、明确你想要将这个网站或者项目存放的地方 终端分类服务器设备WEB服务器三、部署我们的网页 本地部署流程进入浏览器输入网址访问获取本机的IP地址&#…

多模态特征融合:图像、语音、文本如何转为特征向量并进行分类

多模态特征融合前言输入层,数据集转为特征向量图像语音什么是时域信号,什么是频域信号语音信号转换 - 1.傅立叶变换语音信号转换 - 2.梅尔频率倒谱系数文本词袋模型词嵌入模型输出层,多模态模型合并前言 学习多模态的话题可以从深度学习的分…

API接口安全—webservice、Swagger、WEBpack

API接口安全—webservice、Swagger、WEBpack1. API接口介绍1.1. 常用的API接口类1.1.1. API接口分类1.1.1.1. 类库型API1.1.1.2. 操作系统型API1.1.1.3. 远程应用型API1.1.1.4. WEB应用型API1.1.1.5. 总结1.1.2. API接口类型1.1.2.1. HTTP类接口1.1.2.2. RPC类接口1.1.2.3. web…

NLP与ChatGPT的碰撞:大模型和小模型联合发力

ChatGPT真的太火了!作为NLP的终结者,ChatGPT又会与NLP发生怎么样的碰撞?大模型可以替代小模型吗?NLP又将何去何从?今天给大家推荐一本好书:《基于NLP的内容理解》! 文章目录一、背景二、书籍介绍…

【原创】AIGC之ChatGPT工作原理

AIGC是什么 AIGC - AI Generated Content (AI生成内容),对应我们的过去的主要是 UGC(User Generated Content)和 PGC(Professional user Generated Content)。 AIGC就是说所有输出内容是通过AI机…

2023年3月的10篇论文推荐

三月有很多的重大产品发布,包括刚刚发布的GPT4,还有Meta刚发布就被泄露的LLaMA,midjourney V5,还有ChatGPT的API(非常便宜)等等。 但是本文整理的是本月应该阅读的10篇论文,将包括多模态语言模…

Linux中shell内外命令讲解(下)

♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生! ♥️夕阳下,是最美的绽放&#xff0…