- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
本文继续整理下 K8s 的一些基础概念,作为前一篇概念汇总的补充.
前一篇博文链接:https://www.cnblogs.com/hnzhengfy/p/k8s_concept.html.
Label 在 k8s 中是一个非常核心的概念,我们可以将 Label 指定到对应的资源对象中,例如 Node、Pod、Replica Set、Service 等,在配置文件中一般为 labels.
一个资源可以绑定任意个 Label,k8s 通过 Label 可实现多维度的资源分组管理,后续可通过 Label Selector 查询和筛选拥有某些 Label 的资源对象.
例如创建一个 Pod,给定一个 Label,workerid=123,后续可通过 workerid=123 删除拥有该标签的 Pod 资源.
参考:https://www.cnblogs.com/objcoding/p/13567281.html 。
DaemonSet 是 k8s 中的一种控制器,用于管理 Pod 的部署,确保每个节点上都有一个 Pod 在运行.
DaemonSet 控制器会监视集群中的节点状态,一旦有新的节点加入集群,或者节点状态发生变化(如节点重新启动),控制器就会触发相应操作.
DaemonSet 常用于运行一些系统级别的服务或者监控应用程序,使集群中的服务更加健壮和可靠。例如:
日志收集器:在每个节点上运行日志收集器(如 Fluentd 或 Filebeat),收集所有节点的日志数据,并将其发送到中心日志服务器进行存储和分析。 监控代理:在每个节点上运行监控代理(如 Prometheus Node Exporter 或 cAdvisor),收集所有节点的运行状态数据,并将其发送到中心监控服务器进行分析和展示。 网络代理:在每个节点上运行网络代理(如 kube-proxy 或 Istio Sidecar),负责节点之间的网络通信和流量管理。 安全代理:在每个节点上运行安全代理(如 Sysdig Falco 或 Aqua Security),检测所有节点的安全事件,并及时报警或进行防御 。
一个 Pod 被调度之后,就要进行初始化。初始化肯定是得有一个反馈的,否则都不知道最终有没有启动成功。这些健康检查的功能,叫做探针(Probe).
常见的有 livenessProbe、readinessProbe、startupProbe 等三种探针.
LivenessProbe 用于检测容器是否仍然处于运行状态。如果探测失败,k8s 将根据 Pod 的重启策略决定是否重新启动该容器.
适用于需要监控容器内主进程或服务是否正常运行的情况.
例如,当宿主机故障或资源不足导致容器停止工作时,可以通过 LivenessProbe 来检测并采取相应的恢复措施.
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 60
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 5
在这个示例中,kubelet 会每 10 秒发送一次 HTTP GET 请求到/health路径,如果连续失败 5 次,则认为容器不健康,并根据重启策略进行处理.
ReadinessProbe 用于检测容器是否已经准备好接收流量。如果探测失败,k8s 会将该 Pod 从 Service 的 Endpoints 列表中移除,直到它再次通过探测为止.
适用于需要在容器启动或重启后,等待其完全准备就绪,再开始接收流量的场景.
例如,在滚动更新过程中,新版本的容器需要通过 ReadinessProbe 验证后才能开始处理请求.
readinessProbe:
exec:
command: ["cat", "/tmp/ready"]
initialDelaySeconds: 5
periodSeconds: 10
successThreshold: 1
failureThreshold: 3
在这个示例中,kubelet 会每 10 秒执行一次cat /tmp/ready命令,如果连续失败 3 次,则认为容器未就绪.
StartupProbe 用于判断容器内的应用程序,是否已经成功启动并完成初始化任务。它在容器启动初期生效,先于 LivenessProbe 和 ReadinessProbe.
适用于启动时间较长或启动过程中有复杂初始化序列的应用程序。StartupProbe 可以防止在这些应用程序还未完全启动时就被误判为不健康或就绪.
startupProbe:
httpGet:
path: /startup
port: 8080
initialDelaySeconds: 10
periodSeconds: 15
successThreshold: 1
failureThreshold: 3
在这个示例中,kubelet 会在容器启动后等待 10 秒,然后每 15 秒发送一次 HTTP GET 请求到 /startup 路径,如果连续失败 3 次,则认为启动失败.
一般,花费 120s startupProbe 的启动实践,每隔 5s 检测一下 livenessProbe,每隔 10s 检测一下 readinessProbe,是常用的操作,一般都是在 yml 配置文件中进行详细配置.
参考:https://zhuanlan.zhihu.com/p/379270517 。
钩子(Hook),主要有 PostStart 和 PreStop 两种.
PostStart 在容器启动后立即触发执行,用于完成启动后的初始化操作,例如加载配置、启动辅助进程。它与主进程无直接依赖关系,不会阻塞主进程启动.
lifecycle:
postStart:
exec:
command: ["sh", "-c", "echo 'Container started'"]
PreStop 在容器收到终止信号(如 kubectl delete pod 或 kubectl scale)时触发执行,用于执行停止前的清理工作,例如保存状态、关闭连接、释放资源.
preStop:
exec:
command: ["sh", "-c", "echo 'Container stopping'; sleep 5"]
钩子是Kubernetes中一种强大的机制,能够在容器生命周期的特定阶段执行自定义操作。通过合理利用钩子,可以在容器启动后或停止前完成必要的初始化和清理工作,从而提高应用的可靠性和自动化水平.
其实 Hook 就是一些 shell 脚本,需要在指定的事件点执行,因为比较常用就升级到关键字级别了.
StatefulSet 是 k8s 中用于管理有状态应用的控制器,它提供了稳定的网络标识符、持久化存储以及有序部署和扩展等功能.
它与 deployment 类似,唯一的区别是 deployment 创建一组任意名称的 pod,并且 pod 的顺序对它来说并不重要.
而 StatefulSet 为每个 Pod 维护了一个有粘性的 ID,这些 Pod 是基于相同的规约创建的,但不可相互替换,且每个 Pod 都有一个永久不变的 ID.
如果要为 example 的 pod 创建 3 个副本,那么 StatefulSet 将会创建为:example-0、example-1、example-2。因此,这一创建方式最重要的好处就是你可以通过 pod 的名称就了解大致的情况.
两个核心组件:
主要特性:
StatefulSet 通过提供稳定的网络标识符、持久化存储以及有序部署和扩展等功能,为 k8s 中的有状态应用提供了强大的支持.
然而,在使用 StatefulSet 时也需要注意一些事项,如删除 StatefulSet 并不会自动删除其关联的 PVCs 和 PVs 等存储资源。因此,在删除 StatefulSet 前需要明确是否也需要删除这些存储资源并确保应用数据已经妥善备份或具备迁移数据的能力.
参考:https://www.infoq.cn/article/LwQsple5bRO5Vu9966w6 。
ConfigMap 是 k8s 中一种用于配置管理的 API 资源对象,它允许用户将配置信息与容器镜像解耦,从而使得应用程序的配置更加灵活和可移植。用于存储非密钥/值数据,如配置文件、环境变量和命令行参数等.
通过合理地使用ConfigMap,可以提高应用程序的可移植性和可维护性,同时确保配置的安全性和一致性.
ConfigMap 的主要特点是,可以将应用程序的配置信息以键值对的形式保存,并且这些配置信息可以独立于应用程序代码进行管理和更新.
四种创建方式:
主要的作用:
使用方式:
Secrets 是 k8s 中的一种资源类型,专门用于存储和管理敏感信息。这些信息通常包括密码、OAuth 令牌以及 SSH 密钥等,它们被 Base64 编码后存储在 k8s 集群中.
通过使用 Secrets,可以避免将这些敏感信息硬编码在应用程序代码或 Docker 镜像中,从而提高了安全性和灵活性,同时也可确保配置的灵活性和可移植性.
三种创建方式:
主要的四种类型:
使用方式:
Secrets 的安全性控制,数据以 Base64 编码格式存储,减少了直接暴露敏感信息的风险。同时也结合 k8s 的 RBAC(基于角色的访问控制)策略,可以限制 Secrets 的访问权限,确保只有授权的用户或服务才能访问.
最后此篇关于关于K8s的一些基础概念整理-补充【k8s系列之五】的文章就讲到这里了,如果你想了解更多关于关于K8s的一些基础概念整理-补充【k8s系列之五】的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 10年前关闭。 Improve this qu
我正在开发一个 Android 应用程序。在此应用程序中, Logo 栏显示在所有页面( Activity )上,或者我们可以说它在所有页面上都有标题。这个 Logo 栏有几个图标,如主页、登录、通知
我正在使用 hadoop 使用开源接口(interface) HVPI 处理视频。然而,inputsplit 的实现,更准确地说是在 isSplitableobContext (context, Pa
1. 是什么? MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System
有没有办法使用 c++20s 的概念来检查一个值是否满足某些要求? 假设我正在编写某种使用分页的容器,并且我想让页面大小成为模板参数。 template class container; 我可以使用带
如何在 ArrayList 中循环遍历 ArrayList? 例如,如果我有一个名为 Plants of Plant 对象的 ArrayList。每个 Plant 对象内部都有一个随机数量的花名。我如
如何在UML类图中绘制C++概念? 具体来说,我有以下代码: template concept Printable = requires(T a, std::ostream &where) {
我有兴趣制作一个网站,在访问者访问时闪现整个网络历史记录。我计划使用 JavaScript 来获取每个观看者计算机上的历史记录,并根据他们拥有的内容以不同的速度对其进行动画处理。我的想法是使用 his
有一个模板定义,例如: template void foo( void ) { /* ... */ } 如何定义一个概念,以便N必须为非零正值(N> = 1)? 就像是: template con
封装是信息隐藏还是导致信息隐藏? 正如我们所说,封装将数据和函数绑定(bind)在单个实体中,因此它为我们提供了对数据流的控制,并且我们只能通过一些定义良好的函数来访问实体的数据。因此,当我们说封装导
下面有一个简单的代码片段,它使用以下方式进行编译: g++-9 -std=c++2a -fconcepts 这是试图定义一个需要存在函数的概念。我希望输出是"is",但事实并非如此……知道为什么吗?谢
我有一个普通二元运算符的概念 template concept is_binary_operation = requires (const T& t1, const T& t2) // e.g
我正在c++ 20中实现具有启发式功能的搜索算法。 我试图用类似这样的概念来约束我的算法可以使用的功能: template concept Heuristic = requires(SelfType
我需要了解 SAS 如何读取/执行数据步骤。当我查找有关 SAS 如何读取数据步骤的信息时,我似乎只找到有关它如何读取以进行合并的信息,我不了解与常规数据步骤相关的信息。比方说,我有这行代码: dat
最近我看到一个关于“框架”的问题,如果“框架”有不同的类型或概念。那么,存在不同“类型”的“框架”吗? 例如:NodeJS 是一种“类型”(概念),而 Hibernate ORM 是另一种“类型”(概
如何使用任何技术禁用或清除客户端浏览器 Cookie 我认为使用 javascript 可以用于任何技术 最佳答案 var cookies = document.cookie.split(";");
我正在使用 target = "_blank" 单击链接时生成新选项卡。但是,浏览器会将焦点移至该选项卡。 有没有办法让焦点保持在当前标签页上? 回答摘要 基本上,只需发送一个模拟控件点击的当前事件。
我正在尝试在我的 android/firebase(cloud firestore) 应用程序上添加一项需要其他用户批准/拒绝的功能。例如,当 Air&BnB 上的用户想要预订一个地方时,所有者必须批
这个问题在这里已经有了答案: mysql_fetch_array()/mysql_fetch_assoc()/mysql_fetch_row()/mysql_num_rows etc... expec
public class MyClass { public static void main(String[] args) { System.out.println("Hell
我是一名优秀的程序员,十分优秀!