Kubernetes生态 之 Kubernetes 1.26 版本重要特性

Kubernetes 1.26 版本重要特性

Posted by Kubeservice博客 on Tuesday, January 24, 2023

Kubernetes 1.26 版本 release

https://mp.weixin.qq.com/s/USTYFj8Y-C4ztEt8s2mtfw Kubernetes v1.26 是 2022 年的最后一个大版本更新,包含了 37 项主要的更新。 其中包含了很多直接影响用户与 Kubernetes 交互相关的功能,比如:

  • 允许跨 namespace 持久化卷快照引用
  • 允许用户无需额外的 exporter 即可自定义 Service Level Indicator(SLI);
  • kubectl events 达到 Beta
  • 支持 Pod 所需资源就绪后再进行调度
  • 支持使用 OpenAPI v3

等等特性,也对高性能Pod绑定物理CPU运行等特性

允许使用 CEL 进行 Admission Control

Kubernetes v1.23 引入了 Common Expression Language (CEL) 进行 CRD Validation。该特性在 v1.25 达到 Beta 其功能类似于OPAgatekeeper

 apiVersion: admissionregistration.k8s.io/v1beta1                                                                                                   
 kind: ValidatingAdmissionPolicy
 metadata:
   name: "test-case"
 Spec:
   failurePolicy: Fail
   matchConstraints:
     resourceRules:
     - apiGroups:   ["apps"]
       apiVersions: ["v1"]
       operations:  ["CREATE", "UPDATE"]
       resources:   ["deployments"]
   validations:
     - expression: "object.spec.replicas <= 2"

这个特性中,可以认为这是一种对 Admission webhook 的替代,用一种更加原生,直观,并且声明式的方式来进行管理。

NUMA 中的拓扑管理

Kubernetes v1.21 kubelet 中新增了一个内存管理器。主要是为了应对多 NUMA 结构下的效率。

多 NUMA 结构下,为了保证效率,所以会按 内存CPU 的相对距离来按 node 定义是否为 local memory 或者说本地内存,同时由于实际位置不同,所以就可能会产生内存分配不均匀的情况。

[root@kcs-dongjiang-m-hcpk9 /]#  numactl -H
available: 2 nodes (0-1)
node 0 cpus: 0 1 2 3 4 5 6 7 8 9 20 21 22 23 24 25 26 27 28 29
node 0 size: 65186 MB
node 0 free: 9769 MB
node 1 cpus: 10 11 12 13 14 15 16 17 18 19 30 31 32 33 34 35 36 37 38 39
node 1 size: 65536 MB
node 1 free: 15206 MB
node distances:
node   0   1 
  0:  10  21 
  1:  21  10 

这台机器上就存在着比较明显的内存分配不均的情况。所以当某个进程达到了其 local memory 的上限,那自然就会影响到它的性能。

v1.26 中增加的则是 --topology-manager-policy-options 来控制整体的拓扑管理。现在仅支持一个 prefer-closest-numa-nodes=true 配置,当开启此配置的时候,拓扑管理器将尽量在单个 NUMA 或者尽可能少的 NUMA 节点中对齐资源。

这对于高性能负载是非常重要的一个优化。建议关注。

Pod 调度增加调度就绪 特性

Pod 的创建过程:

  1. go-client 通过 kube-apiserver 创建成功 Pod 资源;
  2. kube-scheduler 会去检查尚未被调度的 Pod,然后为其进行调度, 分配 Node;
  3. Node 获取到调度到该 Node 上的 Pod 然后进行创建;

Pod 创建成功后,其实就默认该 Pod 是可以被调度了,kube-scheduler 就应该开始工作了。

在实际的场景中,Pod 通常还会需要一些其他的资源,最典型的比如存储。在一些环境中,这些资源是需要预先进行创建. 一但前置的依赖无法满足,假如 kube-scheduler 已经完成了 Pod 的调度,那么 kubelet 侧就会处于尝试创建 Pod ,但失败的情况。

此特性 增加了一个 Pod 是否准备好被调度的机制。如果前置依赖不满足,那么 Pod 就无需被调度,这也不会消耗资源。kube-schedulerkubelet 都无需进行处理。待条件满足,Pod 再被调度和创建即可。

一个场景: image 预加载特性: 创建一些 Pod 资源以及准备好它的依赖,可以在 Node 上准备好镜像

移除 CRI v1alpha2 接口, 必须升级到 CRI v1

在移除了 dockershim 的支持后, 现在终于删掉了 CRI v1alpha2 的代码,这意味着之后所有实现了 CRI 的运行时,都必须实现 CRI v1 的接口。

目前 containerdCRI v1 接口已经实现了,所以在 Kubernetes v1.26 发布后,也可以放心的使用 containerd 作为其运行时。

如果你在使用此项目让 Docker 作为运行时,并且想要升级到 Kubernetes v1.26 的话,这是不行的。

减少 Kubelet 在 PLEG 中的 CPU 消耗

减少 Kubelet 在跟踪 Pod 状态 PLEG 时的 CPU 消耗。

它将减少 Kubelet 的一些定期轮询,而是尽可能的依赖于 CRI event通知

经过这个调整,也许在生产环境中遇到的 PLEG 问题能少一点

允许跨 namespace 持久化卷快照引用

Kubernetes 中,用户可以通过使用 VolumeSnapshot 特性,从卷快照创建新的持久化卷。这是非常有用的,比如说 DBA 可以在进行数据库大的变更/迁移操作前,对持久化卷做一次快照,如果出现异常,则可以直接从该快照恢复数据库之前的状态。

此功能只能用于 CSI 存储驱动,并且该功能是自 Kubernetes v1.17 达到 betav1.20 正式 GA

Kubernetes v1.26 中增加的特性是 CrossNamespaceVolumeDataSource 当前是 Alpha 阶段,允许创建持久化卷的时候,跨 namespace 引用卷快照。

比如想要做应用跨 namespace 迁移的时候,直接从另一个 namespace 对持久化卷做快照,然后使用快照创建 PVC 即可很轻松的完成迁移。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: testvolumeclaim
  namespace: a   # 这里
spec:
  storageClassName: mystorageclass
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi
  dataSourceRef:
    apiGroup: snapshot.storage.k8s.io
    kind: VolumeSnapshot
    name: testsnapshot
    namespace: b  # 这里
  volumeMode: Filesystem

很实用,就看稳定情况 和 各个CSI跟进情况了

其他

certificates.k8s.io/v1beta1 升级 到 certificates.k8s.io/v1

主要是影响 kubectl certificate 命令。

特殊字符进行了转义

解决特殊字符,在 kubectl logs/kubectl get events 上展示问题;

支持 readiness/liveness 添加中定义http header

通过 -feature-gates=ConsistentHTTPGetHandlers=false 进行全局禁用,避免这个功能影响到你的环境

性能提升:kube-controller-manage 添加 HPA 多goroutine队列

增加了 --concurrent-horizontal-pod-autoscaler-syncs 的参数,原先 HPA 中默认只有一个 worker,在大规模集群中处理效率很低。通过此参数来自行配置 worker 数量,以便于提升效率;

废除: GlusterFS plugin

优化: /etc/resolv.confsearch . 和 多行options xxx问题

「如果这篇文章对你有用,请随意打赏」

Kubeservice博客

如果这篇文章对你有用,请随意打赏

使用微信扫描二维码完成支付