
Kubernetes 1.28已经正式发布,它将带来了以下增强功能,我们将对14个Beta和11个Stable进行简单介绍,还有19个Alpha,大家有兴趣的话,可以查看Kubernetes 1.28 Release Information | Kubernetes Contributors。现在,让我们深入了解它们。

一、最热门的内容
1. Sidecar 容器
自从Sidecar 模式开始被推广为一种有用的实践以来,已经有很多年了。现在它终于成为 Kubernetes 中的一等功能了。
Sidecar 是辅助容器,与workloads一起执行一系列任务。例如,提供指标、预取机密、实施服务网格等等。
在 Kubernetes 1.28 中,实现 sidecar 容器更容易、更可靠。因此,Kubernetes workloads将更加可靠,让开发人员、管理员和用户更加满意。
2. 优化Jobs
Kubernetes Jobs可以立即启动大量重复的并行任务,这对于机器学习workloads来说是理想的选择。我们可以看到 Kubernetes 如何成为该领域的重要参与者,这要归功于它们对作业等工具的不断改进。
我们已经讨论过Sidecar 容器,此功能为作业用户带来了一些惊喜,例如确保 sidecar 不会阻止作业完成。
同样,Kubernetes Jobs的改进不断出现,这表明(机器学习)社区对此功能有多大兴趣。
3. 滚动升级
这三项新的增强功能将使升级更加可靠,并减少停机时间。对于管理员来说,这绝对是一种实时改进的质量,对于他们来说,将应用程序置于维护模式是一个很大的恐惧。
滚动升级意味着并非所有相同的组件都会立即升级,而是一个一个地升级,从而保持新旧共存。在这种情况下,当流量发送到已关闭的 Kubernetes 组件时,它将被重定向到准备就绪的对等点。
最后,当Pod被终止以便为新版本留出空间时,它的所有连接也会被终止,这让用户很难受。通过这些增强功能,这些连接将不再受到干扰,从而可以让Pod优雅地终止。
Kubernetes 1.28 的维护不再那么可怕。
Kubernetes 项目继续努力与 Google 的基础设施解耦,Kubernetes 项目正在为 deb 和 yum 包提供社区拥有的存储库。
这绝对是成熟的标志,将使社区变得更强大,并推动更多的项目贡献者。
二、API改进
1. CRD 验证表达式
此增强功能在自定义资源的定义旁边添加了定义自定义资源验证规则的方法:
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
...
schema:
openAPIV3Schema:
type: object
properties:
spec:
x-kubernetes-validator:
- rule: "minReplicas <= maxReplicas"
message: "minReplicas cannot be larger than maxReplicas"
type: object
properties:
minReplicas:
type: integer
maxReplicas:
type: integer
现在无需 Webhooks 即可进行验证。更少的 webhook 使管理员更容易维护集群。
2. 用于准入控制的 CEL
在 CRD 验证表达式语言之上构建,我们可以使用新的通用表达式语言为 Kubernetes 准入控制器定义验证规则。
例如,定义一个策略,如果请求尝试创建具有超过 5 个副本的对象,该策略将会失败:
apiVersion: admissionregistration.k8s.io/v1alpha1
kind: ValidatingAdmissionPolicy
metadata:
name: "demo-policy.example.com"
spec:
failurePolicy: Fail
matchConstraints:
resourceRules:
- apiGroups: ["apps"]
apiVersions: ["v1"]
operations: ["CREATE", "UPDATE"]
resources: ["deployments"]
validations:
- expression: "object.spec.replicas <= 5"
然后在绑定上使用它,这样 Kubernetes 就会拒绝不通过此规则的请求。
apiVersion: admissionregistration.k8s.io/v1alpha1
kind: ValidatingAdmissionPolicyBinding
metadata:
name: "demo-binding-test.example.com"
spec:
policyName: "demo-policy.example.com"
validationActions: [Deny]
matchResources:
namespaceSelector:
matchLabels:
environment: test
3. 基于 CEL 的准入 Webhook 匹配条件
此增强功能增加了微调 Kubernetes 准入控制器 Webhook 应评估哪些请求的可能性。
我们可以在Webhook 的新字段上使用新的通用表达式语言定义过滤规则:matchConditions
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
webhooks:
…
matchConditions:
- name: 'exclude-kubelet-requests'
expression: '!("system:nodes" in request.userInfo.groups)'
如果存在多个条件,则请求必须通过所有这些条件才能由 Webhook 进行评估。
三、应用程序改进
1. 将作业创建时间戳添加到作业注释
控制器CronJob现在提供预计作业运行时的时间戳。
`batch.kubernetes.io/cronjob-scheduled-timestamp: "2016-05-19T03:00:00-07:00"`
2. 作业的可重试和不可重试
此增强功能允许您控制podFailurePolicy如何管理作业中 pod 的故障,并允许重试而不计入backoffLimit.
用下面的例子:
apiVersion: batch/v1
kind: Job
metadata:
name: job-pod-failure-policy-failjob
spec:
…
backoffLimit: 6
podFailurePolicy:
rules:
- action: FailJob
onExitCodes:
containerName: main
operator: In
values: [42]
对于这个特定的应用程序,如果作业退出并带有错误代码,42我们知道这是一个错误,并且该作业应该失败而不是被重新绑定(action: FailJob)。
在另一种情况下:
apiVersion: batch/v1
kind: Job
metadata:
name: job-pod-failure-policy-ignore
spec:
…
backoffLimit: 0
podFailurePolicy:
rules:
- action: Ignore
onPodConditions:
- type: DisruptionTarget
我们忽略 ( action: Ignore) pod 由于外部中断而失败的情况(即管理员耗尽节点并且 pod 被驱逐)。将Pod重试而不计算backoffLimit。
3. 为 StatefulSet 和索引作业添加 Pod 索引标签
启用此功能后,Job控制器StatefulSet将提供 Pod 索引作为标签:
- 对于jobs:batch.kubernetes.io/job-completion-index
- 对于stateful sets:apps.kubernetes.io/pod-index
四、完善授权
1. KMS v2 改进
此增强功能包括创建密钥管理服务 (KMS) v2 的工作,以解决 v1 的一些主要问题。
问题是:
- 性能:启动集群时,需要获取并解密所有资源以填充缓存kube-apiserver。这可能需要一些时间,并达到一些 API 速率限制,从而延迟集群启动。
- 密钥轮换:在 v1 中,这是手动(容易出错)过程。
- 健康检查和状态:在v1中,性能检查需要对KMS插件进行加密调用。
- 可观察性:缺乏跟踪 ID 使得跨日志的事件关联和调查变得困难。
V2 通过以下方式解决了这个问题:
- 实施了新的密钥层次结构以减少对远程保管库的网络请求。
- KMS 插件中的额外元数据允许kube-apiserver在不重新启动的情况下轮换密钥。
- KMS 插件可以使用新的状态 API 向 API 服务器提供运行状况信息。
- 和上有一个新UID字段可用。EncryptRequestDecryptRequest
2. 减少基于秘密的服务帐户令牌
从 Kubernetes 1.22 开始,Pod 的service account可以从TokenRequest API获取令牌,而不是自动生成令牌。
此增强功能包括减少旧式自动生成令牌的工作。
第一步(Kubernetes 1.24)禁用了服务帐户自动创建机密,并鼓励用户使用新的 API。
现在,Kubernetes 1.28 将清除这些帐户未使用的自动生成的令牌。默认情况下,令牌在一年后被视为未使用。
3. 用于获取自身用户属性的 Auth API【Stable】
此 API 提供有关身份验证的信息,无论用户还是ServiceAccount:
{
"apiVersion": "authentication.k8s.io/v1alpha1",
"kind": "SelfSubjectReview",
"status": {
"userInfo": {
"name": "jane.doe",
"uid": "b6c7cfd4-f166-11ec-8ea0-0242ac120002",
"groups": [
"viewers",
"editors",
"system:authenticated"
],
"extra": {
"provider_id": ["token.company.example"]
}
}
}
}
还可以使用 CLI 命令来获取此信息:
kubectl alpha auth whoami
这对于解决身份验证问题很有用。
五、命令行界面改进
1. Kubectl Events【Stable】
创建命令kubectl events是为了kubectl get events取代该命令的一些限制kubectl get。
列出事件与其他类型的对象有点不同。例如,您可能想要对–watch选项进行更多控制,或者您可能想要进行高级过滤。
六、使用仪表化
1. 扩展指标稳定性
我们可以检查此分类,并且知道如果有一个指标,stable则可以安全使用。然而,如果是的话alpha,你就知道它的定义可能会随着破坏事物的方式而改变。
此增强功能增加了两个新的稳定性级别:
- Internal:与功能不对应的低级指标,并且不能真正为管理员提供可操作的信息。
- Beta:比 更成熟alpha但尚未成熟的指标stable。
这些beta指标比指标提供了更高的安全性alpha,因为它们不会在不首先被弃用的情况下被删除。
它们还提供向前兼容性,这意味着您使用它们创建的警报和查询将来仍然有效。
七、网络优化
1. 保留 NodePort 范围以进行动态和静态分配
使用NodePort服务时,我们可能希望静态分配端口,手动定义要在service-node-port-range(默认30000-32767)内使用的端口。
但是,我们可能会发现端口已动态分配给另一个服务。
这项新功能保留了要静态分配的第一个端口service-node-port-range。
保留端口的数量由此公式定义min(max(16, nodeport-size / 32), 128),该公式返回 16 到 128 之间的数字。
例如,对于默认范围 ( 30000-32767),它返回86端口。该范围30000-30085将保留用于静态分配,其余范围用于动态分配。
2. 从 KCCM 的服务控制器中删除临时节点
此增强功能将改变从负载均衡器的节点中删除节点的方式。
目前,节点一旦被标记为终止,就会被删除,要么是因为它们受到污染ToBeDeletedByClusterAutoscaler,要么是当节点处于NotReady.
这会触发一系列事件,在某些情况下这是不希望的:
- 连接立即终止。
- 负载均衡器重新同步,这可能会导致过多的 API 调用,从而触发某些速率限制。
在两种情况下,这种行为是不需要的:
- 当一个节点暂时没有准备好时。
- 当节点终止时,我们希望连接能够优雅地结束。
对于这些情况,我们可以启用此功能。然后,在 API 服务器中完全删除节点之前,不会从负载均衡器的节点中删除节点。
3. 将 EndpointSlice Reconciler 移至暂存区【Stable】
此增强功能包括公开协调器逻辑的工作EndpointSlice,因此可以在自定义控制器中使用它Endpoint。
这意味着重构代码以将其移至pkg/controller/endpointslice单独的 Go 模块中staging/src/k8s.io/endpointslice。这个新模块将很容易导入到其他项目中。
4. 最小化 iptables-restore 输入大小【Stable】
此增强功能旨在iptables 模式下提高kube-proxy的性能。它将通过改变iptables-restore工作方式来实现这一目标。
现在,调用iptables-restore不需要包含未更改的规则。
5. 清理 iptables 链所有权【Stable】
Kubernetes 的一些组件(例如kubelet、kube-proxy)会为其内部使用iptables
这些并不适合第三方组件使用,但有时确实如此。
随着dockershim 的删除和其他代码清理,其中一些链不再需要并且正在被删除。
6. 扩展 DNS 配置【Stable】
此增强功能减少了 DNS 配置的一些限制。
特别是允许更多的 DNS 搜索路径和更长的 DNS 搜索路径列表。
- MaxDNSSearchPaths增加从6到32。
- MaxDNSSearchListChars增加从256到2048。
7、代理终止端点【Stable】
此增强功能改进了kube-proxy将流量发送到正在终止的Endpoints的方式。它优先考虑就绪但未终止的Endpoints,如果所有Endpoints都终止,则它优先考虑那些仍在Ready或Serving的Endpoints
这样做的目的是提高滚动更新等情况下的可靠性,在这种情况下,所有端点都可能在某个时刻终止。
八、节点
1. 改进了拓扑管理器中的Multi-Numa
当执行延迟成为问题时,我们需要了解workloads运行在哪些 CPU 核心上。
服务器往往具有多插槽系统,而现代 AMD CPU 由同一封装上的多个芯片组成。在这些系统中,这些核心不共享 L2 缓存,而是共享 L3 或 L4 缓存。这意味着,如果workloads从一个核心跳转到另一个核心,您也需要额外的时间来移动其上下文。
此增强功能使 Kubernetes 能够了解这些拓扑,因此它会尝试将工作负载放置在彼此更靠近的核心中。
在TopologyManager中,我们可以通过在prefer-closest-numa-nodes设置策略来启用
2. 节点内存交换支持
Kubernetes 对 Linux 节点上的交换的支持进入beta阶段。
要启用它,您需要:
- 禁用该failSwapOn设置。
- 启用NodeSwap。
- 定义swapBehavior.
---
apiVersion: "kubeadm.k8s.io/v1beta3"
kind: InitConfiguration
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
failSwapOn: false
featureGates:
NodeSwap: true
memorySwap:
swapBehavior: LimitedSwap
您可以选择两种不同的策略swapBehavior:
- UnlimitedSwap:默认选项。Kubernetes workloads可以根据需要使用尽可能多的交换内存(在系统限制内)。
- LimitedSwap:只有具有Burstable QoS 的Pod才能使用交换内存。
3. Kubelet 并行拉取镜像限制
默认情况下,kubelet是一个个的下载镜像。我们可以禁用kubelet配置serialize-image-pulls选项,以便可以并行下载镜像。
此增强功能增加了对镜像并行下载的控制。
我们可以设置maxParallelImagePulls选项来定义一个节点可以同时下载多少镜像。
默认情况下,此选项设置为0,这意味着没有限制。
4. 扩展 PodResources API 报告可分配资源【Stable】
用于获取节点上可分配计算资源信息的Endpoints。
gRPC Endpoints提供的信息GetAllocatableResources与 Pod 资源 API 端点提供的信息相结合,可以计算节点的容量。
5. 将 Kubelet PodResources Endpoints升级为 GA【Stable】
此增强功能包括使设备插件监控服务
它允许监控设备插件提供的资源、映射到哪些 pod 正在使用它们以及其他指标。
九、存储
1. 节点非正常关闭【Stable】
此增强功能允许 Kubernetes 集群准备关闭、优雅地终止 Pod、正确释放所有资源。
我们可以通过在节点上添加out-of-service污点来做到这一点:
kubectl taint nodes <node-name> node.kubernetes.io/out-of-service=nodeshutdown:NoExecute
在 Kubernetes 1.28 中,对此功能进行了一些小改进:
- force_delete_pods_total和指标force_delete_pod_errors_total现在考虑了所有强制 Pod 删除。此外,该指标还将包括 Pod 被删除的原因(终止、孤立、由于 终止out-of-service,或终止且未计划)。
- 它还attachdetach_controller_forced_detaches包含一个原因来了解分离是否是由out-of-service超时引起的。
请继续关注Kubernetes.io 博客,发布时间前后将发布一篇新文章,提供更多信息。
2. 追溯默认存储类分配【Stable】
目前,如果我们创建 PersistentVolumeClaim 而不指定storageClassName新 PVC。如果我们没有定义默认类,我们的 PVC 将保持未定义状态,我们可以稍后返回并更改此值。
此增强功能更改了此行为,以便当我们创建默认的StorageClass,它将应用于所有没有定义类的 PVC。
十、其他变更和弃用
已弃用且将停止工作的内容:
- 特点NetworkPolicyStatus。
- kubectl version现在返回kubectl version –short,–short标志被删除。
- 删除KUBECTL_EXPLAIN_OPENAPIV3.
已更改或已删除的内容还有替代方案:
- 指标: scheduler_scheduler_goroutines➜ scheduler_goroutines.
- azureFile 树内存储插件,请改用 CSI 驱动程序。
- node-role.kubernetes.io/master:–non-blocking-taints不再是默认值,需要时手动添加。
- k8s.io/kubernetes/pkg/kubelet/cri/streaming➜ k8s.io/kubelet/pkg/cri/streaming.
- KMSv1 ➜ 使用 KMSv2,或设置–feature-gates=KMSv1=true。
- 测试套件被新的表驱动的 e2e 测试取代: NetworkPolicyLegacy。 TestPerPodSchedulingMetrics。
- kube-scheduler:–lock-object-namespace和–lock-object-name➜–leader-elect-resource-namespace和–leader-elect-resource-name.
- pvc.Status: resizeStatus➜AllocatedResourceStatus
很快就会停止工作的东西,你需要开始计划更换:
- CephFS 树内卷插件:改用CephFS CSI 驱动程序。
- RBD 树内卷插件:改用RBD CSI 驱动程序。
- k8s.io/code-generator:generate_groups.sh和generate_internal_groups.sh➜ kube_codegen.sh。
- kube-controller-manager:–volume-host-cidr-denylist和–volume-host-allow-local-loopback标志。
- Kubelet:–azure-container-registry-config➜–image-credential-provider-config和–image-credential-provider-bin-dir。
- 对于自定义调度程序插件开发人员:在 中EnqueueExtension,EnqueueExtension 更改了一些返回值。
- 指标: apiserver_flowcontrol_request_concurrency_in_use➜ apiserver_flowcontrol_current_executing_seats. apiserver_storage_db_total_size_in_bytes➜ apiserver_storage_size_bytes metric.
可能想了解更多其他细微变化:
- 指标服务器撞到v0.6.3.
- 指标服务器指标分辨率现在为15s。
- Klog 文本输出现在使用 JSON 作为结构、映射和切片的编码。
- etcd 更新为3.5.9-0.
- cri-tools 更新为v1.27.0.
- distroless-iptables 撞到了0.2.6.
API版本变更:
- KubeScheduler配置:v1beta2➜ v1.
- 自我主题评论:v1beta1➜ v1。
- 验证录取政策:v1alpha1➜ v1beta1。
- ValidatingAdmissionPolicyBinding:v1alpha1➜ v1beta1。
来源:https://www.toutiao.com/article/7267805654831055417/