kubernetes组件再认知

news2025/1/16 8:06:36

背景

之前学习k8s的各组件还是感觉不深入, 只停留在名字解释上面。总是不能深入理解,例如应用部署后kuber-proxy会在master 和node上添加什么样的iptables规则、部署一个应用的完整流程( 手画各组件功能并介绍10分钟以上 )、schedule具体是怎么调度的、limit request 是如何限制资源的…

  • [ 在这里先抛砖引玉,极客时间孟老师的云原生训练营讲的比较深,推荐观看。后续把学习笔记再更新上来。]

k8s主要组件及功能(感性认知)

一个kubernetes集群主要是由控制节点(master)、**工作节点(node)**构成,每个节点上都会安装不同的组件。

master:集群的控制平面,负责集群的决策 ( 管理 )

ApiServer : 资源操作的唯一入口,接收用户输入的命令,提供认证、授权、API注册和发现等机制

Scheduler : 负责集群资源调度,按照预定的调度策略将Pod调度到相应的node节点上

ControllerManager : 负责维护集群的状态,比如程序部署安排、故障检测、自动扩展、滚动更新等

Etcd :负责存储集群中各种资源对象的信息

node:集群的数据平面,负责为容器提供运行环境 ( 干活 )

Kubelet : 负责维护容器的生命周期,即通过控制docker,来创建、更新、销毁容器

KubeProxy : 负责提供集群内部的服务发现和负载均衡

Docker : 负责节点上容器的各种操作

在这里插入图片描述

各组件再认识

Kubernetes的节点包含两种角色:Master节点和Node节点。
Master节点上面部署

  • apiserver
  • scheduler
  • controller manager(replication controller、node controller等)

Node节点上面部署kubelet和proxy。当然也可以将它们部署到一起,只是生产环境通常不建议这样做。

Apiserver

Apiserver是Kubernetes最核心的组件,它是整个集群API的入口,每个组件都需要和它交互。

Kubernetes所有资源数据都是通过Apiserver保存到后端Etcd的,当然它本身还提供了对资源的缓存。它本身是无状态的,所以在集群的高可用部署中,可以部署成多活。

Kubernetes API接口的分层

Kubernetes API接口主要分为组、版本和资源三层,接口层次如图所示。
对于“/apis/batch/v1/jobs”接口,batch是组,v1是版本,jobs是资源。Kubernetes的核心资源都放在“/api”接口下,扩展的接口放在“/apis”下。

在这里插入图片描述

api版本规划

Kubernetes资源会同时存在多个版本。当新的资源接口刚加入还不成熟时,通常会使用alpha版本,伴随着充分测试逐渐成熟后会变更为beta版本,最终稳定版本将会使用vx版本。譬如statefuleset这个资源之前在“/apis/batch/v2alpha1”和“/apis/batch/v1beta1”中都存在,但伴随着该功能的完善,现在已经将会迁移到v1版本下。

请求到达apiserver后的流程

Apiserver启动后会将每个版本的接口都注册到一个核心的路由分发器(Mux)中。当客户端请求到达Apiserver后,首先经过Authentication认证和Authorization授权。认证支持Basic、Token及证书认证等。授权目前默认使用的是RBAC。经过路由分发到指定的接口,为了兼容多个资源版本,请求的不同版本的资源类型会统一转化为一个内部资源类型,然后进入Admission准入控制和Validation资源校验,在准入控制采用插件机制,用户可以定义自己的注入控制器验证,并更改资源配置。资源校验主要是验证参数是否合法,必传参数是否齐备等。最后再转化到用户最初的资源版本,并保存到Etcd中
在这里插入图片描述

详细的架构图如下:

在这里插入图片描述

为了将外部传入不同版本的资源类型统一转化为对应的内部类型,需要这个内部资源类型能够兼容不同版本的外部资源。

内部的版本定义在types.go文件中。如果是其他版本和内部版本之间转化可以通过自动生成的zz_generated.conversion.go或者自定义的conversion.go完成。

由于v2beta2版本的autoscaling可以直接转化为内部autoscaling,而v1版本的autoscaling并不支持多指标(只能根据CPU扩容),所以需要在conversion.go中将CPU指标当作多指标中的一个指标进行处理。

Controller manager

Controller manager是真正负责资源管理的组件,它主要负责容器的副本数管理、节点状态维护、节点网段分配等。

它是Kubernetes负责实现生命式API和控制器模式的核心

ReplicaSet controller 是如何被管理的?

以ReplicaSet为例,它会周期地检测理想的“目标容器数”和真实的“当前容器数”是否相同。如果不相等,则会将实际的容器数调整到目标容器数。

当设置一个ReplicaSet的副本数为10的时候,如果实际的容器数小于10,则会执行调用Apiserver创建Pod。如果当前容器数大于10,则会执行删除Pod操作。ReplicaSet检测过程如图在这里插入图片描述

Scheduler

Scheduler负责容器调度组件。每个Pod最终需要在一台node节点上启动,通过Scheduler调度组件的筛选、打分,可以选择出Pod启动的最佳节点。当Pod创建后,Pod的NodeName属性为空,Scheduler会查询所有NodeName为空的Pod,并执行调度策略。选择最优的放置节点后,调用Apiserver绑定Pod对应的主机(设置Pod NodeName属性)。当绑定过后,对应节点的Kubelet便可以启动容器。

Scheduler的调度过程的两个步骤

第一步是筛选(Predicate)
筛选满足需要的节点。筛选的条件主要包括
1)Pod所需的资源(CPU、内存、GPU等);
2)端口是否冲突(主要是针对Pod HostPort端口和主机上面已有端口);
3)nodeSelector及亲和性(Pod亲和性和Node亲和性)
4)如果使用本地存储,那么Pod在调度时,将只会调度存储绑定的节点;
5)节点的驱赶策略,节点可以通过taint(污点)设置驱赶Pod策略,对应的Pod也可以设置Toleration(容忍)。
在这里插入图片描述
在这里插入图片描述

第二步是根据资源分配算法排序打分(Priorities)

最终选择得分最高的节点作为最终的调度节点,主要调度策略包括

  • LeastRequestedPriority(最少资源请求算法)

  • BalancedResourceAllocation(均衡资源使用算法

  • ImageLocalityPriority(镜像本地优先算法)

  • NodeAffinityPriority(主机亲和算法)等。

为了归一化每种算法的权重,每种算法取值范围都是0~10,最终累加所有算法的总和,取得分最大的主机作为Pod的运行主机。
在这里插入图片描述
在这里插入图片描述

为了提高调度的效率,Scheduler的Predicate和Priorities采用了并行调度。除此之外,Scheduler组件本地维护了一个调度队列和本地缓存,调度队列暂存了需要被调度的Pod,还可以调整调度的先后顺序。本地缓存主要是缓存Pod和Node信息,这样可以避免每次调度时都要从Apiserver获取主机信息。如图
在这里插入图片描述

Scheduler中的乐观锁

Predicate和Priorities都是并行操作的,那么有可能会出现数据的不一致,即Pod调度时主机上面资源是符合要求的。当容器启动时,由于其他容器也调度到该节点导致资源又不满足要求了。所以,在Kubelet启动容器之前首先执行一遍审计(在Kubelet上重新执行一遍Predicate)操作,确认资源充足才会启动容器,否则将更新Pod状态为Failed。

Init Container的资源限制的坑

在这里插入图片描述

pod资源申请计算实例

下面以Pod资源使用为例,Pod通过request和limit的定义资源使用的下限和上限。Scheduler会累加Pod中每个容器的资源申请量,作为Pod的资源申请量。这里需要注意的是Initcontainer容器的资源用量,由于它只是在运行业务容器之前启动一段时间,并不会累加到Pod总资源申请量中,因此只是影响Pod资源申请的最大值

  containers:
  - name: nginx
    image: nginx:1.17.1
    resources:
      limits:  
        cpu: "2" 
        memory: "1Gi"
  - name: nginx
    image: nginx:1.20.2
    resources: 
      limits:  
        cpu: "1" 
        memory: "1Gi"   
  initContainers:
  - name: test-mysql
    image: busybox:1.30
    resources:
      limits:  
        cpu: "2" 
        memory: "3Gi"
  - name: test-redis
    image: busybox:1.30
    resources:
      limits:  
        cpu: "2" 
        memory: "1Gi"

最终得出这个Pod总的资源申请量为:CPU:3,Memory:3G。其中,CPU为3,两个业务容器CPU申请之和,大于任何一个InitContainers的CPU,而内存的3G来自InitContainers的内存申请。(init container 是串行执行完之后资源就释放了,所以不需要4GB)

nodeSelector

Node Affinity

podAffinity

Taints和Tolerations

Kubelet

Kubelet是具体干活的组件,它接收Apiserver分配的启动容器的任务,然后拉起容器。
当然,如果收到销毁指令,同样会执行删除容器的操作。本地镜像也是由Kubelet负责维护,配合GC机制,删除无用的镜像和容器。除此之外,它还需要定时向Apiserver上报自己的状态,一方面告知Apiserver自身还存活着,另一方面为了将本节点的Pod状态、存储使用等信息上报到Apiserver。Kubelet启动一个主线程,用于保持和Apiserver的通信,主线程不能被阻塞,否则将无法定时完成上报,导致Apiserver将该节点设置为NotReady状态。所以,Kubelet会启动很多协程用于检测节点状态,回收废旧资源,驱赶低优先级Pod,探测Pod健康状态等

syncLoop是Kubelet的核心,它通过一个死循环不断接收来自Pod的变化信息,并通过各种Manger执行对应的操作。

在这里插入图片描述

Kube-proxy

Kube-proxy是代理服务,它可以为Kubernetes的Service提供负载均衡本质上是iptables或者ipvs实现的
Kubernetes将服务和Pod通过标签的方式关联到一起,通过服务的标签筛选找到后端的Pod,但服务的后端并非直接关联Pod,而是通过Endpoint(端点)关联。
Endpoint可以理解成“Pod地址:Pod端口”的组合,一个Endpoint可以加入多个服务中。

kube-proxy如何生成iptables规则的?

下面将通过一个服务的案例阐述kube-proxy如何生成iptables规则的。当我们创建一个服务后,默认情况下,Kubernetes会为每个服务生成一个集群虚IP。通过访问该IP便可以采用负载均衡的方式访问后端Pod中的服务。

在这里插入图片描述

service的yaml文件
apiVersion: v1
kind: Service
metadata:
  name: nginx-service-nodeport
  namespace: dev
spec:
  clusterIP: 10.96.70.31
  ports:
  - nodePort: 30001
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    name: nginx
  sessionAffinity: None
  type: NodePort
pod 分布在不同的节点
k get po -l name=nginx -owide
NAME              READY   STATUS    RESTARTS       AGE    IP               NODE    NOMINATED NODE   READINESS GATES
nginx-web-2ztjg   1/1     Running   6 (144d ago)   144d   10.244.166.133   node1   <none>           <none>
nginx-web-jl78g   1/1     Running   8 (144d ago)   144d   10.244.104.6     node2   <none>           <none>

访问nginx
kubectl exec -it nginx-web-2ztjg -- /bin/bash
root@nginx-web-2ztjg:/#
root@nginx-web-2ztjg:/#
root@nginx-web-2ztjg:/# curl -s 10.96.70.31 | grep -i welcome
<title>Welcome to nginx!</title>
<h1>Welcome to nginx!</h1>

Pod-to-Service 的iptables规则探究

Pod-to-Service 数据包都被PREROUTING链拦截

iptables -t nat -nvL PREROUTING

在这里插入图片描述

这些数据包被重定向到KUBE-SERVICES链,在那里它们与所有配置的匹配,最终到达这些行:

iptables -t nat -nvL KUBE-SERVICES
Chain KUBE-SERVICES (2 references)
 pkts bytes target     prot opt in     out     source               destination
    0     0 KUBE-MARK-MASQ  all  --  *      *      !10.244.0.0/16        0.0.0.0/0            /* Kubernetes service cluster ip + port for masquerade purpose */ match-set KUBE-CLUSTER-IP dst,dst
   38  2192 KUBE-NODE-PORT  all  --  *      *       0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL
    0     0 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            match-set KUBE-CLUSTER-IP dst,dst

为iptable设置alias

在这里插入图片描述
Pod 到svc的通信(紫色数据包)——完全在出口节点内实现,并依赖 CNI 实现 Pod 到 Pod 的可达性。
外部到svc的通信(灰色数据包)——包括任何外部来源的,最值得注意的是,节点到服务的流量。

iptables规则参考

Deployment的启动流程串起来

kubectl run(eg:kubectl run nginx–image=nginx–replicas=5)命令去创建一个Deployment。这个请求先到达Apiserver,Apiserver负责保存到Etcd,Controller manager中的Deployment控制器会监测到有一个Deployment被创建,此时会创建相应的ReplicaSet,ReplicaSet的控制器也会监测到有新的ReplicaSet创建这个事情,会根据相应的副本数调用Apiserver创建Pod。此时的Pod的主机字段是空的,因为还不知道将要在哪台机器上面启动,然后Scheduler开始介入,调度没有分配主机的Pod,通过预先设定的调度规则,包括节点标签匹配、资源使用量等选择出最合适的一台机器,在通过apiserver的bind请求将Pod的主机字段设置完成。那么Kubelet也监测到属于自己的节点有新容器创建的事件,于是便拉起一个容器,并上报给apiserver容器的状态

cloud-controller-manager

Kubernetes 1.6后面添加的,主要负责与IaaS云管理平台进行交互,主要是GCE和AWS。Kubernetes大部分部署目前都是在公有云环境中。Cloud-controller-manager通过调用云API获取计算节点状态,通过与云中负载均衡器交互,创建及销毁负载均衡,并且还可以支持云中存储的创建、挂载及销毁,主要是利用IaaS的能力扩展和增强Kubernetes的功能。

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

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

相关文章

计算机视觉|针孔成像,相机内外参及相机标定,矫正的重要性

计算机视觉读书笔记|相机内外参及相机标定&#xff0c;矫正的重要性 这篇博客将介绍针孔成像&#xff0c;透镜&#xff08;弥补了针孔成像曝光不足成像速度慢的缺点&#xff0c;但引进了畸变&#xff0c;主要是径向畸变和切向畸变&#xff0c;径向畸变主要是离中心越远越弯曲&…

Tableau指标排行

2022年11月15日&#xff0c;深圳数据交易所举行揭牌暨数据交易成果发布活动。 文章目录前言一、整体数据排行二、数据排行TOP N三、根据需要也可以显示具体排名总结前言 分享Tableau指标排行制作过程中遇到的问题及其解决方式&#xff0c;供各位小伙伴参考。 一、整体数据排行…

谷粒学院(二) 讲师管理模块

一、讲师管理模块配置 1、在service下面service-edu模块中创建配置文件 2. resources目录下创建文件 application.properties # 服务端口 server.port8001 # 服务名 spring.application.nameservice-edu# 环境设置&#xff1a;dev、test、prod spring.profiles.activedev# my…

java基于ssm网上超市购物商城-计算机毕业设计

项目介绍 网上超市是商业贸易中的一条非常重要的道路&#xff0c;可以把其从传统的实体模式中解放中来&#xff0c;网上购物可以为消费者提供巨大的便利。通过网上超市这个平台&#xff0c;可以使用户足不出户就可以了解现今的流行趋势和丰富的商品信息&#xff0c;为用户提供…

MySQL8.0优化 - 锁 - 从数据操作的粒度划分:表级锁、页级锁、行锁

文章目录学习资料锁的不同角度分类锁的分类图如下从数据操作的粒度划分&#xff1a;表级锁、页级锁、行锁表锁&#xff08;Table Lock&#xff09;表级别的S锁、X锁意向锁&#xff08;intention lock&#xff09;自增锁&#xff08;AUTO-INC锁&#xff09;元数据锁&#xff08;…

算法刷题介绍

算法刷题介绍 课程大纲 Python 作为实现语言。 快速排序算法 0 (nlogn) 实际工作中要根据实际情况选择最优解。 有可能没有完美方案&#xff0c;需要做平衡。 数据有啥特征&#xff1f; 举例&#xff1a;对一组数据进行排序 是否包含大量重复元素&#xff08;三路快排&#x…

【微服务治理之监控APM】系统监控架构概述

APM 简介 APM 通常认为是 Application Performance Management 的简写&#xff0c;它主要有三个方面的内容&#xff0c;分别是 Logs(日志)、Traces(链路追踪)Metrics(报表统计)。 以后大家接触任何一个 APM 系统的时候&#xff0c;都可以从这三个方面去分析它到底是什么样的…

vue中scoped原理与样式穿透原理

是什么 在vue组件中的style标签上有一个特殊属性&#xff1a;”scoped“ 为什么 当一个style标签拥有scoped属性时&#xff0c;它的CSS样式就只能作用于当前的组件&#xff0c;通过该属性&#xff0c;可以使得组件之间的样式不互相污染。 怎么样实现的 1.为组件实例生成一个唯一…

[附源码]SSM计算机毕业设计智能视频推荐网站JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

codeforces:F. All Possible Digits【贪心 + 模拟进位】

目录题目截图题目分析ac code总结题目截图 题目分析 注意是只能再最后一位加我们要使得0到p - 1都出现至少一次统计出现的数字aset考虑最后一位pivot情况1&#xff1a;如果pivot前都出现了&#xff0c;就不用进位了&#xff0c;pivot只需要加到最大的未出现在aset的num即可情况…

【编程题】【Scratch二级】2022.09 小老鼠偷面包

小老鼠偷面包 1. 准备工作 &#xff08;1&#xff09;背景&#xff1a;Stars&#xff0c;绘制如下图所示的迷宫&#xff1b; &#xff08;2&#xff09;角色&#xff1a;Cat 2、Mouse1、Bread。 2. 功能实现 &#xff08;1&#xff09;Cat 2、Mouse1和Bread初始位置和方向如…

机器人C++库(12) Robotics Library 之路径规划算法:PRM、RRT、EET算法

机器人C库&#xff08;12&#xff09;Robotics Library 之路径规划算法&#xff1a;PRM、RRT、EET算法 RL库的运动规划(rl::plan)模块集成了以下经典的路径规划算法&#xff1a; PRM算法:概率路线图算法RRT算法&#xff1a;快速探索随机树算法EET算法&#xff1a;搜索树算法-基…

牧场系统设计与实现-计算机毕业设计源码+LW文档

关键代码 package com.example.controller; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.huto…

japonensisjava乱码_Java乱码问题原因及解决方案

一. java乱码乱码问题解决思路,java乱码分为以下几种 1. 请求乱码 如果是在请求过程中发生的乱码,有可能是以下几种情况: 参数放在 URL 地址中乱码; 参数在请求体中乱码; 数据库本身乱码; 数据从 Java 应用程序传入数据库的过程中乱码。 2. 响应乱码 如果是响应乱码,那…

Go语言学习(八)-- Gin入门

Gin 是一个 Go (Golang) 编写的轻量级 http web 框架&#xff0c;运行速度非常快。Gin 最擅长的就是 Api 接口的高并发&#xff0c;如果项目的规模不大&#xff0c;业务相对简单&#xff0c;这个时候我们 也推荐您使用 Gin。 当某个接口的性能遭到较大挑战的时候&#xff0c;这…

Prometheus监控案例

一&#xff1a;环境规划&#xff1a; 主机名主机地址角色node4192.168.188.114prometheus客户端node5192.168.188.115prometheus服务端 二. 监控远程linux主机&#xff1a; 1. 解压node_exporter压缩包&#xff1a; [rootnode4 ~]# tar xf node_exporter-1.3.1.linux-amd64…

RT-Thread 下的文件内容对比 MSH shell cmd 命令实现方法

前言 在使用 RT-Thread 时&#xff0c;需要对两个文件的内容进行比较&#xff0c;顺手写了一个测试的 MSH shell 命令&#xff0c;经过优化&#xff0c;发现功能可以使用 RT-Thread 下支持多种文件系统&#xff0c;如FAT等&#xff0c;可以通过 USB、串口 的 Ymodem 等协议把文…

YOLOv5-seg数据集制作、模型训练以及TensorRT部署

YOLOv5-seg数据集制作、模型训练以及TensorRT部署版本声明一、数据集制作&#xff1a;图像 Json转txt二、分割模型训练三 tensorRT部署版本声明 yolov5-seg:官方地址&#xff1a;https://github.com/ultralytics/yolov5/tree/v6.2 TensorRT&#xff1a;8.x.x 语言&#xff1a;…

基于stm32单片机体重秤电子秤超重提醒

资料编号&#xff1a;107 下面是相关功能视频演示&#xff1a; 107-基于stm32单片机体重秤电子秤称重超重报警Proteus仿真&#xff08;源码仿真全套资料&#xff09;功能介绍&#xff1a; 采用stm32单片机&#xff0c;可以设置称重上限制&#xff0c;LCD1602显示重量&#xf…

04_tcp

知识点1【多播】 多播地址&#xff1a; 多播地址向以太网MAC地址的映射 UDP多播工作过程&#xff1a; 多播地址结构体&#xff1a; 多播套接口选项&#xff1a; 知识点2【TCP面向链接编程】 1、创建tcp套接字 2、做为客户端需要具备的条件 3、connect链接服务器的函数…