跳转至

近两年功能增加最多!Kubernetes 1.27 正式发布

k8s 1.27 release

太平洋时间 2023 年 4 月 11 日,Kubernetes 1.27 正式发布。此版本距离上版本发布时隔 4 个月,是 2023 年的第一个版本。

新版本中 release 团队跟踪了 60 个 enhancements,比之前版本都要多得多。 其中 13 个功能升级为稳定版,29 个已有功能进行优化升级为 Beta,另有 18 个 Alpha 级别的功能, 大多数为全新功能。本版本包含了很多重要功能以及用户体验优化 ,本文会在下一小节进行部分重要功能的详细介绍。

重要功能

镜像仓库从 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 需要指定配置文件才能启用,并且必须指定接收端。

APIServerTracing

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 测试任务已经添加。 之所以默认关闭该功能,是因为社区认为该功能还需要补充以下验证:压力测试、恢复测试和带退避逻辑的重试。

  1. 压力测试需要在单个 Pod 中创建大量容器以生成 CRI 事件,并观察 latency 值是否超过 1 秒。
  2. 恢复测试则是为了验证 Kubelet 在重新启动后能否正确地更新容器状态。
  3. 而带退避逻辑的重试则是为了解决 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,可以更好地展示提示信息。在之前版本中,只支持固定的失败信息。

x-kubernetes-validations:
- rule: "self.x <= self.maxLimit"
  messageExpression: '"x exceeded max limit of " + string(self.maxLimit)'

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。

# Fetch kubelet logs from a node named node-1.example that have the word "error"
kubectl get --raw "/api/v1/nodes/node-1.example/proxy/logs/?query=kubelet&pattern=error"

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 内容。

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 的多名研发工程师取得了不少成就。

  • wzshiming 主要维护的项目 KWOK (Kubernetes Without Kubelet) 成为社区热点,并在大规模集群模拟方面有效地节约资源,提升效率。
  • windsonsea 几乎包揽了近期官网博客的翻译,并成为 SIG-docs-zh 的维护者。
  • mengjiao-liu 也是 SIG-docs 的资深中英维护者。
  • kerthcet 在即将召开的 2023 年欧洲 KubeCon 上,将分享两个有趣的调度方向的主题,分别是 “Sig Scheduling Deep Dive” 和 “Building a Batch System for the Cloud with Kueue”(属于 Kubernetes Batch + HPC Day)。
  • pacoxu 将分享 “Kubeadm Deep Dive” 的主题。

其他需要了解的功能

APPS:

  • PodDisruptionBudget 之前不支持指定不健康 Pod 的处理方法,不健康 Pod 是指 Pod Running 但是状态不是 Ready。我们添加了一个新字段 unhealthyPodEvictionPolicy,允许用户指定这些不健康的 Pod 应该发生什么。该字段在 v1.27 中升级为 Beta。
  • "StatefulSetStartOrdinal" 功能升级为 Beta,默认允许在 StatefulSet 中配置起始序号。
  • CronJob 支持 Timezone 功能进阶至 GA。
  • StatefulSetStartOrdinal 特性门控进阶至 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 级别。

版本标志

本次发布的主题是 。Kubernetes 是 "Chill Vibes" 放松的氛围。

Chill Vibes

这个灵感来源于最近一次发布过程中,在功能冻结后没有出现任何异常情况,这是我们在多次发布中唯一的一次。 我们能够更加轻松地完成此版本的发布,原因在于幕后工作人员为改善发布管理付出了许多努力。 这也正是 本主题希望庆祝的内容:大家在为提升社区体验方面做出了很多努力。

特别感谢 Britnee Laverack 创造标志设计图案,并且她还设计了 Kubernetes 1.24: Stargazer 的标志设计图案。

升级注意事项

本节主要介绍 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 仍然支持。

历史版本

参考资料

评论