关于 K8s 的一些基础概念整理-补充【k8s系列之五】
〇、前言
本文继续整理下 K8s 的一些基础概念,作为前一篇概念汇总的补充。
前一篇博文链接:https://www.cnblogs.com/hnzhengfy/p/k8s_concept.html。
一、详情
1.1 Label
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
1.2 DaemonSet 守护进程
DaemonSet 是 k8s 中的一种控制器,用于管理 Pod 的部署,确保每个节点上都有一个 Pod 在运行。
DaemonSet 控制器会监视集群中的节点状态,一旦有新的节点加入集群,或者节点状态发生变化(如节点重新启动),控制器就会触发相应操作。
- 创建 Pod:当检测到新节点时,控制器会在该节点上创建一个新的 Pod,并确保每个节点上只运行一个 Pod 实例。
- 更新 Pod:如果 DaemonSet 的配置发生变化,控制器会自动更新每个节点上的 Pod 实例。
- 删除 Pod:如果节点发生故障或者被删除,控制器会自动删除该节点上的 Pod 实例。
- 扩容和缩容:DaemonSet 还支持扩容和缩容,可以根据需要增加或减少 Pod 的数量。
DaemonSet 常用于运行一些系统级别的服务或者监控应用程序,使集群中的服务更加健壮和可靠。例如:
日志收集器:在每个节点上运行日志收集器(如 Fluentd 或 Filebeat),收集所有节点的日志数据,并将其发送到中心日志服务器进行存储和分析。
监控代理:在每个节点上运行监控代理(如 Prometheus Node Exporter 或 cAdvisor),收集所有节点的运行状态数据,并将其发送到中心监控服务器进行分析和展示。
网络代理:在每个节点上运行网络代理(如 kube-proxy 或 Istio Sidecar),负责节点之间的网络通信和流量管理。
安全代理:在每个节点上运行安全代理(如 Sysdig Falco 或 Aqua Security),检测所有节点的安全事件,并及时报警或进行防御
1.3 探针(Probe)
一个 Pod 被调度之后,就要进行初始化。初始化肯定是得有一个反馈的,否则都不知道最终有没有启动成功。这些健康检查的功能,叫做探针(Probe)。
常见的有 livenessProbe、readinessProbe、startupProbe 等三种探针。
- livenessProbe 存活探针
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(就绪探针)
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(启动探针)
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
1.4 钩子(Hook)
钩子(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 脚本,需要在指定的事件点执行,因为比较常用就升级到关键字级别了。
1.5 Stateful Sets
StatefulSet 是 k8s 中用于管理有状态应用的控制器,它提供了稳定的网络标识符、持久化存储以及有序部署和扩展等功能。
它与 deployment 类似,唯一的区别是 deployment 创建一组任意名称的 pod,并且 pod 的顺序对它来说并不重要。
而 StatefulSet 为每个 Pod 维护了一个有粘性的 ID,这些 Pod 是基于相同的规约创建的,但不可相互替换,且每个 Pod 都有一个永久不变的 ID。
如果要为 example 的 pod 创建 3 个副本,那么 StatefulSet 将会创建为:example-0、example-1、example-2。因此,这一创建方式最重要的好处就是你可以通过 pod 的名称就了解大致的情况。
两个核心组件:
- Headless Service:无头服务(Headless Service)是一种特殊的 Service,其 ClusterIP 设置为 None,不会分配 Cluster IP,也不会进行负载均衡和路由。这种服务主要用于为 Pod 提供稳定的 DNS 记录,使得 Pod 可以通过域名进行访问。
- VolumeClaimTemplates:StatefulSet 要求每个 Pod 都挂载持久化存储卷,以确保数据在 Pod 重建时得以保留。VolumeClaimTemplates 允许为每个 Pod 动态创建 PersistentVolumeClaim(PVC),从而绑定到相应的 PersistentVolume(PV)。
主要特性:
- 稳定的唯一网络标识符:每个 StatefulSet 的 Pod 都有一个稳定的网络标识符(如 DNS 名称),这个标识符由控制器自动生成,并与 Pod 的生命周期保持关联。这使得有状态应用更容易被其他应用或服务访问和发现。
- 有序部署和扩展:StatefulSet 会按照指定的顺序逐个创建和更新 Pod。每个 Pod 都有一个唯一的序号,用于标识其在集群中的位置。在扩展时,新的 Pod 会按照相同的顺序创建,确保有状态应用的数据一致性和可用性。
- 稳定的存储:每个 StatefulSet 的 Pod 都可以使用持久卷(PersistentVolume)存储数据,这些存储可以在 Pod 重新启动或迁移时保持不变。这使得有状态应用可以继续使用之前的数据,保证数据的持久性和可靠性。
- 域名解析:每个 StatefulSet 的 Pod 都有一个稳定的域名,可以通过该域名进行访问。域名的格式为<statefulset名称>-<序号>..svc.cluster.local>,这使得有状态应用可以通过域名进行服务发现和通信。
- 有序删除:在删除 StatefulSet 时,控制器会按照指定的顺序逐个删除 Pod。这可以确保有状态应用在删除过程中不会丢失数据,并且能够有序地关闭服务。
StatefulSet 通过提供稳定的网络标识符、持久化存储以及有序部署和扩展等功能,为 k8s 中的有状态应用提供了强大的支持。
然而,在使用 StatefulSet 时也需要注意一些事项,如删除 StatefulSet 并不会自动删除其关联的 PVCs 和 PVs 等存储资源。因此,在删除 StatefulSet 前需要明确是否也需要删除这些存储资源并确保应用数据已经妥善备份或具备迁移数据的能力。
参考:https://www.infoq.cn/article/LwQsple5bRO5Vu9966w6
1.6 ConfigMap
ConfigMap 是 k8s 中一种用于配置管理的 API 资源对象,它允许用户将配置信息与容器镜像解耦,从而使得应用程序的配置更加灵活和可移植。用于存储非密钥/值数据,如配置文件、环境变量和命令行参数等。
通过合理地使用ConfigMap,可以提高应用程序的可移植性和可维护性,同时确保配置的安全性和一致性。
ConfigMap 的主要特点是,可以将应用程序的配置信息以键值对的形式保存,并且这些配置信息可以独立于应用程序代码进行管理和更新。
四种创建方式:
- 命令行创建:可以通过 kubectl 命令行工具使用 --from-literal 参数来创建一个 ConfigMap,其中包含键值对。
- 文件创建:可以从文件中创建 ConfigMap,支持单个文件或目录。
- 目录创建:从目录创建 ConfigMap 时,只会读取文件夹第一级内容。
- YAML 文件创建:可以使用 YAML 文件定义 ConfigMap 的内容和结构。
主要的作用:
- 解耦配置与镜像:通过使用 ConfigMap,应用程序的配置信息不再硬编码在容器镜像中,而是存储在 k8s 集群中,这样可以在不修改容器镜像的情况下更新配置,更新完成后重启服务即可。
- 提高安全性:敏感信息不应存储在 ConfigMap 中,因为它是明文存储没有特殊的安全措施,而应使用 Secrets 来保护,下文将详细介绍。
- 适应不同环境:ConfigMap 可以用于不同环境应用环境的配置统一,通过使用不同的 ConfigMap,应用程序可以在不同的环境中保持一致的行为。
使用方式:
- 作为环境变量注入:Pod 可以通过 envFrom 字段引用 ConfigMap,将其所有数据定义为容器的环境变量。
- 作为命令行参数传递:Pod 可以将 ConfigMap 的数据保存在环境变量中,然后通过 $(VAR_NAME) 的方式引用环境变量。
- 作为 Volume 挂载:Pod 可以通过 volumeMounts 将 ConfigMap 作为文件或目录挂载到容器内部。
1.7 Secrets
Secrets 是 k8s 中的一种资源类型,专门用于存储和管理敏感信息。这些信息通常包括密码、OAuth 令牌以及 SSH 密钥等,它们被 Base64 编码后存储在 k8s 集群中。
通过使用 Secrets,可以避免将这些敏感信息硬编码在应用程序代码或 Docker 镜像中,从而提高了安全性和灵活性,同时也可确保配置的灵活性和可移植性。
三种创建方式:
- 命令行创建:可以通过 kubectl 命令行工具使用 --from-literal 参数来创建一个 Secret,其中包含键值对。
- 文件创建:可以从文件中创建 Secret,支持单个文件或目录。
- YAML 文件创建:可以使用 YAML 文件定义 Secret 的内容和结构。
主要的四种类型:
- Opaque 类型:用户定义的任意数据,通常用于存储密码、秘钥等敏感信息。
- Service Account:由 k8s 自动创建,用于访问 API 服务器,并会自动挂载到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目录中。
- kubernetes.io/dockerconfigjson:用来存储私有 Docker Registry 的认证信息。
- kubernetes.io/tls:用于存储 TLS 证书和其关联的私钥。
使用方式:
- 作为环境变量注入:Pod 可以通过 envFrom 字段引用 Secret,将其所有数据定义为容器的环境变量。
- 作为 Volume 挂载:Pod 可以将 Secret 的数据保存在环境变量中,然后通过 $(VAR_NAME) 的方式引用环境变量。
- 作为镜像拉取凭证:允许 kubelet 从私有镜像仓库中拉取镜像。
Secrets 的安全性控制,数据以 Base64 编码格式存储,减少了直接暴露敏感信息的风险。同时也结合 k8s 的 RBAC(基于角色的访问控制)策略,可以限制 Secrets 的访问权限,确保只有授权的用户或服务才能访问。
关于 K8s 的一些基础概念整理-补充【k8s系列之五】的更多相关文章
- 理解 angular2 基础概念和结构 ----angular2系列(二)
前言: angular2官方将框架按以下结构划分: Module Component Template Metadata Data Binding Directive Service Dependen ...
- java基础概念整理综合 及补充(jdk1.8)
2018 java基础 笔记回顾摘要 一 1,html 与 注释: <!-- --> 注释不能嵌套 代码都得有注释. 2,空格符: 3,css选择的优先级: id选择器 > ...
- k8s之Pod基础概念
1. 资源限制 Pod是kubernetes中最小的资源管理组件,Pod也是最小化运行容器化应用的资源对象.一个Pod代表着集群中运行的一个进程.kubernetes中其他大多数组件都是围绕着Pod来 ...
- 进击的K8S:Kubernetes基础概念
Kubernetes简介 Kubernetes简称K8S(因为k和s中间有8个字母),是一个开源的容器集群管理平台,基于Go语言编写. 使用K8S,将简化分布式系统上的容器应用部署,使得开发人员可以专 ...
- storm - 基础概念整理
理论 Hadoop的出现虽然为大数据计算提供了一条捷径,但其仍然存在自身难以克服的缺点:实时性不足.Hadoop的一轮计算的启动需要较长时间,因此其满足不了对实时性有较高要求的场景. Storm由此应 ...
- 光纤与PON基础概念整理
近期有幸接触到通讯这一领域,此文专门用于整理记录. 首先是光纤与光缆 光纤(OpticalFiber,OF)是用来导光的透明介质纤维,一根有用化的光纤是由多层透明介质构成,一般能够分为三部分:折射率 ...
- k8s上的基础概念和术语
kubernetes基本概念和术语 kubeernetes中的大部分概念如Node,Pod,Replication Controller ,Serverce等都可以看作一种“资源对象”,几乎所有的 ...
- [自学]数据库ER图基础概念整理(转)
ER图分为实体.属性.关系三个核心部分.实体是长方形体现,而属性则是椭圆形,关系为菱形. ER图的实体(entity)即数据模型中的数据对象,例如人.学生.音乐都可以作为一个数据对象,用长方体来表示, ...
- java基础概念整理(三)
1.对象的上转型 对象的上转型不能调用和使用子类对象新增的成员和变量,不能调用子类新增的方法. 上转型对象可以访问子类继承或者隐藏的成员变量,也可以调用子类继承或者子类重写的实例方法.因此如果子类重写 ...
- 【k8s】基础概念 + 工作原理
工作原理: 原理图 工作原理描述: 1>用户通过kubectl或者API server的REST API接口,提交需要运行的docker容器(创建pod请求): 2>api server将 ...
随机推荐
- springboot起步依赖
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot ...
- 【题目全解】ACGO排位赛#13
ACGO排位赛#13 - 题目解析 感谢大家参加本次排位赛! T1 - 纪元流星雨 题目链接跳转:点击跳转 也没有特别大的难度,手动模拟一下就可以了. 解题步骤 先计算出这个人一生中第一次看到流星雨的 ...
- vue前端使用nexus配置npm私有仓库
当我们运行前端项目的时候,常常在解决依赖的时候会加上一个参数npm install --registry=https://registry.npm.taobao.org将源指定为淘宝的源,以期让速度加 ...
- work中模板、主题、样式集、样式的作用和使用方法
[收藏]Word样式.样式集.主题.模版怎么区分?进来围观学习了~ 我们先来按照层次关系从小到大排序:样式<样式集<主题<模板 接下来,我们按照层次关系从小到大开始了解它们之间的的区 ...
- 装有docker的虚拟机环境ping宿主机失败
当我用docker network create 创建了一个网络后 [root@localhost ~]# docker network create kong-net 5c035564f9b4649 ...
- KubeSphere 在互联网医疗行业的应用实践
作者:宇轩辞白,运维研发工程师,目前专注于云原生.Kubernetes.容器.Linux.运维自动化等领域. 前言 2020 年我国互联网医疗企业迎来了"爆发元年",越来越多居民在 ...
- 牛客网C++选择题笔记
这是牛客网上的C/C++的选择题的错题,随做随更,有一些题还是有点意思. 当然不是所有都有总结,有明显歧义的不管,过于简单的不管(简不简单因人而异,我先阅读了C++ Primer后再开始做的练习,因此 ...
- PHP调用Python无返回或提示No Module
问题:自己通过命令行执行python正常,但通过php调用就没有反应.解决方法:1.首先检查一下php有没有执行权限,简单粗暴的:sudo chmod 777 xxx.php2.Python如果有中文 ...
- Python安装技术类库模块
方法1: 方法2: 用如下命令安装即可(注意都得是英文字符): # 简单粗暴,但是可能安装到了不同的环境 pip install some-package # 复杂但是精准还快速 C:\Python3 ...
- AI那么厉害,那测试开发和自动化测试这些职位是不是就多余了?
在当今科技飞速发展的时代,AI大模型如ChatGPT等如同璀璨星辰般闪耀登场,它们的强大功能引发了各个领域的诸多思考.在软件测试领域,不少人心里直犯嘀咕:这AI大模型都这么厉害了,那测试开发和自动化测 ...