kubernetes 官方文档整理,k8s入门教程笔记整理---4、kubernetes架构

6.kubernetes架构

6.1节点

容器是在节点上的pod中运行的,节点可以是一个虚拟机或者物理机器。每个节点上必有kubelet、容器运行时、kube-proxy。

6.1.1管理

添加节点的方式:

  1. kubelet向控制面执行自注册
  2. 手动添加一个Node对象
{
  "kind": "Node",
  "apiVersion": "v1",
  "metadata": {
    "name": "10.240.79.157",
    "labels": {
      "name": "my-first-k8s-node"
    }
  }
}

如上,kubernetes会检查kubelet向ApiServer注册节点时使用的机器名称和metadata.name是否匹配。

6.1.2节点自注册

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xTkWx1i6-1692342747981)(img_7.png)]

  • –register-node为true(默认),会尝试向API服务注册自己,kubelet会使用到下列启动参数
  • –kubeconfig - 用于向 API 服务器执行身份认证所用的凭据的路径。
  • –cloud-provider - 与某云驱动 进行通信以读取与自身相关的元数据的方式。
  • –register-node - 自动向 API 服务注册。
  • –register-with-taints - 使用所给的污点列表 (逗号分隔的 =:)注册节点。当 register-node 为 false 时无效。
  • –node-ip - 可选的以英文逗号隔开的节点 IP 地址列表。你只能为每个地址簇指定一个地址。 例如在单协议栈 IPv4 集群中,需要将此值设置为 kubelet 应使用的节点 IPv4 地址。 参阅配置 IPv4/IPv6 双协议栈了解运行双协议栈集群的详情。
    如果你未提供这个参数,kubelet 将使用节点默认的 IPv4 地址(如果有); 如果节点没有 IPv4 地址,则 kubelet 使用节点的默认 IPv6 地址。
  • –node-labels - 在集群中注册节点时要添加的标签。 (参见 NodeRestriction 准入控制插件所实施的标签限制)。
  • –node-status-update-frequency - 指定 kubelet 向 API 服务器发送其节点状态的频率。

6.1.3手动注册

通过创建node资源来注册节点,设置 --register-node=false
设置节点不可调度kubectl cordon $NODENAME

6.1.4节点状态

kubectl describe node <节点名称>

Name:               master
Roles:              control-plane,master,worker
Labels:             beta.kubernetes.io/arch=amd64
                    beta.kubernetes.io/os=linux
                    kubernetes.io/arch=amd64
                    kubernetes.io/hostname=master
                    kubernetes.io/os=linux
                    node-role.kubernetes.io/control-plane=
                    node-role.kubernetes.io/master=
                    node-role.kubernetes.io/worker=
                    node.kubernetes.io/exclude-from-external-load-balancers=
Annotations:        flannel.alpha.coreos.com/backend-data: {"VtepMAC":"b2:52:2e:bf:44:0b"}
                    flannel.alpha.coreos.com/backend-type: vxlan
                    flannel.alpha.coreos.com/kube-subnet-manager: true
                    flannel.alpha.coreos.com/public-ip: 192.168.17.142
                    kubeadm.alpha.kubernetes.io/cri-socket: /var/run/dockershim.sock
                    node.alpha.kubernetes.io/ttl: 0
                    volumes.kubernetes.io/controller-managed-attach-detach: true
CreationTimestamp:  Thu, 10 Aug 2023 11:08:54 +0800
Taints:             <none>
Unschedulable:      false
Lease:
  HolderIdentity:  master
  AcquireTime:     <unset>
  RenewTime:       Mon, 14 Aug 2023 16:04:42 +0800
Conditions:
  Type                 Status  LastHeartbeatTime                 LastTransitionTime                Reason                       Message
  ----                 ------  -----------------                 ------------------                ------                       -------
  NetworkUnavailable   False   Mon, 14 Aug 2023 08:41:44 +0800   Mon, 14 Aug 2023 08:41:44 +0800   FlannelIsUp                  Flannel is running on this node
  MemoryPressure       False   Mon, 14 Aug 2023 16:03:36 +0800   Thu, 10 Aug 2023 11:08:50 +0800   KubeletHasSufficientMemory   kubelet has sufficient memory available
  DiskPressure         False   Mon, 14 Aug 2023 16:03:36 +0800   Thu, 10 Aug 2023 11:08:50 +0800   KubeletHasNoDiskPressure     kubelet has no disk pressure
  PIDPressure          False   Mon, 14 Aug 2023 16:03:36 +0800   Thu, 10 Aug 2023 11:08:50 +0800   KubeletHasSufficientPID      kubelet has sufficient PID available
  Ready                True    Mon, 14 Aug 2023 16:03:36 +0800   Thu, 10 Aug 2023 11:09:29 +0800   KubeletReady                 kubelet is posting ready status
Addresses: 
  InternalIP:  192.168.17.142
  Hostname:    master
Capacity:
  cpu:                4
  ephemeral-storage:  36805060Ki
  hugepages-1Gi:      0
  hugepages-2Mi:      0
  memory:             3787572Ki
  pods:               110
Allocatable:
  cpu:                3600m
  ephemeral-storage:  36805060Ki
  hugepages-1Gi:      0
  hugepages-2Mi:      0
  memory:             3160262039
  pods:               110
System Info:
  Machine ID:                 fbb16f83aacf40b2ab5f226ee2c1d15e
  System UUID:                D7AC4D56-70F6-B5A3-4B8A-B79C075CD2DE
  Boot ID:                    db6e1853-ba54-475c-bfea-a314befd7578
  Kernel Version:             3.10.0-1160.el7.x86_64
  OS Image:                   CentOS Linux 7 (Core)
  Operating System:           linux
  Architecture:               amd64
  Container Runtime Version:  docker://20.10.7
  Kubelet Version:            v1.21.5
  Kube-Proxy Version:         v1.21.5
PodCIDR:                      10.233.64.0/24
PodCIDRs:                     10.233.64.0/24
Non-terminated Pods:          (12 in total)
  Namespace                   Name                                       CPU Requests  CPU Limits  Memory Requests  Memory Limits  Age
  ---------                   ----                                       ------------  ----------  ---------------  -------------  ---
  default                     nfs-client-provisioner-7477547dd4-skz68    0 (0%)        0 (0%)      0 (0%)           0 (0%)         51m
  default                     nginx                                      0 (0%)        0 (0%)      0 (0%)           0 (0%)         3d22h
  default                     nginx-test-549bf74497-4mgzv                0 (0%)        0 (0%)      0 (0%)           0 (0%)         3d22h
  default                     nginx-test-549bf74497-h9vkb                0 (0%)        0 (0%)      0 (0%)           0 (0%)         3d1h
  kube-system                 coredns-659897cbc4-jjm5g                   100m (2%)     0 (0%)      70Mi (2%)        170Mi (5%)     4d4h
  kube-system                 coredns-659897cbc4-kvj28                   100m (2%)     0 (0%)      70Mi (2%)        170Mi (5%)     4d4h
  kube-system                 kube-apiserver-master                      250m (6%)     0 (0%)      0 (0%)           0 (0%)         4d4h
  kube-system                 kube-controller-manager-master             200m (5%)     0 (0%)      0 (0%)           0 (0%)         4d4h
  kube-system                 kube-flannel-ds-tbfgq                      100m (2%)     100m (2%)   50Mi (1%)        50Mi (1%)      4d4h
  kube-system                 kube-proxy-v7nr4                           0 (0%)        0 (0%)      0 (0%)           0 (0%)         4d4h
  kube-system                 kube-scheduler-master                      100m (2%)     0 (0%)      0 (0%)           0 (0%)         4d4h
  kube-system                 nodelocaldns-jfkt4                         100m (2%)     0 (0%)      70Mi (2%)        170Mi (5%)     4d4h
Allocated resources:
  (Total limits may be over 100 percent, i.e., overcommitted.)
  Resource           Requests    Limits
  --------           --------    ------
  cpu                950m (26%)  100m (2%)
  memory             260Mi (8%)  560Mi (18%)
  ephemeral-storage  0 (0%)      0 (0%)
  hugepages-1Gi      0 (0%)      0 (0%)
  hugepages-2Mi      0 (0%)      0 (0%)
Events:              <none>
6.1.4.1地址
Addresses: 
  InternalIP:  192.168.17.142
  Hostname:    master
  • HostName: 节点名称,从节点内核获取的,可以通过kubelet的–host-override覆盖
  • InternalIP: 仅可在集群内部路由的IP地址
  • ExternalIP: 节点可外部路由(从集群外可访问的)IP地址
6.1.4.2状况conditions字段描述所有Running节点的状况
Conditions:
  Type                 Status  LastHeartbeatTime                 LastTransitionTime                Reason                       Message
  ----                 ------  -----------------                 ------------------                ------                       -------
  NetworkUnavailable   False   Mon, 14 Aug 2023 08:41:44 +0800   Mon, 14 Aug 2023 08:41:44 +0800   FlannelIsUp                  Flannel is running on this node
  MemoryPressure       False   Mon, 14 Aug 2023 16:03:36 +0800   Thu, 10 Aug 2023 11:08:50 +0800   KubeletHasSufficientMemory   kubelet has sufficient memory available
  DiskPressure         False   Mon, 14 Aug 2023 16:03:36 +0800   Thu, 10 Aug 2023 11:08:50 +0800   KubeletHasNoDiskPressure     kubelet has no disk pressure
  PIDPressure          False   Mon, 14 Aug 2023 16:03:36 +0800   Thu, 10 Aug 2023 11:08:50 +0800   KubeletHasSufficientPID      kubelet has sufficient PID available
  Ready                True    Mon, 14 Aug 2023 16:03:36 +0800   Thu, 10 Aug 2023 11:09:29 +0800   KubeletReady  
  • Ready:true节点健康;false节点不健康;unknown节点控制器最近检测(默认40s)没有接收到节点消息
  • DiskPressure:true节点磁盘不足;false磁盘充足
  • MemoryPressure:true内存压力;fals内存充足
  • PIDPressure:true进程压力;false进程充足
  • NetworkUnavaliable:true节点配置不正确;false配置正确

如果describe 已保护(Cordoned)的node,有可能是SchedulingDisabled代表不可调度

当节点出现问题时,kube-controller-manager会自动给加上一个污点,例如node.kubernetes.io/unreachable node.kubernetes.io/not-ready

6.1.4.3容量Capacity和可分配Allocatable

Capacity:
  cpu:                4
  ephemeral-storage:  36805060Ki
  hugepages-1Gi:      0
  hugepages-2Mi:      0
  memory:             3787572Ki
  pods:               110
Allocatable:
  cpu:                3600m
  ephemeral-storage:  36805060Ki
  hugepages-1Gi:      0
  hugepages-2Mi:      0
  memory:             3160262039
  pods:               110

描述CPU、内存、pod数量上限。
capacity总容量
allocatable供普通pod小号的资源量

6.1.4.4信息Info
System Info:
  Machine ID:                 fbb16f83aacf40b2ab5f226ee2c1d15e
  System UUID:                D7AC4D56-70F6-B5A3-4B8A-B79C075CD2DE
  Boot ID:                    db6e1853-ba54-475c-bfea-a314befd7578
  Kernel Version:             3.10.0-1160.el7.x86_64
  OS Image:                   CentOS Linux 7 (Core)
  Operating System:           linux
  Architecture:               amd64
  Container Runtime Version:  docker://20.10.7
  Kubelet Version:            v1.21.5
  Kube-Proxy Version:         v1.21.5

节点的一般信息,内核版本、k8s版本、运行时详细信息、操作系统等。由kubelet收集,发布到kubernetes API

6.1.5 心跳

确定节点可用性,两种形式

  • 更新节点的 .status 。
    kubectl get nodes master -o yaml
  • kube-node-lease这个ns里的lease对象,每个节点都有一个。是一种轻量级资源
    kubectl get leases.coordination.k8s.io -n=kube-node-lease

由kubelet负责更新这两种资源

  • 节点状态改变、到达时间间隔—>kubelet更新.status。默认五分钟,通过–node-monitor-period配置
  • kubelet每10秒更新lease对象,如果失败,kubelet会采用指数回退机制,从200毫秒开始重试,最长7秒

6.1.6 节点控制器

  1. 当节点注册时自动分配一个CIDR区段
  2. 保持节点控制器内节点列表和云服务商提供的机器列表同步
  3. 监控节点健康
    • 节点不可达,在node的.status修改Ready时,控制器更新Conditions里的Ready为Unknown
    • 节点仍然无法访问,对节点上所有pod触发API发起的驱逐操作。默认是在Unkonwn5分钟后进行驱逐
  4. 驱逐NoExecute污点所在节点上的pod,除非有容忍度
6.1.6.1 逐出速率限制

–node-eviction-rate逐出速率限制,单位为个/秒,默认0.1,表示10秒内最多从一个节点驱逐pod
某个节点不健康,节点控制器检查不健康节点(非Ready)的百分比

  • 不健康节点超过–unhealthy-zone-threshold(默认0.55),驱逐速率将降低
  • 集群较小,小于等于–large-cluster-size-threshold 个节点(默认为50),驱逐操作则停止
  • 否则驱逐速率降为每秒 --secondary-node-eviction-rate 个(默认为 0.01)。
6.1.6.2 资源容量跟踪

Node对象会追踪节点上资源的容量(例如可用内存和CPU数量)。手动添加node可能需要手动设置
kubernetes schedule保证节点上有足够的资源供pod使用

6.1.6.3 节点拓扑

如果启动了TopologyManager特性门控,kubelet可以在做出资源分配决策时使用拓扑提示

6.1.6.4 节点体面关闭
  • kubelet会尝试检测节点系统关闭事件终止在节点上运行的所有pod
  • 节点终止期间,kubelet保证pod遵循pod终止流程,且不接受新的pod(即使这些pod已经绑定到该节点)
  • 节点体面关闭依赖于systemd,利用systemd抑制器锁机制,在给定的期限内延迟节点关闭
  • 受GracefulNodeShutdown特性门控控制,在1.21版本默认启用
  • 默认shutdownGracePeriod(关闭的总持续时间)和shutdownGracePeriodCriticalPods(关键pod关闭的持续时间)设置为0,不会激活节点体面关闭的功能。
  • systemd检测或者通知node关闭—>kubelet在节点上设置NotReady–>kube-schedule不会将pod调度到这个节点—>新pod会被kubelet在PodAdmission阶段拒绝,同时终止本地运行的所有常规pod和关键pod(例如kube-controller-manager,kube-apiserver,kube-scheduler)

关键Pod
* 关键pod(例如kube-controller-manager,kube-apiserver,kube-scheduler)
* 要将 Pod 标记为关键性(critical),设置 Pod 的 priorityClassName 为 system-cluster-critical 或者 system-node-critical。 system-node-critical 是最高级别的可用性优先级,甚至比 system-cluster-critical 更高。

6.1.6.5 基于pod优先级的节点体面关闭

例如如下配置

优先级数值关闭期限
custom-class-a10000010s
custom-class-b10000180s
custom-class-c1000120s
regular/unset060s
shutdownGracePeriodByPodPriority:
  - priority: 100000
    shutdownGracePeriodSeconds: 10
  - priority: 10000
    shutdownGracePeriodSeconds: 180
  - priority: 1000
    shutdownGracePeriodSeconds: 120
  - priority: 0
    shutdownGracePeriodSeconds: 60

上面的表格表明,

  • 所有 priority 值大于等于 100000 的 Pod 会得到 10 秒钟期限停止
  • 所有 priority 值介于 10000 和 100000 之间的 Pod 会得到 180 秒钟期限停止
  • 所有 priority 值介于 1000 和 10000 之间的 Pod 会得到 120 秒钟期限停止
  • 所有其他 Pod 将获得 60 秒的时间停止。

注意需要启用GracefulNodeShutdownBasedOnPodPriority特性门控,并设置shutdownGracePeriodByPodPriority

6.1.6.5 节点非体面关闭

ShutdownGracePeriod 和 ShutdownGracePeriodCriticalPod配置不正确。kubelet关闭node时那个节点的kubelet可能已经被关闭,所以pod、pv什么的都删不掉,所以可能需要手动给这个节点打上污点。
kube-controller-manager的NodeOutOfServiceVolumeDetach特性门控启用后,节点打上污点—>节点 Pod 上没有设置对应的容忍度–> Pod 将被强制删除—>节点上被终止的Pod将立即进行卷分离操作

非体面关闭

  • 强制删除没有匹配的 out-of-service 容忍度的 Pod。
  • 立即对此类 Pod 执行分离卷操作。
6.1.6.6 交换内存管理

kubernetes 1.22后的功能,可以逐个节点地启用交换内存支持,必须启用kubelet的NodeSwap 特性门控,使用–fail-swap-on参数 或者failSwapOn配置为false
启用后,Kubernetes 数据可以被交换到磁盘

memorySwap:
  swapBehavior: LimitedSwap
  • LimitedSwap(默认):Kubernetes 工作负载的交换内存会受限制。 不受 Kubernetes 管理的节点上的工作负载仍然可以交换。
    • cgroupsv1: Kubernetes 工作负载可以使用内存和交换,上限为 Pod 的内存限制值(如果设置了的话)。
    • cgroupsv2: Kubernetes 工作负载不能使用交换内存。
  • UnlimitedSwap:Kubernetes 工作负载可以使用尽可能多的交换内存请求, 一直到达到系统限制为止。

6.2 节点与控制面之间的通信

控制面(主要是APIServer)和k8s集群之间的通信路径

6.2.1 节点到控制面

中心辐射型API模式,节点(主要是运行的pod)发出的API调用都终止于APIServer。APIServer被配置在一个安全的HTTPS端口(443)上远程监听连接请求,并启用了多种客户端身份验证机制
应使用服务的公共根证书开通节点,这样他们可以基于客户端凭据安全的连接APIServer,以客户端证书的形式将客户端凭据提供给kubelet
想要APIServer的pod使用服务账号安全的连接。pod实例化—>k8s自动把公共根证书和一个有效的持有者令牌注入到Pod。k8s服务配置了一个虚拟地址,用于(通过kube-proxy)转发请求到APIServer的HTTPS末端
控制面组件也通过安全端口和集群的APIServer通信
所以节点到控制面的连接是安全的

6.2.2 控制面到节点

APIServer—>kubelet
APIServer—>代理—>节点、pod、服务

6.2.2.1 APIServer到kubelet

一般用于

  • 获取Pod日志
  • 挂接(通过kubectl)到运行中的Pod
  • 提供kubelet端口转发功能
    连接到kubelet的HTTPS,默认情况下,APIServer不检查kubelet的服务证书,是不安全的,
    如果需要验证这个连接,需要使用–kubelet-certificate-authority给ApiServer提供
    一个根证书包,用于验证kubelet的服务证书。也可以在APIServer和kubelet使用SSH隧道
6.2.2.1 APIServer到节点、Pod、服务

默认为纯HTTP方式,没有认证也没有加密。可以通过给API URL中的节点、Pod或服务名称添加
前缀https:来运行在安全的HTTPS连接上。但是仍然不会验证证书,所以还是不是安全的。

6.2.3 SSH隧道(已废弃)

kubernetes支持使用SSH隧道保护从控制面到节点的通信。APIServer建立一个到集群中各节点的SSH隧道
(连接到在22端口监听的SSH服务器)通过这个隧道传输所有到kubelet、节点、pod的请求。可以保证通信不会
被暴露到集群节点所运行的网络之外

6.2.4 konnectivity服务

作为SSH隧道的替代方案,提供TCP层的代理,以便支持从控制面到集群的通信。
包括konnectivity服务器和konnectivity代理,分别运行在控制网络和节点网络中。
konnectivity代理建立并维持到konnectivity服务器的网络连接
启用knnoectivity服务后,所有控制面到节点的通信都通过这些连接传输

6.3 控制器

通过controller监控集群的公共状态,致力于将当前状态转变为期望状态

6.3.1 控制器模式

一个控制器至少追踪一种类型的k8s资源。其中spec代表期望状态,controller就负责确保当前状态接近期望状态。控制器会自动执行操作,
通过APIServer来控制
以Job控制器举例,Job-运行一个或多个pod,执行一个任务后停止。
当Job控制器拿到新任务时,保证一组Node节点上的kubelet可以运行正确数量的pod。job控制器不运行pod,而是通知API服务器来创建或移除Pod,控制面中的其他组件,根据新的消息做出反应

6.3.2 期望状态和当前状态

任务执行时,集群随时可能被修改,控制回路会自动修复故障

6.3.3 设计

k8s有很多控制器,每个控制器管理集群状态的一个特定方面。

6.3.4 运行控制器的方式

k8s内置的控制器,运行在kube-controller-manager里,提供了核心功能。还可以扩展控制器,运行自己的逻辑

6.4 租约(Lease)

分布式系统通常需要租约,租约提供一种机制来锁定共享资源并协调集合成员之间的活动。
在k8s中,租约概念表示为corrdination.k8s.io组的Lease对象。
常用于节点心跳组件级领导者选举等系统核心功能

[root@master ~]# kubectl get leases.coordination.k8s.io  -A
NAMESPACE         NAME                      HOLDER                                        AGE
kube-node-lease   master                    master                                        6d23h
kube-system       kube-controller-manager   master_e7ad1213-be24-47b7-9369-5be56761d870  6d23h
kube-system       kube-scheduler            master_5b8d5b4e-49ee-41b1-b83a-98211b8e3a76   6d23h

6.4.1 节点心跳

kubernetes使用Lease API将kubelet节点心跳传递到kubernetesAPI服务器。每个节点在kube-node-lease命名空间都有一个Lease对象。
每个kubelet心跳都是对改Lease对象的update请求,更新改Lease的spec.renewTime字段。kubernetes控制平面根据此字段的时间戳来判断节点是否可用

6.4.2 领导者选举

kubernetes 使用Lease确保在任何给定时间某个组件只有一个实例在运行。高可用配置中由kube-controller-manager和kube-scheduler等控制平面组件进行使用,保证这些组件应只有一个实例激活运行,其他实例待机

6.4.3 APIServer身份

在k8s 1.26版本开始,每个kube-apiserver都使用Lease API将身份发布到系统中的其他位置,,检查kube-system命名空间中的lease对象来查看kube-apiserver的租约
kube-apiserver中不再存续的已到期租约在到期1小时后被新的kube-apiserver作为垃圾收集
可以禁用APIServerIdentity特性门控来禁用API服务器身份租约

6.4.4 工作负载

你自己的工作负载可以定义自己的租约。你定义一个租约以便让控制器副本可以使用k8sAPI进行协调以选择或选举一个领导者

6.5 云控制器管理器

在公有云、私有云、混合云运行k8s,cloud-controller-manager是云控制管理器,将控制平面组件嵌入到云平台的控制逻辑。
他允许你及拿过你的集群连接到云提供商的API上,并将与该云平台交互的组件和你的集群交互的组件分离开。
cloud-controller-manager基于插件机制构造的,使得不同云厂商都能将其平台和k8s集成。

6.6 关于 cgroup v2

在linux上,cgroup约束分配给进程的资源。cgroup 是一个 Linux 内核特性,对一组进程的资源使用(CPU、内存、磁盘 I/O 和网络等)进行限制、审计和隔离。
两个cgroup版本:cgroup v1和 cgroup v2(新)。

kubelet和底层容器运行时都需要对接cgroup来强制执行为pod和容器管理资源,包括容器化工作配置CPU/内存请求和限制

6.6.1 cgroup v2

cgroup v2提供了一个具有增强资源管理能力的统一控制系统。
v2版本在cgroup v1进行了多项改进

  • API中单个统一的层次结构设计
  • 更安全的子树委派给容器
  • 更多的功能特性,例如压力阻塞信息
  • 跨多个资源的增强资源分配管理和隔离
    • 统一核算不同类型的内存分配(网络内存、内核内存等)
    • 考虑非即时资源变化,例如页面缓存回写

6.6.2 使用cgroup v2

要求

  • 使用默认启用cgroup v2的linux发行版
  • linux内核为5.8或更高版本
  • 容器云运行时支持cgroup v2
    • containerd v1.4+
    • cri-o v1.20+
  • kubelet和绒球内行驶配置为systemd cgroup驱动

6.6.3 查看Linux cgroup版本

stat -fc %T /sys/fs/cgroup/
输出cgroup2fs为v2,tmpfs为v1

6.7 容器运行时接口(CRI)

CRI是一个插件接口,使kubelet能够运行各种容器运行时,CRI定义了主要gRPC协议,是kubelet和容器运行时之间通信的主要协议

6.7.1 API

当通过gRPC连接到容器运行时,kubelet充当客户端。运行时和镜像服务端点必须在容器运行时中可用 使用–image-service-endpoint 配置。

6.7.2 升级

升级k8s时,kubelet会尝试在组件重启时自动选择最新的CRI版本,如果失败,那么回退。如果重拨失败,可能需要kubelet

6.8 垃圾收集

垃圾收集。GC(Garbage Collection) 用于清理集群资源的各种机制。清理如下资源

  • 终止的Pod
  • 已完成的job
  • 不再存在属主引用的对象
  • 未使用的容器和容器镜像
  • 动态制备、sc回收策略为delete的pv卷
  • 阻滞或过期的CertificateSigningRequest
  • 在以下情形中删除了节点对象
    • 当集群使用云控制器管理器运行与云端时
    • 当集群使用类似于云控制管理器的插件运行在本地环境中时
  • 节点租约对象

6.8.1 属主和依赖

属主引用代表 依赖对象依赖于属主对象,当属主对象删除时,依赖对象对应的被回收,例如deployment和replicateset,replicateset和pod
命名空间资源不允许出现跨命名空间的属主引用。如果某个资源是集群作用域的,那么他的属主资源也得是集群作用域的,否则将会无法解析,不进行垃圾回收

6.8.2 级联删除

当你删除某个对象时,你可以控制k8s自动删除该对象的依赖对象

  • 前台级联删除
    当你删除属主对象,首先进入deletion in progress状态—>kubernetes API Server将某对象的metadata.deletionTimestamp字段设置为删除时间
    —>APIServer将metadata.finalizer设置为foregroundDeletion—>(此时还能看到该资源)---->controller-manager删除其依赖对象—>删除属主对象—>(此时看不到该资源了)
  • 后台级联删除
    删除属主对象—>(看不到资源了)—>后台继续清理依赖对象

6.8.3 未使用的容器和镜像的垃圾收集

kubelet每五分钟会对未使用的镜像进行垃圾收集,每分钟对未使用的容器执行一次垃圾收集KubeletConfiguration可进行垃圾收集的配置

k8s通过镜像管理器管理所有镜像的生命周期,是kubelet的一部分,工作时和cadvisor协同。在作出垃圾收集决定时会考虑如下磁盘用量约束

6.8.3.1 镜像清理
  • HighThreshodPercent 磁盘使用比例上限
  • LowThreshodPercent 磁盘清理比例下限
    当磁盘超过HighThreshodPercent会触发垃圾收集,按照上次被使用的时间按顺序清理,优先清理最近未使用的镜像,清理直到磁盘用量到达LowThreshodPercent为止
6.8.3.2 容器清理

kubelet基于如下变量进行垃圾收集

  • MinAge:kubelet可以垃圾回收某个容器时该容器的最小年龄。设置为0表示禁用此规则
  • MaxPerPodContainer:每个Pod可以包含已死亡的容器个数上线。小于0表示禁用
  • MaxContainers:集群存在已死亡的容器个数上线。设置0表示禁用此规则

此外,kubelet还会按时间顺序清除无标识的、已删除的容器。(只清理由kubelet管理的容器)
在集群中使用级联删除https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/use-cascading-deletion

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫失格

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值