近两年功能增加最多!Kubernetes 1.27 正式发布
太平洋时间 2023 年 4 月 11 日,Kubernetes 1.27 正式发布。此版本距离上版本发布时隔 4 个月,是 2023 年的第一个版本。
新版本中 release 团队跟踪了 60 个 enhancements,比之前版本都要多得多。其中 13 个功能升级为稳定版,29 个已有功能进行优化升级为 Beta,另有 18 个 Alpha 级别的功能,大多数为全新功能。本版本包含了很多重要功能以及用户体验优化,本文会在下一小节进行部分重要功能的详细介绍。
01 重要功能
镜像仓库切换 k8s.gcr.io 到 registry.gcr.io
自 Kubernetes 1.25 版本起,Kubernetes 容器镜像仓库域名已经从 k8s.gcr.io 更改为 registry.k8s.io。2023 年 3 月 20 日之后,k8s.gcr.io 将不再继续直接维护,而是被代理到 registry.k8s.io。
KEP-1847:StatefulSet PVC 自动删除功能特性 Beta
在 v1.23 中引入的 StatefulSetAutoDeletePVC 功能将在 1.27 版本中升级为 Beta,并默认开启。然而,默认开启并不意味着所有 StatefulSet 的 PVC 都将自动删除。
用户可以配置 whenDeleted 或 whenScaled 阶段以触发 Retain 或 Delete 行为。其中,Retain 是默认行为,只有配置了 Delete 策略的 StatefulSet 在被删除时才会触发对应的 PVC 删除动作。
KEP-3453:优化大型集群中 kube-proxy 的 iptables 模式性能
功能 MinimizeIPTablesRestore 在 1.26 版本中引入,并在 1.27 版本中升级为 Beta 并默认启用。该功能旨在改善大型集群中 kube-proxy 的 iptables 模式性能。
如果您遇到 Service 信息未正确同步到 iptables 的问题,您可以通过将 kube-proxy 启动参数设置为 --feature-gates=MinimizeIPTablesRestore=false 来禁用该功能(并向社区提交问题)。您还可以查看 kube-proxy 的 metrics 信息中的 sync_proxy_rules_iptables_partial_restore_failures_total 指标来监控规则同步失败的次数。
KEP-2831 和 KEP-647:APIServer 和 Kubelet 的 Tracing 功能 Beta
APIServerTracing 已升级为 Beta 状态,并默认启用。目前仅支持 kube-apiserver 和 etcd 组件的 Tracing,但未来会添加对 client-go 的支持。其他组件也将逐步添加 Tracing 能力。kube-apiserver 中的 Tracing 需要指定配置文件才能启用,并且必须指定接收端。
Kubelet 和容器运行时通过 CRI 调用的 Tracing 也已经默认开启。类似地, kubelet 的 KubeletTracing 功能已经默认开启,但是需要配置 Tracing 的接收端才能正常工作。
KEP-3077:上下文日志
上下文日志可以帮助用户理解日志的上下文信息,更好地让日志帮助用户排错和理解,提升日志的可观测性。 目前 kube-controller-manager 的迁移工作已经完成,kube-scheduler 的迁移工作将在 1.28 版本中完成。
KEP-1287:Pod 资源的纵向弹性伸缩
Kubernetes 现已支持原地调整 Pod 资源大小,容器组重建不再是必须的,这很大程度上缓解了横向弹性的冷启动等问题。
在之前的版本中,Pod API 不支持修改资源。也就是说,容器定义的资源限制和请求(如 CPU 和内存)是不可变的。在 1.25 版本中,CRI API 开始支持 Pod 资源限制的热更新。
在 Pod 的容器中添加了 resizePolicy 字段,以允许用户控制容器在资源变更时是否重启。
在容器状态中添加了 allocatedResources 字段,用于描述为 Pod 分配的节点资源。
在容器状态中添加了 resources 字段,用于报告应用于正在运行的容器的实际资源。
在 Pod 状态中添加了 resize 字段,用于描述请求调整 Pod 大小的状态。该字段可以是 Proposed(已提出),InProgress(进行中),Deferred(已延迟)或 Infeasible(不可行)。
KEP-3386:Kubelet 事件驱动 PLEG 升级为 Beta
在节点 Pod 较多的情况下,通过容器运行时的 Event 驱动 Pod 状态更新,能够有效地提升效率。在 1.27 中,该功能已经达到了 Beta 条件,基础的 E2E 测试任务已经添加。之所以默认关闭该功能,是因为社区认为该功能还需要补充以下验证:压力测试、恢复测试和带退避逻辑的重试。
压力测试需要在单个 Pod 中创建大量容器以生成 CRI 事件,并观察 latency 值是否超过 1 秒。
恢复测试则是为了验证 Kubelet 在重新启动后能否正确地更新容器状态。
而带退避逻辑的重试则是为了解决 CRI Runtime 宕机时 Kubelet 可能无法连接的问题。
KEP-3476:Volume Group 快照 Alpha(API)
能够在 Pod 的所有卷上同一时间快照,将成为容灾备份和故障恢复场景的重大技术突破。现在,您不必担心应用程序因备份的卷存在几秒钟差异而无法正确运行。此外,在安全研究方面,存储卷的组快照功能也将是一个重大变革。排查问题时,您的快照和 Pod 的状态是可对照的。需要注意的是该功能并非在 Kubernetes 仓库,VolumeGroupSnapshots API 的定义目前维护在 https://github.com/kubernetes-csi/external-snapshotter。
KEP-3838 和 KEP-3521:Pod 调度就绪态功能增强
调度就绪态功能 PodSchedulingReadiness,在 v1.26 作为 Alpha 功能引入,从 v1.27 开始该功能升级为 Beta,默认开启。
该功能在 Pod 对象中引入了 .spec.schedulingGates 字段,用来定义 Pod 是否允许开始调度。此功能最常见的一个场景是:批量调度,一组 Pod 需要等待集群资源满足整组 Pod 同时启动,才能开始调度。
针对受 SchedulingGate 限制悬停(Gated)状态的 Pod,为了让第三方控制器更灵活地控制这些 Pod 的最终调度策略,新版本中允许 Gated Pod 的 NodeAffinity 和 NodeSelector 可以被修改,但仅允许缩小节点范围。缩小范围是指支持添加新策略,不能删除或者修改已有策略。
KEP-3243:Deployment 滚动更新过程中的调度优化
PodTopologySpread 调度策略之前只关注标签的键,而不关注标签的值,因此在滚动更新 Deployment 时,调度无法区分新旧实例,进而导致可能新实例调度不均匀。例如,滚动更新的最后一组 4 个旧 Pod 都在同一个节点,那么新 Pod 调度为了更加均匀分布,大概率会调度到其他节点;滚动最后删除这一组旧 Pod 后,有可能一个节点没有调度该 Deployment。
在 v1.27 中,PodTopologySpread 调度策略可以区分调度 Pod 标签的值(这里通常指 Pod 的 pod-template-hash 标签,不同 replica set 对应的 Pod 该标签的值不同),这样滚动更新后,新的 Pod 实例会被调度得更加均匀。
KEP-2876:使用通用表达式语言(CEL)来验证 CRD
CustomResourceValidationExpressions 在 v1.25 中就已经升级为 Beta。验证规则使用通用表达式语言(CEL)来验证定制资源的值。在 v1.27 中,ValidationRule 新增了字段 messageExpression,可以更好地展示提示信息。在之前版本中,只支持固定的失败信息。
KEP-2258:节点日志查询
v1.27 添加了 NodeLogQuery 特性门控 (Feature Gate),为集群管理员提供了使用 kubectl 流式查看节点日志的功能,无需登录节点。该功能目前是 Alpha,需要配置 kubelet 开启特性门控,同时还需要设置 enableSystemLogHandler 和 enableSystemLogQuery 为 true。在 Linux 上,我们假设系统服务日志可以通过 journald 获得。在 Windows 上,我们假设系统服务日志可以在应用程序日志提供程序中获得。在这两个操作系统中,还可以通过读取 /var/log/ 目录下的文件来获取日志。此功能对 Windows 的支持也在逐步完善,目前使用 Get-WinEvent 来获取系统和应用程序日志。
不仅如此,目前节点日志获取功能还支持了一些参数。其中 query 表示服务名,可指定 kubelet、containerd 等。patern 通过提供的 PERL 兼容正则表达式过滤日志条目。此外支持的参数还有 sinceTime、untilTime、tailLines、boot。
KEP-3659:kubectl apply –prune 重新设计
--prune 在 v1.5 就作为 Alpha 功能引入,提供了自动清理 apply yaml 删除的部分对象,但是这个过程有些性能问题和缺陷,在一些情况下会造成对象泄漏。常见原因包括 allowlist (之前叫 whitelist)GVK 内容和 apply 内容不匹配,或者命名空间变化。命名空间操作变化的案例,比如第一次 apply 操作了命名空间 A 和 B;而第二次 apply 如果只 apply 命名空间 A 的资源,那么命名空间 B 的资源将不会被清理。
在 v1.27 中,kubectl 对 apply --prune 的功能进行了重新的设计,增加了 --applyset 配合使用,目前该功能仍然是 Alpha 级别,因此需要配置 KUBECTL_APPLYSET 环境变量为 1 或者 true,才能启用。在 kubectl apply 时,kubectl 会给对象添加 applyset.kubernetes.io/part-of 标签,在清理时会使用该标签。而为了满足更复杂的场景,还引入了 applyset.kubernetes.io/id 来标识 Parent 对象,以及 toolling、additional-namespaces 来帮助区分对象和增加命名空间信息等,更多详情请阅读 KEP 内容。
02 DaoCloud 参与功能
本次发布中, DaoCloud 重点贡献了 sig-node,sig-scheduling 和 kubeadm 相关内容,具体功能点如下:
[client-go] 修复尝试获取 leader lease 的等待时间的问题。
[调度] MinDomainsInPodTopologySpread 功能升级为 Beta。
[调度] 当任何调度程序插件在 PostFilter 中返回 unschedulableAndUnresolvable 状态时,该 Pod 的调度周期立即终止。
[日志] 迁移控制器使用 contextual logging。
[kubeadm] Kubeadm: 添加特性门控 EtcdLearnerMode,它允许将新增的控制节点的 etcd 作为学习者 Learner 加入,然后再升级为投票成员。
[节点] 如果 Pod 的 spec.terminationGracePeriodSeconds 属性值是负数,则会被修改为 1 秒的 terminationGracePeriodSeconds。
[节点] 添加了一个可以限制节点进行并行镜像下载数量的新功能。
[节点] 改进目前 Memory QoS 功能,优化了其在 cgroup v2 场景的适配性。
[节点] Kubelet:将 “--container-runtime-endpoint” 和 “--image-service-endpoint” 迁移到 kubelet 配置中。
[节点] Kubelet 默认允许 Pod 使用 net.ipv4.ip_local_reserved_ports sysctl,要求内核版本 3.16+。
[CLI] kubectl.kubernetes.io/default-container 标签正式 GA,主要用于 kubectl 的 logs、exec 等命令来决定默认容器。
在 v1.27 发布过程中,DaoCloud 参与上百个问题修复和功能研发,作为作者约有 90 个提交,详情请见贡献列表(该版本的两百多位贡献者中有来自 DaoCloud 的 15 位)。在 Kubernetes v1.27 的发布周期中,DaoCloud 的多名研发工程师取得了不少成就。其中,由张世明主要维护的项目 KWOK (Kubernetes Without Kubelet) 成为社区热点,并在大规模集群模拟方面有效地节约资源,提升效率。几位研发人员参与了 Kubernetes 官网的大量中文翻译工作,其中要海峰几乎包揽了近期官网博客的翻译,并成为 SIG-docs-zh 的维护者。此外,刘梦姣也是 SIG-docs 的维护者。在即将召开的 2023 年欧洲 KubeCon 上,殷纳将分享两个有趣的调度方向的主题,分别是 “Sig Scheduling Deep Dive” 和 “Building a Batch System for the Cloud with Kueue” (属于 Kubernetes Batch + HPC Day)。徐俊杰将分享 “Kubeadm Deep Dive” 的主题。
03 其他需要了解的功能
APPS:
PodDisruptionBudget 之前不支持指定不健康 Pod 的处理方法,不健康 Pod 是指 Pod Running 但是状态不是 Ready。我们添加了一个新字段 unhealthyPodEvictionPolicy,允许用户指定这些不健康的 Pod 应该发生什么。该字段在 v1.27 中升级为 Beta。
"StatefulSetStartOrdinal" 功能升级为 Beta,默认允许在 StatefulSet 中配置起始序号。
Cronjob 支持 Timezone 功能 GA。
Enable the "StatefulSetStartOrdinal" feature gate in Beta.
DownwardAPIHugePages kubelet 功能已稳定 GA。
Indexed Job 的 API 验证已放宽,允许通过同时更改 parallelism 和 completions 来扩展或者缩小 Indexed Job,但是需要保持 parallelism == completions 同步修改。
API:
基于 Kubernetes v1.25 提供的 KEP-2876 CRD 验证表达式语言,该功能增加一个新的资源 —— ValidatingAdmissionPolicy,允许在不使用 Validation Webhook 时实现字段验证。
在 1.27 中,Kubernetes 为聚合发现提供了 Beta 支持,通过 /api 和 /apis 发布集群支持的所有资源,而不是每个 Group 分别提供。
OpenAPIV3 功能 GA,允许 API 服务器发布 OpenAPI V3。社区建议使用 OpenAPI v3,v3 有诸多优势,其中包括 CustomResourceDefinition OpenAPI v3 验证模式的无损表示,而 OpenAPI v2 在 CRD validation 中做了有损转换。kubectl explain 也已经支持了 OpenAPI v3,但是需要配置环境变量 KUBECTL_EXPLAIN_OPENAPIV3 来启用。
将 SelfSubjectReview 提升为 Beta 级别。
Auth:
KMSv2 升级为 Beta,该功能在 1.27 中做了许多优化,比如:在插件 key ID 不变的情况下,重用 DEK 数据加密密钥,而当 Server 启动时,DEK 会重新随机生成。
添加了一个新的 Alpha API:ClusterTrustBundle(certificates.k8s.io/v1alpha1)。
AdmissionWebhookMatchConditions 功能已进入 Alpha:在 v1Beta 和 v1 API 中,为 ValidatingWebhookConfiguration 和 MutatingWebhookConfiguration 添加了 MatchConditions 字段。
将 LegacyServiceAccountTokenTracking 功能升级为 Beta,用于跟踪基于 Sercet 的 SA token 的使用情况。
CLI:
kubectl 的 --subresource 支持升级为 Beta,目前 subresource 只支持 status 和 scale。
改进 kubectl 插件解析以支持 non-shadowing 子命令。需要配置环境变量 KUBECTL_ENABLE_CMD_SHADOW=true 开启该功能,此时例如 kubectl create foo 执行会首先发现 create 没有 foo 子命令,kubectl 会自动尝试运行 kubectl-create-foo 插件。
网络:
当外部 cloud provider 支持提供双栈 IP 时,在 kubelet 中启用 CloudNodeIPs 功能,您就可以指定双栈的 --node-ip。该功能目前是 Alpha,需要手动开启。ValidatingAdmissionPolicy 添加了 matchConditions 字段,用来支持基于 CEL 的自定义匹配条件。该功能目前仍然是 Alpha 。
允许动态扩展可用于服务 Service 的 IP 数量。新增了 MultiCIDRServiceAllocator 功能,目前是 Alpha 级别。
新功能 ServiceNodePortStaticSubrange,以启用新的策略在 NodePort 服务端口分配器中,因此节点端口范围被细分,并且首选从上部分配动态分配的 NodePort 端口为服务。
添加了有关工作负载资源(Pod、ReplicaSets、Deployments、Jobs、CronJobs 或 ReplicationControllers)名称无效 DNS 标签的警告。
弹性:
HPAContainerMetrics 升级为 Beta,该功能允许 HorizontalPodAutoscaler 基于目标 Pod 中各容器 ContainerResource 类型的 metrics 来执行扩缩操作。
节点:
动态资源分配功能,使用功能 DynamicResourceAllocation。新增的 API 比 Kubernetes 现有的设备插件 Device Plugin 功能更加灵活。因为它允许 Pod 请求(声明)指定类型的资源,这些资源可以在节点级别、集群级别或任何其他用户自定义实现的模型中使用。
用户命名空间支持范围扩大,该功能仍然是 Alpha,但相比 v1.26 支持 StatefulSet。
GRPC 探针功能 GA。
Bump default API QPS limits for Kubelet.
Graduate Kubelet Topology Manager to GA.
提高 Kubelet 的默认 API QPS 限制,其中 kubeAPIQPS 和 kubeAPIBurst 都调大了 10 倍。
Kubelet 的拓扑管理器 Topology Manager 功能 GA。
seccomp profile 默认值升级至 GA 级别。
日志:
kube-proxy、kube-scheduler 和 kubelet 有 HTTP API,可以在运行时更改日志 Level。该功能也适用于 JSON 格式日志输出。
Metrics:
/metrics/slis 现在可用于控制平面组件,可以用来获取当前组件的健康检查指标。
Lease:
Kubernetes 组件选举现在仅支持使用 Lease。
调度:
调度器新增 Metric plugin_evaluation_total。该指标显示特定插件影响调度结果的次数。
调度框架在 Filter 和 Score 阶段可以利用 Skip 状态跳过该流程,以提升性能。在 PreFilter 阶段,如果 Plugin 返回 Skip 信息,那么在后续可以跳过执行该 Plugin 相应的 Filter 和 Score 阶段。
存储:
NewVolumeManagerReconstruction 功能升级为 Beta。这是 VolumeManager 的重构,允许 kubelet 在启动期间带上关于现有卷如何挂载的附加信息。
SELinuxMountReadWriteOncePod 功能升级为 Beta。该功能在卷挂载过程中使用正确的 SELinux 标签,相比逐个递归更改每个文件的方式,该功能加快了容器启动速度。
ReadWriteOncePod PV 访问模式功能升级为 Beta。此功能引入了一个新的 ReadWriteOncePod 访问模式,用于限制 PV 对单个节点上的单个 Pod 的访问。而 ReadWriteOnce 模式限制了单节点访问,但并不限制同一个节点的多个 Pod 同时访问。
CSINodeExpandSecret 功能升级为 Beta 级别。
04 版本标志
本次发布的主题是 。Kubernetes 是 "Chill Vibes" 放松的氛围。
这个灵感来源于最近一次发布过程中,在功能冻结后没有出现任何异常情况,这是我们在多次发布中唯一的一次。我们能够更加轻松地完成此版本的发布,原因在于幕后工作人员为改善发布管理付出了许多努力。这也正是本主题希望庆祝的内容:大家在为提升社区体验方面做出了很多努力。
特别感谢 Britnee Laverack 创造标志设计图案,并且她还设计了 Kubernetes 1.24: Stargazer 的标志设计图案。
05 升级注意事项
本节主要介绍 v1.27 中 API 变化,以及功能的移除以及废弃,废弃的功能通常会在 1-2 个版本之后移除。更多详情请查看 Kubernetes 在 v1.27 中移除的特性和主要变更。
Kubernetes 在 v1.27 中移除的特性和主要变更:https://kubernetes.io/zh-cn/blog/2023/03/17/upcoming-changes-in-kubernetes-v1-27/
其中需要重点关注的,IPv6DualStack 外部云供应商特性门控已被删除。(该功能在 1.23 版本中成为 GA,几个版本之前已删除所有其他组件的特性门控。)如果您仍然手动启用它,则必须立即停止。
k8s.gcr.io 重定向到 registry.k8s.io 相关说明
再次强调,Kubernetes 项目为了托管其容器镜像,使用社区拥有的一个名为 registry.k8s.io. 的镜像仓库。从 3 月 20 日起,所有来自过期 k8s.gcr.io 仓库的流量将被重定向到 registry.k8s.io。已弃用的 k8s.gcr.io 仓库未来最终将被关停。
其他需要注意的变化
CSIStorageCapacity 的 storage.k8s.io/v1beta1 API 版本在 v1.24 中已被弃用,将在 v1.27 中被移除。
移除 NetworkPolicyEndPort、LocalStorageCapacityIsolation、StatefulSetMinReadySeconds、IdentifyPodOS、DaemonSetUpdateSurge、EphemeralContainers、CSIInlineVolume、CSIMigration、ControllerManagerLeaderMigration 特性门控,这些特性大部分都是在 v1.25 之前的版本正式 GA。
kube-apiserver 移除了 --master-service-namespace 命令行参数。
kube-controller-manager 命令行参数 --enable-taint-manager 和 --pod-eviction-timeout 被移除。
kubelet 移除了命令行参数 --container-runtime,该参数目前只有一个可选值 "remote" 并在之前版本中废弃。
弃用了 Alpha 状态的 seccomp 注解 seccomp.security.Alpha.kubernetes.io/pod 和 container.seccomp.security.Alpha.kubernetes.io。
SecurityContextDeny 特性门控已经废弃,将在未来版本移除。
由于使用 golang 1.20.2 构建时遇到问题,Linux/arm 将不会在 Kubernetes 1.27 中发布。注意, arm64 仍然支持。
06 历史版本
Kubernetes 1.24 走向成熟的 Kubernetes
Kubernetes 1.22 颠覆你的想象:可启用 Swap,推出 PSP 替换方案,还有……
Kubernetes 1.21 震撼发布 | PSP 将被废除,BareMetal 得到增强
参考资料
[1] 官方 Changelog
https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.27.md
[2] Blog
https://kubernetes.io/zh-cn/blog/2023/03/17/upcoming-changes-in-kubernetes-v1-27/
[3] Kwok 官网
https://github.com/kubernetes-sigs/kwok/
[4] v1.27 Release 团队看板
https://github.com/orgs/kubernetes/projects/117/views/1
本文作者
徐俊杰 Paco
「DaoCloud 道客」架构师/ AD 团队 Leader
Kubernetes Kubeadm「SIG Cluster-Lifecycle」和 SIG Node, Reviewer
热门推荐
访问以下网址直接下载--新一代云原生操作系统底座--DCE 5.0 社区版:https://docs.daocloud.io/download/dce5/
任何组织、机构和个人,都能免费体验企业级云原生性
版权声明: 本文为 InfoQ 作者【Daocloud 道客】的原创文章。
原文链接:【http://xie.infoq.cn/article/861440589567caa21ac5c877e】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论