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
问题
「如果这篇文章对你有用,请随意打赏」
如果这篇文章对你有用,请随意打赏
使用微信扫描二维码完成支付