热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

k8s原理

[toc]k8spause(暂停)组件的作用首先复制下docker的namespacepause容器主要为每个业务容器提供以下功能在pod中担任Linux命名空间共享的基础

[toc]

k8s

pause(暂停)组件的作用

首先复制下docker的namespace

pause容器主要为每个业务容器提供以下功能

  • 在pod中担任Linux命名空间共享的基础;
    • pod中,user、UTS、mount、network都是共享的。
    • pod中,pid、ipc默认是不共享的
  • 启用pid命名空间,开启init进程。
    • Pod中,PID默认是不共享的,因此IPC也是不共享的。k8s 1.8之后默认情况下是禁用的,除非由kubelet标志(--docker-disable-shared-pid=false)启用,所有我们看到一个pod中各个容器的pid是相互独立的。

如果没有启动pid命名空间共享,则Pod中的每个容器都将具有自己的PID 1,并且每个容器都需要收集僵尸进程本身。很多时候,这不是一个问题,因为应用程序很少产生其他进程,但僵尸进程使用内存是一个经常被忽视的问题。因此,由于PID命名空间共享使你能够在同一个Pod中的容器之间发送信号。

引出僵尸进程:正常的进程结束后,会调用exit退出,变成一个僵尸进程,然后释放全部资源,等待父进程回收,如果**父进程没有安装sigchld信号处理函数调用wait()或者waitid()等待子进程结束,也没有显示忽略改信号**,那么他会一直是一个僵尸进程。如果父进程结束了,会交给init进程来回收。那如果父进程是一个循环,不会结束的话,那么子进程就会一直保持僵尸进程,不会释放资源。

一个pod启动的全生命周期

Scheduler 和manager的集群原理

scheduler的调度策略

调度策略

k8s的调度策略分为predicates(预选策略)和priorites(优选策略),整个调度过程分俩步

  • 预选策略,predicates是强制性规则,遍历所有的node节点,安装具体的预选策略筛选出符合要求的node列表,如果没有node符合predicates策略规则,那么pod就会被挂起,直到有node能够满足
  • 优选策略,在第一步筛选的基础上,按照优选策略为待选node打分排序,获取最优者

预选策略--必须全部满足

  1. CheckNodeCondition:检测node是否正常
  2. GeneralPredicates:普通判断策略
    1. HostName: 检测pod对象是否定义了pod.spec.hostname
    2. PodFitsHostPorts:检测pods.spec.containets.ports.hostPort是否定义
    3. MatchNodeSelector:检测pod是否设置了pods.spec.nodeSelector
    4. PodFitsResources:检测pod的资源需求是否能被节点所满足
  3. NoDiskConflict:检测pod依赖的存储卷是否能满足需求
  4. PodToleratesNodeTaints: 检测pod上的spec.tolerations可容忍的污点是否完全包含节点上的污点
  5. PodToleratesNodeNoExecuteTaints: 检测pod上是否启用了NoExecute级别的污点,默认没有启用
  6. CheckNodeLabelPresence: 检测node上的标签的存在与否,默认没有启用
  7. CheckServiceAffinity:将相同service pod的对象放到一起,默认没有启用
  8. CheckVolumeBinding:检测节点上已绑定和未绑定的volume
  9. NoVolumeZoneConflict:检测区域,是否有pod volume的冲突
  10. CheckNodeMemoryPressure:检测内存节点是否存在压力
  11. CheckNodePIDPressure:检测pid资源的情况
  12. CheckNodeDiskPressure:检测disk资源压力
  13. MatchInterPodAffity:检测pod的亲和性
  14. 下面的几个策略一般用不上(EBS,GCE,Azure)对这几个云厂商的
  15. MaxEBSVolumeCount: 确保已挂载的EBS存储卷不超过设置的最大值,默认39
  16. MaxGCEPDVolumeCount: 确保已挂载的GCE存储卷不超过设置的最大值,默认16
  17. MaxAzureDiskVolumeCount: 确保已挂载的Azure存储卷不超过设置的最大值,默认16

优选策略

优选函数的评估: 如果一个pod过来,会根据启用的全部函数的得分相加得到的评估

  1. LeastRequested:最少请求,与节点的总容量的比值, 计算公式:(cpu比值+内存比值)的一半 (cpu((capacity-sum(requested))*10 / capacity)+memory((capacity-sum(requested))*10 / capacity)) / 2

  2. BalancedResourceAllocation:cpu和内存资源被占用的比率相近程度,越接近,比分越高,平衡节点的资源使用情况, 计算公式: cpu=cpu((capacity-sum(requested))*10 / capacity) mem=memory((capacity-sum(requested))*10 / capacity)

  3. NodePreferAvoidPods:在这个优先级中,优先级最高,得分非常高 根据节点的注解信息“scheduler.alpha.kubernetes.io/preferAvoidPods”

  4. TaintToleration:将pod对象的spec.tolertions与节点的taints列表项进行匹配度检测,匹配的条目越多,得分越低

  5. SeletorSpreading:尽可能的把pod分散开,也就是没有启动这个pod的node,得分会越高

  6. InterPodAffinity:遍历pod的亲和性,匹配项越多,得分就越多

  7. NodeAffinity:节点亲和性,亲和性高,得分高

  8. MostRequested:空闲量越少的,得分越高,与LeastRequested不能同时使用,集中一个机器上面跑pod,默认没有启用

  9. NodeLabel:根据node上面的标签来评估得分,有标签就有分,没有标签就没有分,默认没有启用

  10. ImageLocality:一个node的得分高低,是根据node上面是否有镜像,有镜像就有得分,反之没有(根据node上已有满足需求的image的size的大小之和来计算。),默认没有启用

kube-controller-manager

就是用来控制Pod的状态和生命周期的

pod的生命周期

Pod phase(阶段)

  • 挂起(Pending):Pod 已被 Kubernetes 系统接受,但有一个或者多个容器镜像尚未创建。等待时间包括调度 Pod 的时间和通过网络下载镜像的时间,这可能需要花点时间。
  • 运行中(Running):该 Pod 已经绑定到了一个节点上,Pod 中所有的容器都已被创建。至少有一个容器正在运行,或者正处于启动或重启状态。
  • 成功(Succeeded):Pod 中的所有容器都被成功终止,并且不会再重启。
  • 失败(Failed):Pod 中的所有容器都已终止了,并且至少有一个容器是因为失败终止。也就是说,容器以非0状态退出或者被系统终止。
  • 未知(Unknown):因为某些原因无法取得 Pod 的状态,通常是因为与 Pod 所在主机通信失败。

image-20191018230800520

pod5个状态

PodScheduled、Ready、Initialized、Unschedulable和ContainersReady

deployment、ReplicationController、replicaset

Deployment 为 Pod 和 ReplicaSet 提供了一个声明式定义(declarative)方法,用来替代以前的ReplicationController 来方便的管理应用。典型的应用场景包括:

  • 定义Deployment来创建Pod和ReplicaSet
  • 滚动升级和回滚应用
  • 扩容和缩容
  • 暂停和继续Deployment

ReplicationController用来确保容器应用的副本数始终保持在用户定义的副本数,即如果有容器异常退出,会自动创建新的Pod来替代;而如果异常多出来的容器也会自动回收。ReplicaSet跟ReplicationController没有本质的不同,只是名字不一样,并且ReplicaSet支持集合式的selector。

虽然ReplicaSet可以独立使用,但一般还是建议使用 Deployment 来自动管理ReplicaSet,这样就无需担心跟其他机制的不兼容问题(比如ReplicaSet不支持rolling-update但Deployment支持)。

Helm2 和helm3存储位置

helm2配置信息全部在tiller所在的名称空间存储,存储方式都是configmap方式

helm3配置信息分布在服务自己的namespace中,存储方式是secret方式



推荐阅读
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
author-avatar
mobiledu2502858787
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有