kubernetes组件 Controller manager深刻认知
创始人
2024-02-16 12:26:22
0

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: nulllabels:app: nginxspec:containers:- image: 10.50.10.185/harbortest/nginx:1.7.1imagePullPolicy: IfNotPresentname: nginxports:- containerPort: 80name: webprotocol: TCPresources: {}terminationMessagePath: /dev/termination-logterminationMessagePolicy: FilevolumeMounts:- mountPath: /usr/share/nginx/htmlname: wwwdnsPolicy: ClusterFirstrestartPolicy: AlwaysschedulerName: default-schedulersecurityContext: {}terminationGracePeriodSeconds: 30updateStrategy:rollingUpdate:partition: 0type: RollingUpdate

deployment 的滚动升级策略

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

spec:progressDeadlineSeconds: 600replicas: 3revisionHistoryLimit: 10selector:matchLabels:app: nginx-podstrategy: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: replacemetadata:annotations:kubectl.kubernetes.io/restartedAt: "2022-09-22T14:41:17+08:00"creationTimestamp: nulllabels:app: nginxspec:containers:- image: 10.50.10.185/harbortest/nginx:1.7.1imagePullPolicy: IfNotPresentname: nginxports:- containerPort: 80name: webprotocol: TCPresources: {}terminationMessagePath: /dev/termination-logterminationMessagePolicy: FilevolumeMounts:- mountPath: /usr/share/nginx/htmlname: wwwdnsPolicy: ClusterFirstrestartPolicy: AlwaysschedulerName: default-schedulersecurityContext: {}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: nginxcontroller.kubernetes.io/hash: 58968dc4b7name: web-58968dc4b7namespace: devownerReferences:- apiVersion: apps/v1blockOwnerDeletion: truecontroller: truekind: StatefulSetname: webuid: f85c72ef-4c47-4ccd-bf37-ff074aecb666resourceVersion: "20488479"uid: f7659ffe-5d5d-4db3-aecd-f868312b7a9a
revision: 2

deploy 和daemonset 的toleration有何区别?

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

apiVersion: v1
kind: Podlabels:controller-revision-hash: 7d4595d8k8s.kuboard.cn/layer: monitork8s.kuboard.cn/name: kuboard-promtailpod-template-generation: "1"name: kuboard-promtail-2d8wsnamespace: kuboard
...terminationGracePeriodSeconds: 30tolerations:- effect: NoSchedulekey: node-role.kubernetes.io/masteroperator: Exists- effect: NoExecutekey: node.kubernetes.io/not-readyoperator: Exists- effect: NoExecutekey: node.kubernetes.io/unreachableoperator: Exists- effect: NoSchedulekey: node.kubernetes.io/disk-pressureoperator: Exists- effect: NoSchedulekey: node.kubernetes.io/memory-pressureoperator: Exists- effect: NoSchedulekey: node.kubernetes.io/pid-pressureoperator: Exists- effect: NoSchedulekey: node.kubernetes.io/unschedulableoperator: Existsvolumes:- configMap:defaultMode: 420name: kuboard-promtail-configmapname: 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-managernamespace: kube-systemresourceVersion: "37461454"uid: d9e4245d-4e88-4f6b-900c-ac473bbe3201
spec:acquireTime: "2022-10-19T06:54:48.349009Z"holderIdentity: master2_5099ba2c-f421-43e6-8f3a-7b09363610d1leaseDurationSeconds: 15leaseTransitions: 9renewTime: "2022-11-25T08:22:57.622771Z"

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

相关内容

热门资讯

中考横幅标语大全   1.春播秋收近十载,一朝收获终有成。  2.不论你在什么时候开始,重要的是开始之后不要停止。  ...
家装实木高档油漆门广告语 家装实木高档油漆门广告语  1、一“门”心思只为您。  2、打开木门,开启幸福。  3、独门工艺,专...
厕所文明标语 厕所文明标语(通用185句)  在现实生活或工作学习中,大家都对那些朗朗上口的标语很是熟悉吧,标语是...
宣传稿格式 宣传稿格式  一、宣传稿的介绍  首先,新闻宣传稿要重视宣传的本身意义和作用。  其次,要懂得如何在...
校园文明标语 校园文明标语  在学习、工作、生活中,大家都接触过比较经典的标语吧,标语的作用是便于“造势”,形成一...
打折促销标语 打折促销标语大全  XX真情回馈理惠X折  终极X小时终极抄底价  心动,不如行动!  不做不休用暴...
最新学习小组口号 最新学习小组口号  在日常的学习、工作、生活中,大家都经常接触到口号吧,口号作为意识的表现形式之一,...
垃圾分类标语 垃圾分类标语(精选140句)  在平时的学习、工作或生活中,大家最不陌生的就是宣传语了吧,宣传语具有...
安全生产横幅标语口号 安全生产横幅标语口号大全  ●安全人人抓,幸福千万家  ●安全生产 人人有责  ●安全生产 重在预防...
迎新的标语 迎新的标语(精选150句)  在日常学习、工作和生活中,大家都接触过比较经典的标语吧,标语不但折射着...
2022年村委会普法宣传简报 2022年村委会普法宣传简报  一、村委会相关介绍  村委会的全称为村民委员会,为中国大陆地区乡(镇...
广告公司广告语 广告公司广告语大全  广告公司广告语大全广告语指通过各种传播媒体和招贴形式向公众介绍商品、文化、娱乐...
经典安全标语 经典安全标语大全  导语:安全是宝藏,安全是生命,安全是金钱。下面是由小编为你整理的经典安全标语大全...
奶茶广告语 奶茶广告语大全  广告,顾名思义,就是广而告之,向社会广大公众告知某件事物。那么奶茶店的广告又该是怎...
2班军训押韵口号_口号 2班军训押韵口号_口号  无论在学习、工作或是生活中,说到口号,大家肯定都不陌生吧,口号是供口头呼喊...
煤矿安全生产的标语 煤矿安全生产的标语(通用255句)  标语是指:文字简练、意义鲜明的宣传、鼓动口号。标语是用简短文字...
光盘行动标语 关于光盘行动标语(精选100句)  在平凡的学习、工作、生活中,许多人对一些广为流传的标语都不陌生吧...
大学生评语 关于大学生评语  所谓评语,就是对一个人的全面(包括学习、生活、心理等方面)印象、评价之类的语言。下...
淘宝卖家评语 淘宝卖家评语  随着互联网的告诉发展,越来越多人喜欢在网上购买东西。那么在淘宝购物后要怎么评价呢?下...
课堂教学评语 课堂教学评语大全  在平凡的学习、工作、生活中,大家都用到过评语吧,通过评语的导向作用,我们可以引导...