首页
/ Kubernetes v1.5 版本演进全解:StatefulSet、CRI 与安全加固如何塑造现代集群

Kubernetes v1.5 版本演进全解:StatefulSet、CRI 与安全加固如何塑造现代集群

2026-09-04 20:16:46作者:晏闻田Solitary

本文以仓库中 CHANGELOG-1.5.md 为蓝本,完整梳理 Kubernetes v1.5.0 到 v1.5.8 共 9 个发布版本的演进脉络:从 StatefulSet 取代 PetSet 进入 beta、CRI v1alpha1 可插拔运行时接口落地,到匿名认证默认关闭、PodSecurityPolicy 授权漏洞修复等关键安全变更。读完本文,你将能够理解 v1.5 系列每个版本"改了什么、为什么改、升级前必须做什么",并掌握基于该变更日志做版本选型与升级检查的完整方法,同时结合当前仓库源码印证这些历史特性的实现现状。

一、v1.5 系列版本全景:一次"承上启下"的重大版本

v1.5 是 Kubernetes 1.x 早期最密集的一次功能迭代:正式版 v1.5.0 经过 2 个 alpha、3 个 beta 共 5 个预发布版本打磨,之后又陆续发布了 v1.5.1 至 v1.5.8 共 8 个补丁版本。变更日志按"每个发布版本一节"组织,每节固定包含四部分:

  1. Downloads:该版本全部二进制包的 sha256 校验和,按 Client / Server / Node 三类分组;
  2. Changelog since 上一版本:本版本相对上一版本的全部变更条目;
  3. Action Required(按需出现):升级前必须处理的事项;
  4. Known Issues(按需出现):该版本已知问题。

以 v1.5.0 正式版为例,其安装包命名与校验规则如下(每个版本均遵循同一命名模式:kubernetes.tar.gz 为全量包、kubernetes-src.tar.gz 为源码包;客户端包区分 darwin/linux/windows × 386/amd64/arm/arm64 等架构,服务端与节点包以 linux 为主并含 windows 节点包):

文件 说明
kubernetes.tar.gz 全量二进制(自 v1.5 起不再包含架构相关二进制,见后文"行为变化")
kubernetes-src.tar.gz 完整源码包
kubernetes-client-<os>-<arch>.tar.gz kubectl 等客户端工具
kubernetes-server-linux-<arch>.tar.gz kube-apiserver、kube-controller-manager、kube-scheduler
kubernetes-node-linux-<arch>.tar.gz / kubernetes-node-windows-amd64.tar.gz kubelet、kube-proxy 节点组件

每个条目都附带 sha256 哈希,例如 v1.5.0 正式版的 kubernetes.tar.gz 校验和为 52b7df98ea05fb3ebbababf1ccb7f6d4e6f4cad00b8d09350f270aa7e3ad7e85,下载后应逐一比对以保证二进制可信。v1.5.1 及以后版本均延续了"哈希表 + 变更清单"的格式,形成了一套可机器校验、可审计的发布记录体系。

二、Major Themes:v1.5.0 的四大主线

变更日志为 v1.5.0 单列了 "Major Themes" 小节,这是理解该版本定位的关键:

2.1 StatefulSet(ex-PetSet)进入 beta

有状态工作负载是 v1.5 的头号特性。PetSet 在 1.4 中以 alpha 出现,v1.5 中正式更名为 StatefulSet 并推进到 apps/v1beta1,同时修复了大量稳定性问题。它解决的核心问题是:Pod 拥有稳定的网络标识与持久存储绑定web-0web-1……),从而支撑数据库等有状态应用。

从当前仓库源码结构看,这一特性沉淀在 pkg/controller/statefulset/ 目录中,核心控制器 stateful_set.go 定义了 StatefulSetController,它通过 StatefulSetControlInterface 抽象出 Pod 管理能力,并用 podIndexer 按 ControllerRef UID 索引 Pod、用 workqueue 处理同步任务——这正是当年 alpha 版本迭代后"修复与稳定化"的成果形态。变更日志还记录了配套行为:kubectl drain 增加对 StatefulSet 的支持,并改用 eviction 子资源而非直接删除(前提是服务器支持)。

2.2 Federation 能力增强与 kubefed 工具

v1.5.0 的 Federation(跨集群联邦)主线包括:

  • 新命令行工具 kubefed,简化联邦控制面部署;
  • 联邦资源范围扩展到 Deployments、DaemonSets、ConfigMaps(均为 alpha);
  • 支持 DeleteOptions.OrphanDependents,即级联删除语义——设置为 false 时删除联邦资源会同时删除所有注册集群中的对应资源;
  • 联邦控制面组件 federation-apiserverfederation-controller-manager 并入 hyperkube 二进制,不再单独发布镜像。

值得注意的已知问题:Federation alpha 特性没有定义 feature gate,默认全部开启(对应 issue #38593),且联邦控制面升级路径在本版本中未被测试覆盖——这是使用该功能时必须评估的风险点。

2.3 简化的集群部署与高可用 Master

  • kubeadm(alpha)大幅改进 UX,一条命令引导集群;
  • 通过 cluster/kube-up.sh / kube-down.sh 脚本支持在 GCE 上创建/删除多 Master 高可用集群(alpha)。仓库中的 cluster/kube-up.shcluster/kube-down.sh 正是这套流程的入口;v1.5.6 中还修复了 kube-up(gce/gci 与 gce/coreos provider)在认证 token 文件已存在时不刷新 token、导致升级/降级失败的问题。

2.4 节点健壮性与可扩展性

  • Windows Server 2016 节点支持(alpha),可调度 Windows 容器;
  • CRI v1alpha1:可插拔容器运行时接口首次引入,附带实验性的 docker-CRI 集成;
  • kubelet API 支持认证与授权(beta),此前 kubelet 端口对节点通信几乎不设防。

三、Features 清单:按 SIG 分组的完整特性表

变更日志将 v1.5.0 特性按 Special Interest Group 归类,以下是完整继承的清单(括号内为成熟度等级):

SIG 特性 等级
API Machinery kube-apiserver 的 OpenAPI spec 支持从 alpha 转 beta,首个非 Go 客户端基于它实现 beta
Apps ReplicaSet 创建 Pod 失败时通过 API 报告底层原因 stable
Apps kubectl apply --prune 可删除不再需要的资源 stable
Apps 无法推进滚动的 Deployment 通过 API 表明被阻塞 beta
Apps StatefulSet 进入 beta beta
Apps 不再对无响应节点强制删除 Pod,CLI 强制删除时给出警告 beta
Auth RBAC alpha API 打磨并内置一组默认 cluster roles alpha
Auth kubelet API 支持认证/授权 beta
AWS 节点 Role 显示在 kubectl get nodes stable
Cluster Lifecycle kubeadm 易用性改进 alpha
Cluster Ops GCE 上通过 kube-up/kube-down 创建/删除多 Master 高可用集群 alpha
Federation ConfigMaps / DaemonSets / Deployments 联邦支持、级联删除、kubefed 工具 alpha
Network Service 可通过 DNS 名引用另一个 Service(不再要求 Service 托管在 Pod 上) stable
Network NodePort / LoadBalancer Service 可选保留源 IP beta
Network DNS 水平自动扩缩容支持 beta ConfigMap 参数 stable
Node 运行时启用 userns 重映射时可保留宿主 userns 访问 alpha
Node CRI v1alpha1 + 实验性 docker-CRI 集成 alpha
Node kubelet 按 QoS 等级为容器创建 per-pod cgroup 层级 alpha
Node kubelet 集成 memcg 通知 API 检测硬驱逐阈值 beta
Node 容器化节点一致性测试 node-test:0.2 beta
Scheduling 不透明整型资源(Opaque Integer Resources)核算 alpha
Scheduling PodDisruptionBudget 转 beta,可安全排水节点 beta
UI Dashboard 展示全部面向用户的对象及资源用量 stable
Windows Windows Server 2016 节点与 Windows 容器调度 alpha

四、安全主线:两个必须知道的关键变更

4.1 v1.5.1:匿名认证默认值收紧

v1.5.0 引入了 --anonymous-auth 标志(默认 true):未被其他认证方式拒绝的请求会被视为匿名用户 system:anonymous,归入 system:unauthenticated 组;同时所有认证成功的用户会被加上 system:authenticated 组。

这直接催生了 v1.5.1 的紧急变更(变更日志原文用大写 MUST 强调):

  • kube-apiserver 必须设置 --anonymous-auth=false,否则可能允许未授权用户访问 apiserver;
  • federation apiserver 同理;
  • kubelet 无需调整——1.4 中 kubelet API 本就没有授权;
  • v1.5.1 还修复了一个联动崩溃:开启 audit log 且禁用匿名认证时,未认证请求会触发 panic 导致 kube-apiserver 崩溃;
  • 已知问题:hack/local-up-cluster.sh 因等待 apiserver 响应超时失败,临时绕过方案是在脚本中给 hyperkube apiserver 追加 --anonymous-auth=true

当前仓库源码仍可印证这套用户组语义:staging/src/k8s.io/apiserver/pkg/authentication/user/user.go 中定义了 AllUnauthenticated = "system:unauthenticated"AllAuthenticated = "system:authenticated" 常量,且 API 配置类型注释明确写道"If present --anonymous-auth must not be set",说明 1.5 时代确立的认证模型延续到了今天。

4.2 v1.5.5:PodSecurityPolicy 授权漏洞专项修复

v1.5.5 是一个"安全专项版本",除该修复外没有任何其他变更。变更日志完整记录了漏洞细节与缓解流程,值得作为安全响应范例:

受影响范围(必须同时满足三条):Kubernetes 1.5.0–1.5.4 安装,且

--runtime-config=extensions/v1beta1/podsecuritypolicy=true   # 默认不启用
--admission-control=...,PodSecurityPolicy,...               # 默认不启用

并且使用授权机制限制用户使用特定 PSP 对象。

影响:有创建 Pod 权限的用户可以套用任何已存在的 PodSecurityPolicy,即使没有该策略的使用授权。

升级前缓解步骤

# 1. 导出所有 PSP
kubectl get podsecuritypolicies -o yaml > psp.yaml

# 2. 审查并删除不希望普通建 Pod 用户使用的 PSP
#    (注意:原本依赖这些策略的特权用户也会失去访问)
kubectl delete podsecuritypolicies/my-privileged-policy

# 3. 升级到 1.5.5 之后重新创建
kubectl create -f psp.yaml

v1.5.6 中"PodSecurityPolicy 授权被 admission 插件正确强制执行"的条目(PR #43489)则是该修复在后续版本中的巩固。

4.3 补丁版本中的其他安全动作

  • v1.5.4:GCE ContainerVM 升级到 container-vm-v20170214 以修复 CVE-2016-9962;支持通过环境变量 ENABLE_APISERVER_BASIC_AUDIT=true 在 GCE 上开启 kube-apiserver 基础审计日志,写入 /var/log/kube-apiserver-audit.log 并复用 kube-apiserver.log 的 logrotate 配置;
  • v1.5.6:alpine 系组件镜像(cluster-proportional-autoscaler、dnsmasq-metrics、etcd-empty-dir-cleanup、kube-addon-manager、kube-dnsmasq)修补 CVE-2016-8859;
  • v1.5.8:fluentd-gcp 等 4 个 addon 刷新基础镜像,覆盖 CVE-2017-1000366 等 7 个 CVE;dnsmasq 更新至最新版。

五、Notable Changes to Existing Behavior:行为变化逐项解读

v1.5.0 章节单列了"对既有行为的显著变更",这些是升级评估中最容易踩坑的部分:

5.1 Node controller 不再强制删除 Pod

  • 对 StatefulSet:旧 Pod 只有在其确定不再运行(kubelet 从分区中恢复、Node 对象被删除、云 provider 中实例被删除、或用户手动强制删除)后,才会创建替换 Pod——用"围栏(fencing)"思路防止有状态集群脑裂;
  • 对其他内置控制器:无影响(它们用 generate-name,不复用 Pod 名);
  • 自研控制器若复用 Pod 名,必须评估此变化
  • 配套 CLI 变化:kubectl delete --grace-period=0 现在只发起优雅删除并等待;要立即从 API 删除必须再加 --force。变更日志明确说明动机:防止用户无意中让两个同名 StatefulSet Pod 同时挂载同一持久卷,导致数据损坏。

5.2 kubectl get -o jsonpath 语义收紧

路径指向 JSON 中不存在的字段时,现在会报错,而不是像 1.4 之前那样返回类型默认值。

5.3 VolumeMounts 的 patchMergeKey 变更

strategic merge patch 中 VolumeMounts 的合并键由 name 改为 mountPath——因为同一卷挂载多次时 name 相同并不唯一,而 mountPath 经校验唯一,可作合并键。依赖旧的 apply/patch 语义的脚本需要回归测试。

六、Deprecations 与 Action Required Before Upgrading

6.1 弃用清单

  • extensions/v1beta1.Job 弃用,改用 batch/v1.Job
  • kubelet --reconcile-cdir 弃用(已无实际作用);
  • recycler 弃用声明
  • init-container 注解(pod.beta.kubernetes.io/init-containers)不再接受大写字段名,会直接报错——Go 代码应改用 pkg/api/v1 的版本化类型做序列化。

6.2 升级前必做事项(完整清单)

  1. --anonymous-auth=false:kube-apiserver 与 federation apiserver 必须显式设置(安全红线,见第四节);
  2. ScheduledJob 更名 CronJobbatch/v2alpha1.ScheduledJobbatch/v2alpha1.CronJob,存量资源需要转换;
  3. PetSet 迁移 StatefulSet:已有 PetSet 必须在升级前后各执行一次迁移步骤(转换 group/version),不能直接原地升级;
  4. Federation 组件:从 1.4.x 升级需按新版本更新 federation-apiserverfederation-controller-manager 清单;
  5. --configure-cbr0 已移除:连同 "classic" 网络模式一起删除,需评估 kubenet 或 CNI;
  6. client-go 仓库化:新客户端结构,版本策略随 kubernetes/client-go;
  7. kube-scheduler 参数更名--bind-pods-qps / --bind-pods-burst 删除,改用 --kube-api-qps / --kube-api-burst
  8. PodDisruptionBudget 前置清理:1.4 中创建的 policy/v1alpha1/PodDisruptionBudget 对象必须在升级前删除——升级后既无法删除它们,又会阻断 1.5 的 policy/v1beta1 版本使用;若已升级只能降级 master 到 1.4 清理。

七、Known Issues 与外部依赖版本基线

7.1 v1.5.0 已知问题

  • CRI 已知问题与限制清单(详见变更日志引用条目);
  • getDeviceNameFromMount() 在卷路径含空格时不能正确返回卷路径(#37712);
  • Federation alpha 特性无 feature gate、默认开启(#38593);
  • Federation 控制面升级路径未在本版本测试(#38537)。

7.2 外部依赖版本信息

变更日志给出 CI 构建使用的依赖版本基线,并明确提示"这不是强推荐,选型请查阅对应安装/升级指南":

依赖 版本基线 备注
Docker 1.10.3 – 1.12.3 1.11.2 存在 Aufs 内核崩溃、fd 泄漏、内存开销三个已知问题;1.12.1 与 1.12.3 通过官方验证框架验证;1.10.3 含 RedHat 提供的安全回移补丁
rkt 1.21.0 运行时已知问题清单见 rkt 文档
etcd 2.2.1 2.3.x 亦被 CI 使用;3.0.14 同样通过验证,但需要额外的迁移配置步骤

这一节在实践中的价值:当排查节点级问题时,可先对照该基线判断运行时版本是否落在"已知有坑"的区间内。

八、补丁版本要点速览(v1.5.1 – v1.5.8)

除安全主线外,各补丁版本还包含一批影响面可观的修复与增强,择要汇总:

v1.5.1anonymous-auth 默认值收紧;audit + 匿名认证关闭时的 panic 修复;已知 local-up-cluster.sh 超时问题。

v1.5.2

  • kubernetes.tar.gz 不再包含 client/server 二进制,cluster/kube-{up,down,push}.sh 在缺失时自动下载已发布二进制(仓库中 cluster/get-kube-binaries.sh 即该机制的实现);
  • 关键 Pod 加固:kubelet 允许关键 Pod 准入、给 kube-proxy 等关键 Pod 设置 oom_score_adj=-998、静态 Pod 不参与驱逐;
  • 新增 kubelet 镜像缓存;HPA 除零 panic 修复;
  • kube-controller-manager 提供控制卷 attach/detach 协调器同步周期(可调、可关)的参数。

v1.5.3(变更最多的一版):

  • attach_detach_controller 默认同步周期改为 1 分钟,降低云 provider 查询频率;
  • kube-up 增加可配置的 etcd initial-cluster-state
  • ExperimentalCriticalPodAnnotation gate 开启后,带 scheduler.alpha.kubernetes.io/critical-pod 注解的 Pod 在资源压力下仍被准入、不被驱逐并受 OOM 保护;
  • PodDisruptionBudget 的 minAvailable 百分比在 StatefulSet Pod 上不生效的问题修复;
  • SubjectAccessReview 将 subresource 与资源名传递给 authorizer;
  • kubelet 设置 hairpin 失败时不再对机器上所有接口设置 hairpin;
  • 大量 AWS / Azure / vSphere 云 provider 修复(设备分配器、区域识别 ca-central-1 与 eu-west-2、Azure 磁盘附加加速等)。

v1.5.4:AWS 设备分配器只用合法设备名;GCE 基础审计日志开关(ENABLE_APISERVER_BASIC_AUDIT=true);ContainerVM 升级修 CVE-2016-9962;list-resources 在 grep 无匹配时不再失败。

v1.5.5:纯安全修复版(PSP 授权漏洞,详见 4.2 节)。

v1.5.6:kube-up token 文件刷新修复;alpine 镜像补 CVE-2016-8859;PSP admission 插件授权强制执行;--etcd-prefix--storage-backend=etcd3 组合时的归一化恢复;rescheduler 换用 busybox 基础镜像;GLBC 升至 0.9.2。

v1.5.7:kube-apiserver 丢弃旧版 Windows kubectl 发送的多余 path 信息;kube-proxy 健康检查在同一次更新中"删一个端口 + 加另一个端口"的处理修复;专用 service account key 下 service account 损坏的修复(#44285);fluentd-gcp 升级至 1.28.3(ubuntu-slim:0.8 基础);NodePort 逻辑极性修复防止端口泄漏;Go 升级至 1.7.5。

v1.5.8(系列收尾):dnsmasq 升级;GCP e2e 记录集群 OS 镜像;4 个 addon 基础镜像安全刷新;GLBC 升至 0.9.5,修复从 1.6.4 之前升级到 1.6.4/1.6.5 时手工修改过的 GCLB 健康检查配置丢失的问题;Go 升级至 1.7.6。

九、从变更日志到源码:如何在当前仓库中验证这些特性

v1.5 的诸多特性在当前仓库中都能找到对应实现,可作为进一步深挖的入口:

十、版本选型与升级检查清单

综合以上变更,若你正在评估基于 v1.5 系列运行集群(或对照历史版本做兼容性分析),建议按以下清单逐项确认:

  1. 认证配置:kube-apiserver 与 federation apiserver 均显式 --anonymous-auth=false;RBAC 授权模式已启用而非 AlwaysAllow;
  2. PSP 场景:若启用了 PodSecurityPolicy API 与 admission 插件,必须升级到 ≥ v1.5.5,并按 4.2 节流程处理存量策略对象;
  3. 有状态负载:PetSet 全部完成向 StatefulSet 的两阶段迁移;自研控制器复用 Pod 名的,评估 Node controller 不再强删 Pod 的影响;
  4. 删除语义:运维脚本中所有 --grace-period=0 的强制删除调用补充 --force;jsonpath 输出脚本按"缺失字段即报错"的新语义回归;
  5. apply/patch 语义:VolumeMounts 合并键变更涉及 apply 流程的,重跑 diff 校验;
  6. PDB:从 1.4 升级前删除全部 policy/v1alpha1 的 PDB 对象;
  7. 运行时基线:Docker 落在 1.10.3–1.12.3 且避开 1.11.2 的已知问题;etcd 2.2.1(或完成 3.x 迁移配置);
  8. 网络模式:确认已从 classic(cbr0)迁移到 kubenet 或 CNI;
  9. 补丁级别:v1.5.8 是 1.5 系列最后一个版本,涵盖全部安全修复(CVE-2017-1000366 等)与 GCLB 升级丢配置修复,同系列内应选最高版。

需要说明的是:v1.5 属于 Kubernetes 极早期的历史版本,当前仓库主干(见 go.modpkg/features/ 中的 feature gate 定义)已演进到远高版本,本文所述 flag(如 --admission-control--runtime-config)与 API 版本(policy/v1beta1/PodDisruptionBudgetapps/v1beta1/StatefulSet)在后续版本中已有更名或 GA,实际部署请以对应年代的版本文档为准。

登录后查看全文
热门项目推荐
相关项目推荐