kubernetes组件 Controller manager深刻认知

news2025/7/13 2:38:01

kubernetes组件 Controller manager深刻认知

    • Controller manager
      • 常见的controller
      • Controller manager的工作流程
      • informer的内部机制
      • 控制器的协同工作原理
        • ReplicaSet controller 是如何被管理的?
      • statefuleset 和deployment controller是如何控制滚动升级的
        • statefuleset的滚动升级策略
        • deployment 的滚动升级策略
          • 一个经典的金丝雀发布请求监控图
      • Controller 如何为statefuleset 设置DNS规则
        • deployment 为什么需要三级对象才能实现rollingupdate? 而daemonset、statefuleset 为何可以呢?
      • deploy 和daemonset 的toleration有何区别?
      • namespace controller
      • garbage controller
        • 如何解除ownerReferences 的父子关系图?
      • 来自生产的经验
      • 高可用
      • 高可用-leader election

Controller manager

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

它由众多控制器组成是Kubernetes负责实现生命式API和控制器模式的核心

常见的controller

在这里插入图片描述
在这里插入图片描述

Controller manager的工作流程

在这里插入图片描述

informer的内部机制

在这里插入图片描述

控制器的协同工作原理

在这里插入图片描述

ReplicaSet controller 是如何被管理的?

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

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

statefuleset 和deployment controller是如何控制滚动升级的

statefuleset的滚动升级策略

statefuleset的rollingupdate每次只升级一个partition,也就是有状态副本集的一个实例,例如mysql实例升级版本, 待确认0没问题之后。 再升级1. 需要人手动改。 无状态的滚动升级则不需要人介入。

template:
    metadata:
      annotations:
        kubectl.kubernetes.io/restartedAt: "2022-09-22T14:41:17+08:00"
      creationTimestamp: null
      labels:
        app: nginx
    spec:
      containers:
      - image: 10.50.10.185/harbortest/nginx:1.7.1
        imagePullPolicy: IfNotPresent
        name: nginx
        ports:
        - containerPort: 80
          name: web
          protocol: TCP
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /usr/share/nginx/html
          name: www
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
  updateStrategy:
    rollingUpdate:
      partition: 0
    type: RollingUpdate

deployment 的滚动升级策略

maxSurge: 每次最多升级多少个pod.
maxUnavailable:每次不可用pod的数量。

spec:
  progressDeadlineSeconds: 600
  replicas: 3
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: nginx-pod
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate

一个经典的金丝雀发布请求监控图

在这里插入图片描述

Controller 如何为statefuleset 设置DNS规则

POD ip变了没关系,因为有DNS 记录,别的用户调用的是域名。域名永远会指向新的podip。
在这里插入图片描述

deployment 为什么需要三级对象才能实现rollingupdate? 而daemonset、statefuleset 为何可以呢?

使用了同一的版本管理controllerrevision 对象 。
这是statefuleset的controllerrevision, 也是通过hash值的变化确定其名称,和deployment相比较少了一层rs。
这是因为deploy这个对象出现的早,后面的对象设计演进更加先进了。

k get controllerrevision -n dev
NAME             CONTROLLER             REVISION   AGE
web-58968dc4b7   statefulset.apps/web   2          64d
web-5d6c5f6975   statefulset.apps/web   1          150d

controllerrevision 的内容


 ⚡ root@master1  /etc/kubernetes  k get controllerrevision web-58968dc4b7 -n dev -oyaml
apiVersion: apps/v1
data:
  spec:
    template:
      $patch: replace
      metadata:
        annotations:
          kubectl.kubernetes.io/restartedAt: "2022-09-22T14:41:17+08:00"
        creationTimestamp: null
        labels:
          app: nginx
      spec:
        containers:
        - image: 10.50.10.185/harbortest/nginx:1.7.1
          imagePullPolicy: IfNotPresent
          name: nginx
          ports:
          - containerPort: 80
            name: web
            protocol: TCP
          resources: {}
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          volumeMounts:
          - mountPath: /usr/share/nginx/html
            name: www
        dnsPolicy: ClusterFirst
        restartPolicy: Always
        schedulerName: default-scheduler
        securityContext: {}
        terminationGracePeriodSeconds: 30
kind: ControllerRevision
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"apps/v1","kind":"StatefulSet","metadata":{"annotations":{},"name":"web","namespace":"dev"},"spec":{"replicas":2,"selector":{"matchLabels":{"app":"nginx"}},"serviceName":"nginx","template":{"metadata":{"labels":{"app":"nginx"}},"spec":{"containers":[{"image":"10.50.10.185/harbortest/nginx:1.7.1","name":"nginx","ports":[{"containerPort":80,"name":"web"}],"volumeMounts":[{"mountPath":"/usr/share/nginx/html","name":"www"}]}]}},"volumeClaimTemplates":[{"metadata":{"name":"www"},"spec":{"accessModes":["ReadWriteOnce"],"resources":{"requests":{"storage":"1Gi"}}}}]}}
  creationTimestamp: "2022-09-22T06:41:17Z"
  labels:
    app: nginx
    controller.kubernetes.io/hash: 58968dc4b7
  name: web-58968dc4b7
  namespace: dev
  ownerReferences:
  - apiVersion: apps/v1
    blockOwnerDeletion: true
    controller: true
    kind: StatefulSet
    name: web
    uid: f85c72ef-4c47-4ccd-bf37-ff074aecb666
  resourceVersion: "20488479"
  uid: f7659ffe-5d5d-4db3-aecd-f868312b7a9a
revision: 2

deploy 和daemonset 的toleration有何区别?

daemon set
和节点比较亲密不容易被驱逐,一般都没有tolerationseconds,会一直赖着不走直到条件满足,
注意看这个promtail的pod yaml,这个组件是用来收集日志的.

apiVersion: v1
kind: Pod
  labels:
    controller-revision-hash: 7d4595d8
    k8s.kuboard.cn/layer: monitor
    k8s.kuboard.cn/name: kuboard-promtail
    pod-template-generation: "1"
  name: kuboard-promtail-2d8ws
  namespace: kuboard
...
  terminationGracePeriodSeconds: 30
  tolerations:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
    operator: Exists
  - effect: NoExecute
    key: node.kubernetes.io/not-ready
    operator: Exists
  - effect: NoExecute
    key: node.kubernetes.io/unreachable
    operator: Exists
  - effect: NoSchedule
    key: node.kubernetes.io/disk-pressure
    operator: Exists
  - effect: NoSchedule
    key: node.kubernetes.io/memory-pressure
    operator: Exists
  - effect: NoSchedule
    key: node.kubernetes.io/pid-pressure
    operator: Exists
  - effect: NoSchedule
    key: node.kubernetes.io/unschedulable
    operator: Exists
  volumes:
  - configMap:
      defaultMode: 420
      name: kuboard-promtail-configmap
    name: config
  - hostPath:

在这里插入图片描述
deployment
和节点关系不大,总结来说就是 “不行我就走”。
在这里插入图片描述

namespace controller

删除一个ns时会级联删除该ns下的所有对象。这是如何做到的呢?
通过uid属性
在这里插入图片描述
ns的删除机制?
ns是标记删除,finalizer 为空则真正删除。
在这里插入图片描述
在这里插入图片描述

garbage controller

ownerReferences 表明这个pod来自哪里?是sts、deploy、daemon 哪个对象呢? 他们之间都是通过ownerReferences来进行关联的。
这就构建出了父子关系图。
graphbuilder. 扫描这些对象,构建这个关系图。

同样删除的时候,会通过这个父子关系图进行级联删除。
在这里插入图片描述

如何解除ownerReferences 的父子关系图?

应用场景是啥呢?
删除的时候通过传入 --cascade=orphan 来完成

# --cascade='background': Must be "background", "orphan", or "foreground". Selects the deletion cascading strategy

来自生产的经验

在这里插入图片描述

高可用

Leader Election
Kubenetes 提供基于 configmap 和 endpoint 的 leader election 类库
Kubernetes 采用leader election 模式启动 component 后』会创建对应 endpoint, leader 信息 annotate 至U endponit 上。

在这里插入图片描述

高可用-leader election

现在一般都不使用EP,使用新的对象lease

这类似于一个文件所,k8s 通过lease 来确保唯一一个controller运行。

# k get lease kube-controller-manager -oyaml -n kube-system
apiVersion: coordination.k8s.io/v1
kind: Lease
metadata:
  creationTimestamp: "2022-06-26T07:04:24Z"
  name: kube-controller-manager
  namespace: kube-system
  resourceVersion: "37461454"
  uid: d9e4245d-4e88-4f6b-900c-ac473bbe3201
spec:
  acquireTime: "2022-10-19T06:54:48.349009Z"
  holderIdentity: master2_5099ba2c-f421-43e6-8f3a-7b09363610d1
  leaseDurationSeconds: 15
  leaseTransitions: 9
  renewTime: "2022-11-25T08:22:57.622771Z"

可以看到mster2 抢到了锁. 来控制controller manager
在这里插入图片描述

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

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

相关文章

学习基于html和JavaScript的滑动图片拼图验证源码

之前的文章《使用C#中的GDI功能实现图片填充验证方式》中介绍过使用GDI在Winform中实现图片拼图验证的思路,学了html中的canvas使用方式后,也可以照搬思路实现,只不过没有在Winform中方便。但是在网上看了不少基于html和JavaScript的滑动图片…

【数据结构】栈的模拟和使用理解

学习目录栈(Stack)栈的概念栈的使用栈相关的应用场景栈的模拟实现中缀表达式 转 后缀表达式栈(Stack) 栈的概念 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作. 进行数据插入和删除操作的一端称为栈顶,另一端称为栈底&a…

关于vba代码运行时错误1004 应用程序定义或对象定义错误问题

一、错误描述 将Excel所有工作表,汇总到一个工作表中: 在thisworkbook中运行如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 Su…

大数据面试题(五):Hadoop优化核心高频面试题

文章目录 Hadoop优化核心高频面试题 一、Mapreduce 跑的慢的原因? 1、计算机性能 2、I/O 操作优化 二、Mapreduce优化方法 1、数据输入 2、map阶段 3、reduce阶段 4、IO传输 5、数据倾斜问题 6、常用的调优参数 三、HDFS小文件优化方法 1、HDFS小文件…

【MATLAB】常见语法结构和实用操作

目录 语法结构 循环(遍历)结构 函数结构 画图操作 绘制函数图像 ezplot figure多图绘制 创建多项式 按照系数创建多项式 利用多项式零点创建多项式 解方程组 语法结构 循环(遍历)结构 与其它编程语言类似,…

常用辅助类

CountDownLatch 应用场景:1.多线程任务汇总。2.多线程任务阻塞住,等待发令枪响,一起执行。 减法计数器 每次有线程调用,数量-1,当计数器归零,countDownLatch.await()就会被唤醒向下执行。 import java.uti…

【代码随想录】二刷-二叉树

二叉树 《代码随想录》 二叉树的遍历方式 深度优先遍历: 前序遍历(递归法、迭代法): 中左右中序遍历(递归法、迭代法): 左中右后序遍历(递归法、迭代法): 左右中 广度优先遍历: 层序遍历(迭代法) 二叉树的定义 struct TreeNode{int val;TreeNode* left;TreeNode* right;TreeN…

无线传感器网络:网络层

文章目录Challenges for RoutingEnergy EfficiencyScalabilityAddressingRobustnessTopologyApplicationRouting MetricsQuality-of-Service (QoS)Minimum HopEnergyMinimum energy consumed per packetMaximum time to network partitionMaximum average energy capacityMaxim…

Java并发-操作系统,进程,线程,并行并发?

我们首先来看看,三者之间的关系,从图中可以看到 操作系统是包含多个进程的容器;而每个进程又是容纳多个线程的容器。什么是进程?官方定义: 进程(baiProcess)是计算机中的程序关于某数据集合上的…

详解:网络虚拟化卸载加速技术的演进

在传统的应用场景中,服务器资源过剩情况普遍,为了充分利用服务器资源,产生了虚拟化技术。虚拟化技术以牺牲部分效率为代价提升了资源的使用率,将原来需要硬件完成的工作,通过软件模拟的方式,满足多个云租户…

初识Qt Quick

讲讲最近几年Qt的热门技术Quick这一块了。 啥是Qt? 哦,这是一个宣称可以跨任意平台,开发各种场景应用软件的开发框架。从三个维度来讲,就是开发库framework,集成开发平台IDE,以及成熟的开发思维模式。 Q…

CAS:82055-94-5,Azide-PEG-Azide,N3-PEG-N3,叠氮聚乙二醇叠氮试剂供应

1、名称 英文:Azide-PEG-Azide,N3-PEG-N3 中文:叠氮-聚乙二醇-叠氮 2、CAS编号:82055-94-5 3、所属分类:Azide PEG 4、分子量:可定制,叠氮-PEG-叠氮 2000、叠氮peg叠氮 1000、叠氮-聚乙二醇…

org.activiti.bpmn

org.activiti.bpmn目录概述需求:设计思路实现思路分析1.BpmnAutoLayout2.BPMNLayout参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for ch…

Mybatis概述

1 概述 原来是Apache的一个开源项目,叫iBatis, 2010年6月这个项目由 Apache Software Foundation 迁移到了 Google Code,随着开发团队转投Google Code 旗下,从 iBatis3.0正式更名为MyBatis。 MyBatis 是一款优秀的持久层框架,对j…

容器卷挂载的秘密

什么是容器卷 数据卷 (Data Volumes )是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似于 Linux 中的 mount 行为。 容器挂载原理 containerd创建的容器里的数据存储在下面的目录中 [rootmaster01 httpb…

【C/C++】万字图文详解C语言文件操作 完美装饰课设大作业

目标导航 写在前面 为什么使用文件? 什么是文件? 程序文件 数据文件 认识文件名 文件的打开和关闭 文件指针 文件的打开和关闭 1.以"r"(只读)的方式打开文件 2.以"w"(只写)…

Java#24(常见API--2)

目录 一.Rantime Runtime表示当前虚拟机的运行环境 Runtime常用方法 扩展:对象克隆 二.Objects Objects是一个对象工具类,提供了一些操作对象的方法 一.Rantime Runtime表示当前虚拟机的运行环境 Runtime常用方法 方法名 作用 publi…

葡萄糖-聚乙二醇-链霉亲和素|Streptavidins-PEG-Glucose|链霉亲和素-PEG-葡萄糖

链霉亲和素(streptavidin下称SA)是与亲和素(avidin下称AV)是一种蛋白质,链霉亲和素是四聚体蛋白,大小为66KDa。一分子链霉亲和素可以高度特异性地与四分子生物素结合,两者之间的亲和力较为强烈。链霉亲和素分子由4条相同的肽链组成&#xff0…

delete-by-query和复合查询

根据term,match等查询方式去删除大量的文档 Ps:如果你需要删除的内容,是index下的大部分数据,推荐创建一个全新的index,将保留的文档内容,添加到全新的索引 # delete-by-query POST /sms-logs-index/sms-lo…

毕业设计-基于机器视觉的颜色目标识别

目录 前言 课题背景和意义 实现技术思路 什么是彩色空间 怎么利用彩色空间 颜色识别的过程 读取图片进行hsv色域转换 对图片特定颜色识别 本地摄像头对视频流进行颜色识别 实现效果图样例 前言 📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后…