Kubernetes 1.26 版本 release
部分来源: Kubernetes v1.26 新特性一览
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
其功能类似于OPA的gatekeeper
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 的创建过程:
- go-client 通过 kube-apiserver 创建成功 Pod 资源;
- kube-scheduler 会去检查尚未被调度的 Pod,然后为其进行调度, 分配 Node;
- Node 获取到调度到该 Node 上的 Pod 然后进行创建;
在 Pod 创建成功后,其实就默认该 Pod 是可以被调度了,kube-scheduler 就应该开始工作了。
在实际的场景中,Pod 通常还会需要一些其他的资源,最典型的比如存储。在一些环境中,这些资源是需要预先进行创建. 一但前置的依赖无法满足,假如 kube-scheduler 已经完成了 Pod 的调度,那么 kubelet 侧就会处于尝试创建 Pod ,但失败的情况。
此特性 增加了一个 Pod 是否准备好被调度的机制。如果前置依赖不满足,那么 Pod 就无需被调度,这也不会消耗资源。kube-scheduler 和 kubelet 都无需进行处理。待条件满足,Pod 再被调度和创建即可。
一个场景: image 预加载特性: 创建一些 Pod 资源以及准备好它的依赖,可以在 Node 上准备好镜像
移除 CRI v1alpha2 接口, 必须升级到 CRI v1
在移除了 dockershim 的支持后, 现在终于删掉了 CRI v1alpha2 的代码,这意味着之后所有实现了 CRI 的运行时,都必须实现 CRI v1 的接口。
目前 containerd 的 CRI 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 达到 beta,v1.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.conf 中 search . 和 多行options xxx问题
「如果这篇文章对你有用,请随意打赏」
如果这篇文章对你有用,请随意打赏
使用微信扫描二维码完成支付