你可以通过在一个目录中存储多个对象配置文件、并使用 来递归地创建和更新对象来创建、更新和删除 Kubernetes 对象。 这种方法会保留对现有对象已作出的修改,而不会将这些更改写回到对象配置文件中。 也会给你呈现 将作出的变更的预览。
安装 。
你必须拥有一个 Kubernetes 的集群,且必须配置 kubectl 命令行工具让其与你的集群通信。 建议运行本教程的集群至少有两个节点,且这两个节点不能作为控制平面主机。 如果你还没有集群,你可以通过 Minikube 构建一个你自己的集群,或者你可以使用下面的 Kubernetes 练习环境之一:
- Killercoda
- 玩转 Kubernetes
工具能够支持三种对象管理方式:
- 指令式命令
- 指令式对象配置
- 声明式对象配置
关于每种对象管理的优缺点的讨论,可参见 Kubernetes 对象管理。
声明式对象管理需要用户对 Kubernetes 对象定义和配置有比较深刻的理解。 如果你还没有这方面的知识储备,请先阅读下面的文档:
- 使用指令式命令管理 Kubernetes 对象
- 使用配置文件对 Kubernetes 对象进行指令式管理
以下是本文档中使用的术语的定义:
- 对象配置文件/配置文件:一个定义 Kubernetes 对象的配置的文件。 本主题展示如何将配置文件传递给 。 配置文件通常存储于类似 Git 这种源码控制系统中。
- 现时对象配置/现时配置:由 Kubernetes 集群所观测到的对象的现时配置值。 这些配置保存在 Kubernetes 集群存储(通常是 etcd)中。
- 声明式配置写者/声明式写者:负责更新现时对象的人或者软件组件。 本主题中的声明式写者负责改变对象配置文件并执行 命令以写入变更。
使用 来创建指定目录中配置文件所定义的所有对象,除非对应对象已经存在:
此操作会在每个对象上设置 注解。注解值中包含了用来创建对象的配置文件的内容。
下面是一个对象配置文件示例:
执行 可以打印出将被创建的对象:
使用 来创建对象:
使用 打印其现时配置:
输出显示注解 被写入到现时配置中,并且其内容与配置文件相同:
你也可以使用 来更新某个目录中定义的所有对象,即使那些对象已经存在。 这一操作会隐含以下行为:
- 在现时配置中设置配置文件中出现的字段;
- 在现时配置中清除配置文件中已删除的字段。
下面是一个配置文件示例:
使用 来创建对象:
使用 打印现时配置:
输出显示,注解 被写入到现时配置中,并且其取值与配置文件内容相同。
通过 命令直接更新现时配置中的 字段。 这一命令没有使用 :
使用 来打印现时配置:
输出显示, 字段已经被设置为 2,而 注解中并不包含 字段。
现在更新 配置文件,将镜像文件从 更改为 ,同时删除 字段:
应用对配置文件所作更改:
使用 打印现时配置:
输出显示现时配置中发生了以下更改:
- 字段 保留了 命令所设置的值:2; 之所以该字段被保留是因为配置文件中并没有设置 。
- 字段 的内容已经从 更改为 。
- 注解 内容被更改为新的镜像名称。
- 字段 被移除。
- 注解 中不再包含 字段。
有两种方法来删除 管理的对象。
使用指令式命令来手动删除对象是建议的方法,因为这种方法更为明确地给出了要删除的内容是什么, 且不容易造成用户不小心删除了其他对象的情况。
作为 操作的替代方式,你可以在本地文件系统的目录中的清单文件被删除之后, 使用 来辩识要删除的对象。
在 Kubernetes 1.31 中, 可使用两种剪裁模式:
- 基于 Allowlist 的剪裁:这种模式自 kubectl v1.5 版本开始就存在, 但由于其设计存在易用性、正确性和性能问题,因此仍处于 Alpha 阶段。 基于 ApplySet 的模式设计用于取代这种模式。
- 基于 ApplySet 的剪裁:apply set 是一个服务器端对象(默认是一个 Secret), kubectl 可以使用它来在 apply 操作中准确高效地跟踪集合成员。 这种模式在 kubectl v1.27 中以 Alpha 引入,作为基于 Allowlist 剪裁的替代方案。
你可以使用 并指定 选项来查看现时对象的配置:
更新对象的现时配置,它是通过向 API 服务器发送一个 patch 请求来执行更新动作的。所提交的补丁中定义了对现时对象配置中特定字段的更新。 命令会使用当前的配置文件、现时配置以及现时配置中保存的 注解内容来计算补丁更新内容。
命令将配置文件的内容写入到 注解中。 这些内容用来识别配置文件中已经移除的、因而也需要从现时配置中删除的字段。 用来计算要删除或设置哪些字段的步骤如下:
- 计算要删除的字段,即在 中存在但在配置文件中不再存在的字段。
- 计算要添加或设置的字段,即在配置文件中存在但其取值与现时配置不同的字段。
下面是一个例子。假定此文件是某 Deployment 对象的配置文件:
同时假定同一 Deployment 对象的现时配置如下:
下面是 将执行的合并计算:
- 通过读取 并将其与配置文件中的值相比较, 计算要删除的字段。 对于本地对象配置文件中显式设置为空的字段,清除其在现时配置中的设置, 无论这些字段是否出现在 中。 在此例中, 出现在 注解中, 但并不存在于配置文件中。 动作: 从现时配置中删除 字段。
- 通过读取配置文件中的值并将其与现时配置相比较,计算要设置的字段。 在这个例子中,配置文件中的 值与现时配置中的 不匹配。 动作:设置现时配置中的 值。
- 设置 注解的内容,使之与配置文件匹配。
- 将第 1、2、3 步骤得出的结果合并,构成向 API 服务器发送的补丁请求内容。
下面是此合并操作之后形成的现时配置:
配置文件中的特定字段与现时配置合并时,合并方式取决于字段类型。 字段类型有几种:
- 基本类型:字段类型为 、 或 之一。 例如: 和 字段都是基本类型字段。
动作: 替换。
- map:也称作 object。类型为 或包含子域的复杂结构。例如,、 、 和 都是 map。
动作: 合并元素或子字段。
- list:包含元素列表的字段,其中每个元素可以是基本类型或 map。 例如,、 和 都是 list。
动作: 不一定。
当 更新某个 map 或 list 字段时,它通常不会替换整个字段, 而是会更新其中的各个子元素。例如,当合并 Deployment 的 时, 并不会将其整个替换掉。相反,实际操作会是对 这类 的子字段来执行比较和更新。
基本类型字段会被替换或清除。
用来表示映射的字段在合并时会逐个子字段或元素地比较:
对 list 类型字段的变更合并会使用以下三种策略之一:
- 如果 list 所有元素都是基本类型则替换整个 list。
- 如果 list 中元素是复合结构则逐个元素执行合并操作。
- 合并基本类型元素构成的 list。
策略的选择是基于各个字段做出的。
如果 list 中元素都是基本类型则替换整个 list
将整个 list 视为一个基本类型字段。或者整个替换或者整个删除。 此操作会保持 list 中元素顺序不变
示例: 使用 来更新 Pod 中 Container 的 字段。 此操作会将现时配置中的 值设为配置文件中的值。 所有之前添加到现时配置中的 元素都会丢失。 配置文件中的 元素的顺序在被添加到现时配置中时保持不变。
解释: 合并操作将配置文件中的值当做新的 list 值。
如果 list 中元素为复合类型则逐个执行合并
此操作将 list 视为 map,并将每个元素中的特定字段当做其主键。 逐个元素地执行添加、删除或更新操作。结果顺序无法得到保证。
此合并策略会使用每个字段上的一个名为 的特殊标签。 Kubernetes 源代码中为每个字段定义了 : types.go。 当合并由 map 组成的 list 时,给定元素中被设置为 的字段会被当做该元素的 map 键值来使用。
例如: 使用 来更新 Pod 规约中的 字段。 此操作会将 列表视作一个映射来执行合并,每个元素的主键为 。
解释:
- 名为 "nginx-helper-a" 的容器被删除,因为配置文件中不存在同名的容器。
- 名为 "nginx-helper-b" 的容器的现时配置中的 被保留。 能够辩识出现时配置中的容器 "nginx-helper-b" 与配置文件 中的容器 "nginx-helper-b" 相同,即使它们的字段值有些不同(配置文件中未给定 值)。这是因为 字段(name)的值在两个版本中都一样。
- 名为 "nginx-helper-c" 的容器是新增的,因为在配置文件中的这个容器尚不存在于现时配置中。
- 名为 "nginx-helper-d" 的容器被保留下来,因为在 last-applied-configuration 中没有与之同名的元素。
合并基本类型元素 list
在 Kubernetes 1.5 中,尚不支持对由基本类型元素构成的 list 进行合并。
API 服务器会在对象创建时其中某些字段未设置的情况下在现时配置中为其设置默认值。
下面是一个 Deployment 的配置文件。文件未设置 :
使用 创建对象:
使用 打印现时配置:
输出显示 API 在现时配置中为某些字段设置了默认值。 这些字段在配置文件中并未设置。
在补丁请求中,已经设置了默认值的字段不会被重新设回其默认值, 除非在补丁请求中显式地要求清除。对于默认值取决于其他字段的某些字段而言, 这可能会引发一些意想不到的行为。当所依赖的其他字段后来发生改变时, 基于它们所设置的默认值只能在显式执行清除操作时才会被更新。
为此,建议在配置文件中为服务器设置默认值的字段显式提供定义, 即使所给的定义与服务器端默认值设定相同。 这样可以使得辩识无法被服务器重新基于默认值来设置的冲突字段变得容易。
示例:
解释:
- 用户创建 Deployment,未设置 。
- 服务器为 设置默认值 ,并为 设置默认值。
- 用户改变 为 。字段 仍会取其默认设置值,尽管服务器期望该字段被清除。 如果 值最初于配置文件中定义, 则它们需要被清除这一点就更明确一些。
- 操作失败,因为 未被清除。 在 为 不可被设定。
建议:以下字段应该在对象配置文件中显式定义:
- 如 Deployment、StatefulSet、Job、DaemonSet、ReplicaSet 和 ReplicationController 这类负载的选择算符和 标签
- Deployment 的上线策略
没有出现在配置文件中的字段可以通过将其值设置为 并应用配置文件来清除。 对于由服务器按默认值设置的字段,清除操作会触发重新为字段设置新的默认值。
更改某个对象字段时,应该采用下面的方法:
- 使用 .
- 直接写入到现时配置,但不更改配置文件本身,例如使用 。
将字段添加到配置文件。针对该字段,不再直接执行对现时配置的修改。 修改均通过 来执行。
在 Kubernetes 1.5 中,将字段的属主从配置文件切换到某指令式写者需要手动执行以下步骤:
- 从配置文件中删除该字段;
- 将字段从现时对象的 注解中删除。
Kubernetes 对象在同一时刻应该只用一种方法来管理。 从一种方法切换到另一种方法是可能的,但这一切换是一个手动过程。
从指令式命令管理切换到声明式对象配置管理的切换包含以下几个手动步骤:
- 将现时对象导出到本地配置文件:
- 手动移除配置文件中的 字段。
- 设置对象上的 注解:
- 更改过程,使用 专门管理对象。
- 在对象上设置 注解:
- 自此排他性地使用 来管理对象。
建议的方法是定义一个不可变更的 PodTemplate 标签, 仅用于控制器选择算符且不包含其他语义性的含义。
示例:
- 使用指令式命令管理 Kubernetes 对象
- 使用配置文件对 Kubernetes 对象执行指令式管理
- Kubectl 命令参考
- Kubernetes API 参考
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/do-docker-k8s/45289.html