文章
K8s 1.28 Planternetes 详解
Kubernetes 1.28 Planternetes 详解
概述
v1.28「Planternetes」于 2023-08-15 发布,代号取「花园」之意,寓意社区精心呵护、协作成长。本版本含 45 项增强(GA 12 / Beta 14 / Alpha 19),最大亮点是控制平面与节点版本偏差扩大到 n-3,以及 Sidecar 容器、ValidatingAdmissionPolicies 进入 Beta 等调度与准入控制的重要进展。
发布基本信息
| 项目 | 内容 |
|---|
| 发布日期 | 2023-08-15 |
| 代号 | Planternetes |
| 开发周期 | 14 周(2023-05-15 ~ 2023-08-15) |
| 增强总数 | 45(GA 12 / Beta 14 / Alpha 19) |
| Release Lead | Grace Nguyen |
| 贡献 | 911 家公司、1440 名个人 |
主要新特性解读
🟢 GA(稳定)特性
1. 非优雅节点关机恢复(Non-graceful Node Shutdown)
- 解决问题:节点意外断电/硬死机后,Pod 卡在 Terminating、VolumeAttachment 无法分离,StatefulSet 无法在别处重启。
- 实现机制:通过外部触发(
kubectl drain 或标记节点)强制清理卡住的 Pod 与卷挂载,释放 PV 供新节点接管。
- 用法:参考
node-shutdown/#non-graceful-node-shutdown,对有状态工作负载做故障演练时验证。
- 相关概念:VolumeAttachment、
force-delete、StatefulSet 故障转移、Pod graceful shutdown。
2. 默认 StorageClass 追溯分配
- 解决问题:早期未指定
storageClassName 的 PVC 不会自动绑定默认 SC。
- 新行为:现在自动且始终生效,对历史已存在的 PVC 也会补上默认 SC。
- 影响:升级后存量 PVC 可能突然被绑定,需检查是否有「故意不绑」的 PVC。
- 相关概念:StorageClass、PVC binding、provisioner。
3. Kubelet PodResources API GA
- 意义:设备插件、监控代理可稳定依赖该端点获取 Pod 的 CPU/设备分配信息。
- 相关概念:Device Plugin、NUMA、Topology Manager、
kubectl get --raw /podresources。
4. 其他 GA:kubectl events、Proxy Terminating Endpoints、扩展 DNS 配置、IPTables 链所有权清理、Auth API(获取自身用户属性)等。
🟡 Beta 特性
1. ValidatingAdmissionPolicies(CEL 准入)
- 解读:用 CEL 表达式在 API Server 进程内做准入校验,替代部分 Validating Webhook,免去部署 webhook 服务、降低延迟与运维复杂度。
- 用法示例:
apiVersion: admissionregistration.k8s.io/v1beta1
kind: ValidatingAdmissionPolicy
metadata:
name: require-labels
spec:
matchConstraints:
resourceRules:
- apiGroups: [""]
apiVersions: ["v1"]
operations: ["CREATE", "UPDATE"]
resources: ["pods"]
validations:
- expression: "has(object.metadata.labels) && 'app' in object.metadata.labels"
message: "Pod 必须包含 app 标签"
- 相关概念:CEL(Common Expression Language)、ValidatingWebhookConfiguration、admission chain。
2. Admission Webhook Match Conditions(默认启用)
- 解读:webhook 配置新增
matchConditions(CEL),仅当条件为真才转发请求,大幅减少无效 webhook 调用。
- 注意:默认启用,升级即生效,可能改变现有 webhook 调用频率。
- 相关概念:webhook 失败策略
Fail/Ignore、namespaceSelector、objectSelector。
3. CRD 验证规则(CEL)
- 解读:CRD schema 中直接写 CEL 校验,新增
reason 和 fieldPath 字段标注失败原因与路径。
- 相关概念:OpenAPI v3 schema、admission webhook 替代、
x-kubernetes-validations。
4. Linux Swap 支持
- 解读:可控地为节点启用 swap,便于性能调优与噪声邻居缓解。面向节点管理员与应用开发者两类用户。
- 注意:默认不开启节点 swap,需 kubelet 配置
--fail-swap-on=false 并设置 swap 行为。
- 相关概念:cgroup v1/v2、memory.swap、QoS 类、
NodeSwap feature gate。
🔴 Alpha 特性
1. Sidecar 容器(KEP-753,里程碑起点)
- 解读:init 容器新增
restartPolicy: Always,作为 sidecar。kubelet 不再等 sidecar 完成即启动主容器;主容器退出后 sidecar 被终止;sidecar 失败即使 Pod restartPolicy: Never 也会重启。
- 演进:此为 Alpha 起点,v1.33 GA。彻底取代 hack 式 sidecar 注入。
- 相关概念:init container、Pod 生命周期、Istio/Linkerd sidecar 注入。
2. Job Pod 替换策略 & 按索引退避
- 解读:Indexed Job 支持等旧 Pod 完全终止再建新 Pod(解决 TensorFlow/JAX 名称冲突);每个索引独立 backoffLimit,部分索引失败不影响其他索引。
- 相关概念:Indexed Job、
completionMode: Indexed、ML 训练作业、embarrassingly parallel。
3. 混合版本代理(Mixed Version Proxy)
- 解读:API Server 聚合层在本地无法识别请求时,透明代理到兼容版本的 API Server,对客户端隐藏升级期间的版本差异。
- 相关概念:API aggregation、AA server、滚动升级、
APIService。
4. CDI 设备注入
- 解读:标准化复杂设备(多 /dev 节点)注入容器的机制,基于 CRI 1.27 的
CDIDevices 字段。
- 相关概念:CDI(Container Device Interface)、Device Plugin、GPU/加速器。
弃用与移除
| 类型 | 项目 | 说明 |
|---|
| 移除 | GCE PD CSI 迁移 | 完成迁移并移除 in-tree 代码 |
| 弃用 | Ceph RBD in-tree | 后续 v1.31 移除,迁移到 Ceph CSI |
| 弃用 | Ceph FS in-tree | 后续 v1.31 移除,迁移到 Ceph CSI |
重大变更与升级注意
⚠️ 版本偏差扩大到 n-3(最重要)
- 变更:节点(kubelet/kube-proxy)最早可比控制平面晚 3 个次版本。
- 影响:可每年只升级节点一次仍保持上游支持,利好长时间运行工作负载。
- 注意:仍支持更频繁升级;n-3 是下限不是推荐。
⚠️ Admission Webhook Match Conditions 默认启用
- 升级后即生效,评估现有 webhook 是否受 CEL 过滤影响。
⚠️ 默认 StorageClass 追溯分配
- 检查存量 PVC 是否有「故意不绑默认 SC」的情况。
⚠️ Ceph 存储迁移
- 使用 Ceph RBD/CephFS 的集群需规划 CSI 迁移(v1.31 将移除 in-tree)。
运维实践要点
- 利用 n-3 规划节点升级:可制定「每年一次节点滚动升级」策略,降低维护成本,但务必在支持窗口内。
- 引入 ValidatingAdmissionPolicies:将简单的标签/字段校验从 webhook 迁移到 CEL,降低延迟。可结合
kubectl validate 干跑。
- Sidecar 容器试点:v1.28 为 Alpha,生产建议等 Beta/GA(v1.33 GA)后采用,但可提前在测试环境验证日志/监控 sidecar 的生命周期行为。
- 有状态工作负载故障演练:基于非优雅关机恢复 GA,定期演练 StatefulSet 节点故障转移。
常见问题 / 坑点
| 问题 | 原因 | 解决方案 |
|---|
| 升级后部分 PVC 突然绑定 | 默认 SC 追溯分配 GA | 显式设置 storageClassName: "" 表示不绑 |
| Webhook 调用减少 | MatchConditions 默认启用 | 检查 matchConditions 是否误过滤 |
| Sidecar 容器不工作 | v1.28 为 Alpha,需启用 feature gate | SidecarContainers=true,且 kubelet/api-server 都需启用 |
关联知识
参考资源
状态: 📖 已掌握