【Kubernetes | Pod 系列】Pod的 YAML 清单文件详解

news2025/7/19 4:58:40

目录

  • 3. Pod的 YAML 清单文件
    • 3.1 获取资源对象 YAML
    • 3.2 解析 YAML 清单文件
      • (1)apiVersion
        • 查看 Kubernetes API 中全部的 API 组
      • (2)kind
        • 查看 Kubernetes 中全部的对象资源类型
      • (3)metadata
      • (4)spec
      • (5)status
    • 3.3 K8S中 YAML 文件语法
      • (1)空格缩进,禁止tab
      • (2)参数名遵循驼峰命名法
      • (3)参数值大小写随意,关键字除外
      • (4)字典与列表的区别
    • 3.3 查看 YAML 清单中参数关键字
      • 以对象 Pod 为例
        • 查看 Pod 对象结构下存在的属性
        • 查看对象 Pod 的 spec 字段下的属性
        • 查看 Pod 的 spec 字段下 containers 参数的属性
    • 参考资料

3. Pod的 YAML 清单文件

3.1 获取资源对象 YAML

在 Kubernetes 中快速获取资源对象的 YAML 清单文件,以 Pod 为例,使用命令

kubectl run pod1 --image=nginx --dry-run=client -o yaml > pod1.yaml

此时,在当前目录下已经创建了一个最简单的 YAML 清单文件,其内容如下所示

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: pod1
  name: pod1
spec:
  containers:
  - image: nginx
    name: pod1
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

3.2 解析 YAML 清单文件

该 YAML 文件定义了一个 Pod 的属性。在K8S中所有的对象资源的 YAML 清单中都包含 五个基本属性:

  • apiVersion:表示对象资源的 API 版本,不同资源的 apiVersion 不一样。
  • kind:表示K8S中的对象资源种类,K8S中有很多对象资源,例如:Pod,Deployment,Service,Namespace等。
  • metadata:记录了对象资源的元数据,元数据字段下也包含多个属性。
  • spec:表示规约,定义对象资源一些属性。
  • ``status`:记录了当前对象资源的状态参数。

(1)apiVersion

apiVersion: v1

apiVersion 顾名思义 API 版本其参数值的默认形式为:GROUP/VERSION,例如:policy.k8s.io/v1

其中 GROUP 表示 API 组,即一组一起公开的资源。其中 核心(core) 也被称为 legacy组, 核心组并不作为 apiVersion 字段的一部分,所以其在 YAML 清单中的表现为: apiVersion: v1

查看 Kubernetes API 中全部的 API 组

  • 查阅 Kubernetes API 参考文档 。
  • 使用 kubelet 工具在 Master 节点中使用命令:kubectl api-versions,关于示例请查阅博文【输出内容详细版】查看Kubernetes集群基本信息(初学者版) 中的【5. 查看可用的 API 版本】

VERSION 表示 API组的迭代版本。不同 API 版本代表着不同稳定性和支持级别。Kubernetes API 组的级别(稳定性)分为3类:

  • Alpha:版本名称包含 alpha(例如:v1alpha1)。
  • Beta:版本名称包含 beta(例如:v2beta3)。
  • Stable:版本名称如 vX,其中 X 为整数。

Alpha 级别是最不稳定的,该级别的 API 默认被禁用且必须在 kube-apiserver 配置中显式启用才能使用。启动Alpha 级别的 API 可能会暴露出 Bug。由于缺陷风险增加和缺乏长期支持,建议该类 API 仅用于短期测试集群。

Beta 级别是相对稳定的,该功能被很好的测试过。启用某个特性被认为是安全的。内置的 Beta API 版本默认被禁用且必须在 kube-apiserver 配置中显式启用才能使用。该类 API 也不建议生产使用。后续发布版本可能会有不兼容的变动。 一旦 Beta API 版本被弃用且不再提供服务, 则使用 Beta API 版本的用户需要转为使用后续的 Beta 或 Stable API 版本。

Stable 级别是稳定版的 API。特性的 Stable 版本会出现在后续很多版本的发布软件中。 Stable API 版本仍然适用于 Kubernetes 主要版本范围内的所有后续发布, 并且 Kubernetes 的主要版本当前没有移除 Stable API 的修订计划。

(2)kind

kind: Pod

Kind 表示 K8S 中对象资源的类型。例如 Pod, ReplicationController, Service, Namespace, Node。在 K8S 中每个 API 组下又划分很多对象资源,为了区分它们的不同,使用 Kind 参数标识每个受支持的资源类型。

查看 Kubernetes 中全部的对象资源类型

使用命令:kubectl api-resources。关于示例请查阅博文【输出内容详细版】查看Kubernetes集群基本信息(初学者版) 中的【4. 查看可用的 API 资源】。

(3)metadata

metadata:					#元数据字段
  creationTimestamp: null	#
  labels:					#标签字段,一个资源对象可以有多个标签,可根据标签来筛选
    run: pod1				#标签1
  name: pod1				#定义Pod名称
  namespace: default		#定义pod(资源对象)所在的命名空间。默认为当前命名空间。

关于资源的元数据,例如它的名称、类型、api 版本、注释和标签。这包含可能由最终用户和系统更新的字段(例如注释)。

K8S中的每个对象种类都必须有一个名为 metadata(元数据)的嵌套字段来保存该对象资源的,并且必须包含以下元数据(必选):

  • namespace(名字空间):名字空间是一个与DNS兼容的标签,对象资源被细分到其中。默认的命名空间是 “default”。
  • name(名称):对象资源名称,在当前的命名空间中唯一的标识这个对象资源。这个值在检索单个对象时用于检索路径上。
  • uid:一个在时间和空间上唯一的值(通常是RFC 4122生成的标识符),用于区分被删除和重新创建的具有相同名称的对象。

每个对象资源又可以包含以下元数据(可选):

resourceVersion:用于识别对象的内部版本,用于记录该资源对象何时被更新过。

generation:表示所需状态的特定生成的序列号。由系统设置,每个资源单调递增。可以进行比较,比如RAW和WAW的一致性。之后博文会以例子解释

creationTimestamp:用于记录对象被创建的日期和时间,详见 RFC 3339

deletionTimestamp:该日期和时间之后,对象资源将被删除。这个字段由服务器在用户请求优雅删除时设置,而不是由客户端直接设置。之后博文会以例子解释

labels:其值是键值对,用于区分组织和分类对象。通俗点说是给对象资源打标签,可用于筛选。

annotations:其值也是键值对,对象设置了该字段后可被外部工具用来存储和检索关于此对象的任意元数据。之后博文会以例子解释

(4)spec

spec:
  containers:
  - image: nginx
    name: pod1
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always

spec 规范是由用户自定义,描述了对象资源创建后的期望状态。spec 规范是对期望状态的完整描述,包括由用户提供的配置设置、由系统扩展的默认值,以及由其他生态系统组件(如调度器、自动缩放器)创建后初始化或以其他方式改变的属性,并与 API 对象一起被持久化在稳定存储中。如果spec 规范被删除,该对象将被从 K8S 中清除。

此字段在创建或更新对象时填写。

spec 定义Pod一些属性信息,包括container(容器),DNS策略(dnspolicy),重启策略(restartpolicy)。

用户被授予对 spec 的完全写权限。而相关的控制器被授予对 spec 的只读权限。

(5)status

status: {}

由服务器填写的,报告了系统的当前状态。在大多数情况下,用户不需要更改它。我们在 spec 中填入了对象资源创建后的期望状态,status 则是对象资源实际被创建后的状态。如果 spec 中的值与 status 中的值一致,说明该对象资源正常运行,状态良好。如果不一致,说明该对象资源是有问题的。

用户被授予对 status 的只读权限。而相关的控制器被授予对 status 的完全写权限。

示例中的 status 为一个空字典是正常现象,因为此时 Pod 对象还未创建,所以 status 为空。

3.3 K8S中 YAML 文件语法

关于 YAML 的语法,需要记住以下几点

  • 大小写敏感。
  • 通过缩进表示层级关系。
  • 对于缩进敏感,不支持tab缩进,只支持空格键。(缩进的空格数目不重要,相同层级左对齐即可)
  • 使用 # 表示注释。
  • 可与json格式转换,支持字典数据类型与列表数据类型。

(1)空格缩进,禁止tab

YAML 文件对缩进的要求很严格,禁止使用tab代替缩进,要使用空格缩进。

缩进的空格数目不重要,只需要相同层级左对齐即可。为了保持 YAML 清单的赏心悦目,一般默认每个缩进为两个空格。

metadata:
  creationTimestamp: null
  labels:
    run: pod1
  name: pod1

(2)参数名遵循驼峰命名法

K8S 对象清单中每个参数名首字母小写,后面的每个单词的首字母都要大写

apiVersion: v1

(3)参数值大小写随意,关键字除外

K8S 对象清单中的参数值在一般情况下可以随意大小写,但如果该参数值是关键字则必须首字母大写。

关键字的意思是:有些参数值是固定的,可能一个参数的值只有三个关键字可选。这三个关键字是被写死的。

spec:
  containers:
  ...
    name: pod2
    ...
  dnsPolicy: ClusterFirst
  restartPolicy: Always

(4)字典与列表的区别

在 YAML 清单中,一般状态下的格式是字典类型,而如同:- image 属于列表。

spec:
  containers:		    #container字段,定义容器属性
  - image: nginx	    #定义容器使用的镜像
    name: vmware-nginx  #定义容器名称
    resources: {}	    #定义容器的计算资源约束,例如最多能消耗多少cpu或内存
  - image: tomcat 	    #定义第二个容器
    name: vmware-tmcat  #容器名称不能重复
    resources: {}

上述示例可表示为

{'spec': {'containers': [{'image': 'nginx','name': 'vmware-nginx','resources': {},},
                         {'image': 'tomcat','name': 'vmware-tmcat','resources': {},}
                        ],
         }
}

- image: nginximage 参数左对齐平级的参数都在同一个列表下,直至遇到下一个 - xxx 参数。

  • 最外层是字典A:{'spec': {字典B}},即 spec 参数的值为一个字典。
  • 字典B:{'containers': [列表A]},即 containers 参数值为一个列表。
  • 列表A:[{字典C}, {字典D}],即列表A中两个元素是两个字典。
  • 字典C定义了容器vmware-nginx。字典D定义了容器vmware-tmcat 。

我们可以简单将 YAML 文件理解为字典与列表的嵌套集合,字典中嵌套列表,列表中嵌套字典,两者相互嵌套。

请大家务必搞清 K8S 对象 YAML 文件的各项参数与其值的嵌套关系,在后续进阶博客中,我们会使用编程语言的客户端来对 K8S 对象的增删改查进行细微操控。
其中的难点是对 YAML 文件中字典与列表嵌套关系的理解。

3.3 查看 YAML 清单中参数关键字

除了使用K8S官方文档中给出的 YAML 对象清单之外,我们还可以借助 kubectl 工具提供 查询K8S 对象结构(YAML 清单)。使用命令

kubectl explain object_name

以对象 Pod 为例

查看 Pod 对象结构下存在的属性

kubectl explain pod #或者kubectl explain pods

如下图所示:

  • 红框位置表示字段名
  • 黄框位置表示该字段值的数据类型
  • 篮筐位置表示该字段的含义,以及涉及到的K8S文档

在这里插入图片描述

查看对象 Pod 的 spec 字段下的属性

查看某一对象或字段下的属性,使用英文符号的句号 . 连接。

Pod 的 spec 字段下有很多属性。

kubectl explain pod.spec

在这里插入图片描述

查看 Pod 的 spec 字段下 containers 参数的属性

kubectl explain pod.spec.containers

在这里插入图片描述

其它的资源对象的参数关键字仿照例子查询即可。

参考资料

  • Kubernetes Documentation:https://kubernetes.io/docs/home/
  • Kubernetes Github:https://github.com/kubernetes/kubernetes

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

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

相关文章

SpringBoot整合Mybatis方式2:使用注解方式整合Mybatis

SpringBoot整合Mybatis简介SpringBoot整合Mybatis方式2:使用注解方式整合Mybatis1.先用idea创建一个添加mybatis需要的相关依赖的工程。2.准备数据库和表3.创建表映射类4.创建mapper代理接口5.创建Service层和Service的实现层6.创建控制层(也就是web层&a…

JQuery使用

简介 一个JavaScript的框架,简化了JS的语法和操作,定义了HTML属性操作、样式操作、DOM 操作等相关函数,实现了对ajax异步请求封装。提供了很多预定义函数的JS文件。 作用 简化部分JavaScript开发 使用步骤 1,引入Jquery 下载 地址1:http:/…

D-0015 红外接收硬件电路设计

红外接收硬件电路设计1 简介2 硬件电路实战3 红外遥控的原理4 主要参数5 电路设计要点1 简介 肉眼可见的光,按照波长进行排列依次为:红、成、黄、绿、青、蓝、紫。其中红光的波长范围为0.620.76μm;紫光的波长范围为0.380.46μm。比紫光波长…

[iOS]代码混淆

混淆有几点注意: 不能混淆系统方法 不能混淆init开头的等初始化方法 混淆属性时需要额外注意set方法 如果xib、 storyboard中用到了混淆的内容,需要手动修正。 可以考虑把需要混淆的符号都加上前缀,跟系统自带的符号进行区分。 混淆有风险&am…

MMEdu离线版的使用:实现石头剪刀布图像分类的检测

一、MMEdu离线版的使用 1.双击XEdu v1.0.exe解压缩到某个盘,会是一个文件夹XEdu 2.进入XEdu,双击运行“点我初始化.bat”,等待至运行结束命令提示符窗口自动关闭 3.双击运行“jupyter编辑器.bat”,将会打开一个网页版jupyter&…

记一次由于google新版本限制升级导致的跨域问题

记一次跨域问题 问题描述 系统集成到公司下面的门户网站,由于二级域名还没有申请下来只能先配置了我们的K8S域名 http://wire-qa.motortest.com/#/Data/systemNavigationK8s域名 http://wire-test.k8s-pv.motor.com/sce_web/index.html前端识别到跳转的如下地址后…

微服务介绍2

1 搭建项目 1.1 父项目的搭建 1.2 子项目的搭建 2 项目展示 1 搭建项目 1.1 父项目的搭建 步骤: 1 选择maven项目作为父项目,修改为1.8之后直接点击next 2 定义父项目的名称,修改Artifct Coordinates ---> GroupId 然后点击finsh就可以啦…

K8S部署后的使用:dashboard启动、使用+docker镜像拉取、容器部署

1、重置和清除旧工程:每个节点主机都要运行 kubeadm reset iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X 2、部署新的k8s项目: 只在主节点运行,apiserver-advertise-address填写主…

(附源码)计算机毕业设计JavaJava毕设项目美容院管理系统

项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: Springboot mybatis Maven Vue 等等组成,B/…

HDC 2022 开发者主题演讲与技术分论坛干货分享(附课件)

11月4日-11月6日,HDC 2022在东莞成功举办,这是一场大规模落地的思维与技术的碰撞,众多业内专家到场,共话未来。其中,开发者主题演讲围绕增强的声明式开发体系,通过一个Demo实例讲解技术创新点,助…

LEADTOOLS 入门教程: 使用文件观察器转换文件 - C# .NET Core

LEADTOOLS 是一个综合工具包的集合,用于将识别、文档、医疗、成像和多媒体技术整合到桌面、服务器、平板电脑、网络和移动解决方案中,是一项企业级文档自动化解决方案,有捕捉,OCR,OMR,表单识别和处理&#…

PyQt5 QTableWidget

PyQt5 QTableWidgetQTableWidget 示例1QTableWidget 示例2QTableWidget 示例3QTableWidget 示例4QTableWidget 示例5QTableWidget 示例6QTableWidget 示例1 演示QTableWidget控件的基本使用方法 import sys from PyQt5.QtWidgets import (QWidget, QTableWidget, QTableWidge…

The Seven Tools of Causal Inference with Reflections on Machine Learning 文章解读

目录 THE THREE LAYER CAUSAL HIERARCHY. 4 THE SEVEN TOOLS OF CAUSAL INFERENCE (OR WHAT YOU CAN DO WITH A CAUSAL MODEL THAT YOU COULD NOT DO WITHOUT?) 7 Tool 1: Encoding Causal Assumptions – Transparency and Testability. 10 Tool 2: Do-calculus and the …

CentOS 7:dmPython安装及测试连接达梦数据库

python下载地址:Python Source Releases | Python.org 查看数据库服务 dmPython 安装 cd /home/dmdba/dmdbms/drivers/python/dmPython python setup.py install [rootlocalhost dmPython]# python setup.py install running install running bdist_egg running e…

通过Python Pandas分析数据上涨下跌趋势的方法:求离散数据的差分、导数

在实际工作中,我们经常需要分析一组数据的历史走势/趋势情况,比如要从产品数据库中筛选出销量处于上升趋势的产品,或者从股票历史数据库中筛选出一直处于上涨的股票。 那么可以通过分析计算该组数据的差分来模拟求出该组数据走势线的导数&…

Kubernetes CKA 模拟题解析【2022最新版】(连载001)

练习准备 这是 Kubernetes CKA 认证的模拟考试,大家不要错过哦。 在模拟考试开始之前建议您先设置一下以下命令: $ alias kkubectl $ export do"--dry-runclient -o yaml" # like short for dry output. use whatever you like 设置代码补…

Lumion和Enscape渲染器有什么区别?哪个适合你

提到“傻瓜式渲染器”,你的脑子里最先闪过哪个软件名?当一溜子软件名在脑袋里飞快跳转的时候,有没有发现现在很多软件都被打上“傻瓜式渲染器”的标签?那今天咱们就先聊一聊Lumion和Enscape这两个知名软件。 01、软件介绍 Lumio…

DOTA-PEG-麦芽糖 maltose-DOTA 麦芽糖-四氮杂环十二烷四乙酸

DOTA-PEG-麦芽糖 maltose-DOTA 麦芽糖-四氮杂环十二烷四乙酸 PEG接枝修饰麦芽糖,麦芽糖-聚乙二醇-四氮杂环十二烷四乙酸,DOTA-PEG-麦芽糖 中文名称:麦芽糖-四氮杂环十二烷四乙酸 英文名称:maltose-DOTA 别称:DOTA修…

浏览器渲染原理-通俗易懂版本

文章目录浏览器渲染原理前言1. 网页的解析过程2. 浏览器的功能与组成2.1 浏览器内核2.2 进程与线程3. 浏览器渲染流程3.1 渲染引擎解析过程3.2 渲染引擎主要模块4. 渲染页面的详细流程4.1 HTML 解析过程4.2 生成 CSS 规则4.3 构建 Render Tree4.4 布局 (layout) 和绘制 (Paint)…

外观专利怎么申请?

问题一:什么是外观专利? 外观专利跟实用新型专利和发明专利有所不同。实用新型和发明主要保护的技术方案或者方法,配方。而外观专利保护的产品的形状、图案或其结合以及色彩富有美感,并且适用于工业应用的新设计。比如某企业推出…