kubernetes组件 Controller manager深刻认知

简介: kubernetes组件 Controller manager深刻认知

Controller manager

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


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

常见的controller

018af1a8166641a0b06af482ca37ff22.png

ce33b0fc30f546b2a7e6822bbef69abd.png

Controller manager的工作流程cf58a78271d14708926d923f406dff9b.pnginformer的内部机制2d1a912ecfa44b02a38db553d544deb0.png控制器的协同工作原理3066fe228d7f467782b3095f2c8415bc.png

ReplicaSet controller 是如何被管理的?

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


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

673ea99ca4e2449f8fed9e0d49b511c1.png

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
一个经典的金丝雀发布请求监控图9c49631e7d52475598268a33c4bce568.png

Controller 如何为statefuleset 设置DNS规则

POD ip变了没关系,因为有DNS 记录,别的用户调用的是域名。域名永远会指向新的podip。bf985a15037e453f9a2f034533dc3e44.png

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:

9574d609d9da42498a7908b8b76ce6f8.png

deployment

和节点关系不大,总结来说就是 “不行我就走”。12217f301c5e4166b2e26a3154e539df.png

namespace controller

删除一个ns时会级联删除该ns下的所有对象。这是如何做到的呢?

通过uid属性402b7b565eb74a4f83f31dc9a34da2a8.png

ns的删除机制?

ns是标记删除,finalizer 为空则真正删除。6f48af602541497e8c0bc16e489686aa.png

d06f5012a25241bf8e32402bbdf3a6cd.png

garbage controller

ownerReferences 表明这个pod来自哪里?是sts、deploy、daemon 哪个对象呢? 他们之间都是通过ownerReferences来进行关联的。

这就构建出了父子关系图。

graphbuilder. 扫描这些对象,构建这个关系图。


同样删除的时候,会通过这个父子关系图进行级联删除。3c63af185fee489bbde522b009ef0ef6.png

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

应用场景是啥呢?

删除的时候通过传入 --cascade=orphan 来完成

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

来自生产的经验

876856cea81b4bd9954d77e64abec2aa.png

高可用

Leader Election

Kubenetes 提供基于 configmap 和 endpoint 的 leader election 类库

Kubernetes 采用leader election 模式启动 component 后』会创建对应 endpoint, leader 信息 annotate 至U endponit 上。cc15ed9457274ff5ae2877462dc4c838.png

高可用-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

592c6247fab84de3881069e9e0cd888b.png

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
5月前
|
Kubernetes API 调度
Kubernetes 架构解析:理解其核心组件
【8月更文第29天】Kubernetes(简称 K8s)是一个开源的容器编排系统,用于自动化部署、扩展和管理容器化应用。它提供了一个可移植、可扩展的环境来运行分布式系统。本文将深入探讨 Kubernetes 的架构设计,包括其核心组件如何协同工作以实现这些功能。
455 0
|
3月前
|
Kubernetes 负载均衡 应用服务中间件
k8s学习--ingress详细解释与应用(nginx ingress controller))
k8s学习--ingress详细解释与应用(nginx ingress controller))
473 0
|
4月前
|
Kubernetes 容器
Kubernetes附加组件Dashboard部署实战篇
关于如何在Kubernetes集群中部署和配置Dashboard组件的详细实战指南,涵盖了从创建证书、部署Dashboard、设置服务访问到登录认证的完整流程。
597 0
Kubernetes附加组件Dashboard部署实战篇
|
5月前
|
存储 Kubernetes API
在K8S中,Kubernetes的组件有哪些?
在K8S中,Kubernetes的组件有哪些?
|
5月前
|
Kubernetes 调度 容器
k8s descheduler 组件安装
k8s descheduler 组件安装
|
5月前
|
存储 Kubernetes API
在K8S中,各组件是如何实现高可用的?
在K8S中,各组件是如何实现高可用的?
|
5月前
|
存储 Kubernetes API
在K8S中,各个组件及其作用是什么呢?
在K8S中,各个组件及其作用是什么呢?
|
5月前
|
Kubernetes 负载均衡 网络协议
在K8S中,DNS组件有什么特性?
在K8S中,DNS组件有什么特性?
|
5月前
|
存储 Kubernetes API
在K8S中,calico有哪些组件?都是做什么的?
在K8S中,calico有哪些组件?都是做什么的?
|
5月前
|
域名解析 Kubernetes 负载均衡
在K8S中,外部访问容器服务,比如说提供了一个域名,链路怎么走?数据经过哪些组件?
在K8S中,外部访问容器服务,比如说提供了一个域名,链路怎么走?数据经过哪些组件?

热门文章

最新文章