首页
/ Kubernetes v1.3 发布演进全解析:从 Changelog 看 Attach/Detach 控制器、驱逐机制与升级迁移路径

Kubernetes v1.3 发布演进全解析:从 Changelog 看 Attach/Detach 控制器、驱逐机制与升级迁移路径

2026-09-06 16:42:22作者:翟江哲Frasier

本文以 CHANGELOG-1.3.md 为主体,完整解读 Kubernetes v1.3 系列(v1.3.0 至 v1.3.10)的发布脉络:从 v1.3.0 的核心功能亮点、升级前的强制迁移步骤与已知问题,到各补丁版本的关键修复,并结合当前仓库源码印证 Attach/Detach 控制器、kubelet 驱逐机制等架构级变更的真实实现位置,帮助读者掌握 1.3 时代的升级决策要点与对应源码落点。

一、文档定位与版本全貌

Kubernetes 仓库将历史发布记录按次要版本归档在 CHANGELOG/ 目录下,CHANGELOG-1.3.md 即覆盖 v1.3 全生命周期的那份发布说明,共包含 17 个版本条目:

  • 正式版:v1.3.0、v1.3.1、v1.3.2、v1.3.3、v1.3.4、v1.3.5、v1.3.6、v1.3.7、v1.3.8、v1.3.9、v1.3.10
  • Beta 版:v1.3.0-beta.1、v1.3.0-beta.2、v1.3.0-beta.3
  • Alpha 版:v1.3.0-alpha.1 至 v1.3.0-alpha.5

每个版本条目遵循固定结构:Downloads(制品清单与校验值)、Changelog since 上一版本、Action Required(需要用户采取行动的不兼容变更,如 beta.1/beta.3/alpha.1~alpha.5 均设此节)、Other notable changes(其他显著变更),部分版本(v1.3.3、v1.3.0)还带 Known Issues 节。文档头部的自动生成的目录(<!-- BEGIN MUNGE: GENERATED_TOC --> 区块)列出了全部 17 个版本锚点,其中 v1.3.0 是唯一拥有完整 Highlights 与升级前置说明的版本条目。

二、v1.3.0 核心功能亮点(Highlights 全量继承)

发布说明将 v1.3.0 的亮点归纳为六大类,以下逐条保留其原始定位与成熟度标注:

授权与认证(Authorization / Security)

  • Alpha:RBAC 授权 API 组首次出现(1.3.0-alpha.5 中以 "Role Based Access Control" API alpha 版本落地,后续 beta.3 升级 federation 组版本时也与之联动);
  • Beta:PodSecurityPolicy 对象,用于限制 Pod 使用安全敏感特性(alpha.5 引入类型定义并附带可强制执行的准入控制器);
  • 安全基线:TLS 最低版本设定为 1.2(因 TLS1.0/1.1 存在已知漏洞,alpha.5 的 "Setting TLS1.2 minimum" 条目引入);
  • 新增 Webhook Token Authenticator(alpha.4 引入);
  • 权限收敛:L7 LB 控制器与磁盘 attach 控制器移至 master 运行,节点不再需要相应特权。

联邦(Federation)

  • federation API 组从 alpha 提升为 beta
  • 所有联邦集群中的 Service 统一注册到 Cloud DNS(AWS 与 GCP 两家提供方);
  • 相关控制器链在 alpha.5/beta.1 逐步成型:federation service controller 负责向所有注册集群同步 Service 并更新全局 DNS 记录(beta.3 又修复了 DNS 记录更新逻辑)。

有状态应用(Stateful Apps)

  • Alpha:PetSets 管理有状态应用(beta.3 阶段还优化了 PetSet 卷跨可用区创建);
  • Alpha:Init containers,在应用容器启动前按序执行一次性初始化任务,任一 init 容器失败会阻止应用启动(beta.2 的 Experimental Features 节对其有专门描述);
  • 配套实验特性:alpha.4 引入 JobTemplate、ScheduledJobs(batch/v2alpha1),为定时批处理铺路。

kubectl 与升级操作

  • kubectl rolling-update 对 Pod/RC 更新失败进行重试(beta.3);
  • kubectl drain 不再删除带本地存储的 Pod(beta.1);
  • 新增 kubectl rollout status 用于观察 Deployment 滚动状态(alpha.4 实现);
  • JSON 解析错误时显示行号(alpha.4);新增 -t 作为 --tty 的简写(alpha.4)。

资源与稳定性(Resources)

  • 节点内存压力下可选地驱逐 Pod 以提升稳定性(kubelet eviction,alpha.5 的 "Kubelet evicts pods when available memory falls below configured eviction thresholds" 条目引入);
  • Alpha:NVIDIA GPU 支持(kubelet 启用 --experimental-nvidia-gpus 后,可通过 alpha.kubernetes.io/nvidia-gpu 资源声明 GPU,alpha.4 条目落地);
  • loadBalancer 与 nodePort 类型 Service 纳入配额(quota)系统(alpha.3 分别落地)。

三、升级前必须执行的迁移步骤(Important Steps before Upgrading)

这是 v1.3.0 条目中最具操作价值的部分,发布说明原文明确给出了升级前置条件与命令序列。

Docker 运行时版本约束

支持的 Docker Engine 版本仅两个:v1.10 与 v1.11(发布说明分别引用了 issue #19720 与 #23397 作为兼容性依据)。v1.9 仍兼容但不推荐,更早版本一律不支持。

ThirdPartyResource 作用域迁移(强制步骤)

ThirdPartyResource 对象在 1.3 中从命名空间级(namespaced-scoped)改为集群级(cluster-scoped),且该改造在 alpha.4 的 Action Required 节中即被标注为不兼容变更("Make ThirdPartyResource a root scoped object")。官方给出的迁移三步法如下:

升级前,使用 1.2.x 客户端导出并删除现有对象:

kubectl get thirdpartyresource --all-namespaces -o yaml > tprs.yaml
kubectl delete -f tprs.yaml

升级到 v1.3.0 后,使用 1.3 的 server 与客户端在根作用域重新注册:

kubectl create -f tprs.yaml

kubectl 命令弃用

--container-port 标志被标记为弃用(alpha.4 的 "mark container-port flag as deprecated" 条目),后续版本将移除,应改用 --target-port

其他 Action Required 事项(按 beta/alpha 版本归集)

版本 需要行动的事项
beta.3 kubelet 默认自动检测云提供方,可用选项退出该行为;使用 cluster/saltbase/salt/kube-dns 下 kube-dns 清单时需替换 __PILLAR__FEDERATIONS__DOMAIN__MAP__ / pillar['federations_domain_map']--federations=myfederation=federation.test 形式(不支持联邦则删除);federation 组版本升至 v1beta1
beta.1 genericapiserver 修正 ExternalHost 生成逻辑;federation-controller-manager 改为通过 Secret 获取 federation-apiserver 的 kubeconfig
alpha.5 引入 NetworkUnavailable 节点条件(路由未建立前不向该节点调度);kube-controller-manager 内新增垃圾回收控制器与孤儿化 finalizer 逻辑;QoS 策略提升至 Pod 级别;NodeController 增加 CIDR 分配器
alpha.4 第三方资源开始做校验;kube-system 命名空间改为自动创建;--container-port 弃用;etcd3 存储后端相关标志
alpha.1 apiserver 默认关闭 swagger UI(需通过标志显式开启);恢复对接安全 etcd 的能力
alpha.5(kube-up 不兼容变更) 开启集群自动扩缩容(KUBE_ENABLE_NODE_AUTOSCALER=true)时必须同时设置 KUBE_AUTOSCALER_MIN_NODESKUBE_AUTOSCALER_MAX_NODES

四、v1.3.0 已知问题清单(Known Issues 全量继承)

发布说明按四个维度列出了官方已知问题,升级前需要逐条对照:

Kubernetes 核心

  • kube-proxy 因 Docker 缺陷偶发崩溃(issue #24000),重启 docker daemon 可解决;
  • CORS 仅在非安全模式下生效(issue #24086);
  • 压力下删除后的 PersistentVolumeClaim 有极小概率被错误重建(issue #26082)。

Docker 运行时

  • Debian Jessie 上 Aufs 存储驱动的 kernel crash(issue #27885),发布说明建议部署 node-problem-detector addon 自动发现此类内核问题——该 addon 恰好就是 v1.3.0-alpha.5 引入的 DaemonSet,以 NodeCondition 和 Event 形式上报节点问题,在 GCE 上默认启用;
  • docker v1.11 存在文件描述符泄漏(containerd issue #275)与每容器额外内存开销(docker issue #21737);
  • v1.10 存在 RedHat 识别的一组上游修复项。

Rkt 运行时

  • 已知问题清单指向发布说明外链的 rkt notes 文档(rkt 在 1.3 时代仍是可选运行时,网络 CNI 层面 alpha.5 修复了为 rkt 拉起 lo 接口的问题)。

五、云提供方专属说明(Provider-specific Notes)

v1.3.0 对各云的适配改进原文如下,均按文档原意继承:

  • AWS:支持 ap-northeast-2(首尔)区域;ECR 支持跨 Region 拉取镜像;kube-up/kube-down 更可靠;ELB 开启 ICMP Type 3 Code 4;修复 ARP 缓存;使用 /dev/xvdXX 设备名;ELB 支持 proxy protocol(经注解 service.beta.kubernetes.io/aws-load-balancer-proxy-protocol)、混合明文/加密端口(经注解 service.beta.kubernetes.io/aws-load-balancer-ssl-ports)与监听器 SSL;可指定 VPC CIDR(实验特性);修复超过 2 个安全组的问题。
  • GCP:支持将 gcr.io 用作 Docker 镜像仓库镜像;大集群扩大 GCE master 根盘;默认 clusterCIDR 从 /16 调整为 /14,使默认集群可容纳 1000 节点;允许 GCE 上使用 Debian Jessie;Node Problem Detector addon 可检测并上报内核死锁。
  • OpenStack:云提供方插件正式新增(alpha.4 的 "Openstack provider" 条目首次引入,beta.1 补充 LBaaS v2 支持,v1.3.7 修复 LBAAS v2 多服务端口限制)。
  • vSphere:云提供方插件更新(alpha.4 引入 vSphere Cloud Provider,alpha.5 实现 Volume Plugin)。

六、架构级变更的源码印证:从 Release Notes 到代码落点

v1.3 是 Kubernetes 存储与节点可靠性架构的分水岭。下面选取发布说明中三条影响最深的架构变更,在当前仓库源码中逐一印证其落点与演化。

6.1 Attach/Detach 控制器(beta.1 引入)

发布说明对 1.3 新引入的 Attach/Detach Controller 有一段完整的设计描述,核心机制为:

  1. 控制器监听 apiserver 中的已调度 Pod,确保实现 volume Attacher 接口的卷被 attach 到 Pod 所在节点;
  2. Pod 删除后,控制器等待 kubelet 安全卸载卷(以该卷不再出现在节点 Node.Status.VolumesInUse 中为准),若超过预配置时长(v1.3 中为 3 分钟)仍未卸载,则单方面强制 detach,防止节点失联导致卷被永久占用;
  3. 向后兼容:控制器只管理带注解 volumes.kubernetes.io/controller-managed-attach-detach 的节点;1.3+ 节点启动时默认打上该注解,行为受 kubelet 标志 --enable-controller-attach-detach(默认 true)控制;
  4. 安全的滚动升级顺序:先升级 master(启动新控制器,此时因节点均无注解而不接管任何卷),再逐台升级节点(节点升级后自动 opt-in,控制器随即接管该节点上卷的 attach/detach)。

在当前仓库中,该控制器的实现主体仍在 attach_detach_controller.go,其头部注释即声明"Package attachdetach implements a controller to manage volume attach and detach operations"。值得注意的演化细节:当前代码中 TimerConfig 结构体定义了 ReconcilerMaxWaitForUnmountDurationattach_detach_controller.go#L71-L75),用于"等待卷被安全卸载的最长时间,超时则认为节点或 kubelet 无响应并强制 detach"——这正对应发布说明中 v1.3 的 3 分钟等待窗口;而从源码结构看,当前主代码库的默认值已调整为 6 分钟,说明该等待时长在 1.3 之后的版本中经历了放宽。控制器周边的 cache、populator、reconciler、statusupdater 等子包(位于 pkg/controller/volume/attachdetach/ 目录)构成了完整的 DesiredStateOfWorld/ActualStateOfWorld 对账架构,与发布说明描述的"watch API server + 等待卸载 + 超时强拆"三阶段流程一一对应。

6.2 kubelet Volume Manager(beta.2 引入)

beta.2 的 Other notable changes 记载:"A new volume manager was introduced in kubelet that synchronizes volume mount/unmount (and attach/detach, if attach/detach controller is not enabled)",其意义在于消除了 Pod 创建循环与孤儿卷清理循环之间的竞态,并把 unmount/detach 移出 syncPod() 路径,使卷清理不再阻塞 syncPod 循环。当前仓库中该模块延续在 pkg/kubelet/volumemanager/ 目录,与 6.1 的控制器共同组成 1.3 之后"挂载/卸载在节点、附加/分离在 master"的分层存储控制面。v1.3.4 的补丁 "Allow mounts to run in parallel for non-attachable volumes" 与 v1.3.6 的 "Skip safe to detach check if node API object no longer exists" 均是对这套机制的竞态与边界修正,体现了该架构在 1.3 周期内经历的高强度打磨。

6.3 kubelet 驱逐(alpha.5 引入)

Highlights 中"通过可选驱逐 Pod 提升节点稳定性"对应的实现,落地于 eviction_manager.go 所在的 pkg/kubelet/eviction/ 目录。从源码结构看,当前实现已包含 memory_threshold_notifier.go 等按资源类型拆分的阈值通知器与平台相关的 defaults 文件(defaults_linux.go / defaults_windows.go),其"低于配置驱逐阈值即触发"的语义与 alpha.5 条目 "Kubelet evicts pods when available memory falls below configured eviction thresholds" 完全一致。同期 alpha.5 还向调度器引入了节点内存压力条件("Introduce node memory pressure condition to scheduler"),使驱逐(节点侧)与避压调度(控制面侧)形成闭环。

6.4 其他可印证的关键变更

  • 垃圾回收控制器:alpha.5 的 Action Required 中两条 GC 条目("Add garbage collector into kube-controller-manager"、"Add orphaning finalizer logic to GC")对应当前仓库 pkg/controller/garbagecollector/ 目录,这是孤儿对象回收能力的起点;
  • Taints 与 Tolerations:alpha.5 条目 "Implement taints and tolerations" 是节点污点/容忍度机制的首次实现,当前仓库的 pkg/controller/tainteviction/ 目录(污点驱逐)延续了这一主线;
  • Init 容器:beta.2 的 Experimental Features 描述与 alpha.5 的 "Add init containers to pods" 条目,是如今每个 Pod 默认支持 initContainers 字段的历史起点;
  • 通信层:alpha.5 条目 "Use protobufs by default to communicate with apiserver (still store JSONs in etcd)" 确立了 apiserver 客户端协议与存储格式解耦的路线;
  • 网络:alpha.5 实现 NetworkPolicy v1beta1 API 对象,v1.3.4 补丁 "NetworkPolicy cherry-pick 1.3" 说明该 API 在 1.3 周期内还在快速迭代;Kubenet 的 host-port 支持经 iptables 实现(alpha.5 条目),与 v1.3.7 修复的 "kubelet hostport logic which flushes KUBE-MARK-MASQ iptables chain" 补丁相互印证。

七、补丁版本(v1.3.1 ~ v1.3.10)修复脉络

正式版 10 个补丁版本的显著变更,按主题归集如下(条目均出自 CHANGELOG-1.3.md 对应版本的 "Other notable changes"):

版本 关键修复与变更
v1.3.1 修复 watch cache 过滤缺陷(#29046,此缺陷在 v1.3.2 中又以 #28968 的形式进一步修复,说明其影响面广)
v1.3.2 节点 CIDR 分配前先列出全部节点并占用 cidr map(#29062);ModifyConfig 起始阶段锁定全部可能的 kubecfg 文件(#28232)
v1.3.3 修复 kubelet working_set 计算(#29154);kube-proxy conntrack 限制按核数缩放成为新默认行为(#28876);GPU 资源校验修复(#28743);GCE 不再通过 metadata server 探测运行环境(#28871);kcm 重启不再重建 LB 云资源(#29082)。该版本还专门列出 4 条 Known Issues:命名空间删除导致 PVC 卷未 detach(#29051)、GCE PD 在节点已不存在时 detach 失败(#29358)、批量建 Pod 时 default-token 卷挂载并行化问题(#28616)、service account secret 卸载时 device or resource busy(#28750)
v1.3.4 NetworkPolicy cherry-pick;非可 attach 卷允许并行挂载(#28939);块设备增强卷与挂载日志(#24797);修复 ServiceAccount 的 RBAC authorizer(#29071);节点不存在时视为卷已 detach(#29485);修复"命名空间删除导致 PVC 卷未 detach"(#29077,即 v1.3.3 Known Issue 的闭环)
v1.3.5 Dashboard UI 升级 v1.1.1;允许限制子资源(subresource)访问(#30001);绑定后修复 PVC.Status.Capacity 与 AccessModes(#29982);OIDC 认证插件不再裁剪带尾斜杠的 issuer URL(#29860);rkt 场景拉起 lo 接口(#29310)
v1.3.6 处理 vSphere 卷 Attach 上限(#29881);请求超时随 terminationGracePeriodSeconds 提升(#31275);节点 API 对象不存在时跳过 safe-to-detach 检查(#30737);nodecontroller 在 kubeletVersion < 1.2.0 时不再翻转 Pod readiness(#30828);cAdvisor 升级 v0.23.9 以修复容器文件系统统计可能损坏 devicemapper thin pool 的问题(#30307)
v1.3.7 AWS 修复卷设备分配竞态之外的区域/提供方修复:ap-south-1 区域加入(#28428);vSphere 关键修复回合(#31993);OpenStack LBAAS v2 多端口(#32001);修复 kubelet hostport 逻辑误清 KUBE-MARK-MASQ iptables 链(#32413);修复 federation controller manager 注册 GKE 集群时 panic(#30940)
v1.3.8 AWS 卷设备分配竞态条件修复(#31090)
v1.3.9 正确测试 x509 中间证书(#34524);移除代理目标不必要的头部(#34076)
v1.3.10 GCI 与内建 kubelet 版本解耦(#31367);GCE debian 镜像升级以响应 CVE-2016-5195(Dirty Cow,#35825);新增 RELEASE_INFRA_PUSH 相关代码以支持从 kubernetes/release 仓库推送(#28922)

可以观察到清晰的主题线:v1.3.1~v1.3.4 密集修复 watch cache 与卷 detach 竞态(存储控制面新架构上线初期的阵痛);v1.3.5~v1.3.7 转向提供方适配与安全基线;v1.3.8~v1.3.10 收敛为低频安全与稳定性维护,是典型的 LTS 前维护版本收尾形态。

八、发布制品与完整性校验

发布说明的 Downloads 部分记录了每个版本的制品与校验值,其格式本身也体现了发布流程的演化:早期版本(v1.3.0 至 v1.3.0-beta.3)仅校验 kubernetes.tar.gz 且同时给出 sha1 与 md5 两种哈希;v1.3.3 起改用单列 sha256;v1.3.10 进一步将制品拆分为 kubernetes.tar.gz 与 kubernetes-src.tar.gz(源码包),并首次细分 Client Binaries 与 Server Binaries 两张清单。v1.3.10 的完整清单如下(文件名与 sha256 均摘自发布说明原文):

主制品

文件名 sha256
kubernetes.tar.gz 0f61517fbab1feafbe1024da0b88bfe16e61fed7e612285d70e3ecb53ce518cf
kubernetes-src.tar.gz 7b1be0dcc12ae1b0cb1928b770c1025755fd0858ce7520907bacda19e5bfa53f

Client Binaries(9 种平台组合)

文件名 sha256
kubernetes-client-darwin-386.tar.gz 64a7012411a506ff7825e7b9c64b50197917d6f4e1128ea0e7b30a121059da47
kubernetes-client-darwin-amd64.tar.gz 5d85843e643eaebe3e34e48810f4786430b5ecce915144e01ba2d8539aa77364
kubernetes-client-linux-386.tar.gz 06d478c601b1d4aa1fc539e9120adbcbbd2fb370d062516f84a064e465d8eadc
kubernetes-client-linux-amd64.tar.gz fe571542482b8ba3ff94b9e5e9657f6ab4fc0feb8971930dc80b7ae2548d669b
kubernetes-client-linux-arm64.tar.gz 176b52d35150ca9f08a7e90e33e2839b7574afe350edf4fafa46745d77bb5aa4
kubernetes-client-linux-arm.tar.gz 1c3bf4ac1e4eb0e02f785db725efd490beaf06c8acd26d694971ba510b60a94d
kubernetes-client-linux-ppc64le.tar.gz 172cd0af71fcba7c51e9476732dbe86ba251c03b1d74f912111e4e755be540ce
kubernetes-client-windows-386.tar.gz f2d2f82d7e285c98d8cc58a8a6e13a1122c9f60bb2c73e4cefe3555f963e56cd
kubernetes-client-windows-amd64.tar.gz ac0aa2b09dfeb8001e76f3aefe82c7bd2fda5bd0ef744ac3aed966b99c8dc8e5

Server Binaries(4 种 Linux 架构)

文件名 sha256
kubernetes-server-linux-amd64.tar.gz bf0d3924ff84c95c316fcb4b21876cc019bd648ca8ab87fd6b2712ccda30992b
kubernetes-server-linux-arm64.tar.gz 45e88d1c8edc17d7f1deab8d040a769d8647203c465d76763abb1ce445a98773
kubernetes-server-linux-arm.tar.gz 40ac46a265021615637f07d532cd563b4256dcf340a27c594bfd3501fe66b84c
kubernetes-server-linux-ppc64le.tar.gz faa5075ab3e6688666bbbb274fa55a825513ee082a3b17bcddb5b8f4fd6f9aa0

这一清单形态本身即是 1.3 发布体系演进的缩影:arm64 与 ppc64le 的交叉编译在 alpha.3("Build Kubernetes, etcd and flannel for arm64 and ppc64le")就已落地,到 v1.3.10 时 server/client 制品的架构覆盖已完全成型;beta.3 的 "Add sources to server tarballs" 条目则解释了 kubernetes-src.tar.gz 的由来。

九、结语

CHANGELOG-1.3.md 记录的不只是一串版本号:v1.3 周期确立了三大延续至今的架构支柱——master 侧的 Attach/Detach 控制器(现源码位于 pkg/controller/volume/attachdetach/)、节点侧的 Volume Manager 与驱逐机制(pkg/kubelet/volumemanager/pkg/kubelet/eviction/)、以及以 RBAC/NetworkPolicy/PodSecurityPolicy 为代表的声明式安全体系。对需要阅读历史发布行为、定位某条变更来源或对照升级约束的读者,这份 Changelog 与当前源码目录之间的对应关系(如 3 分钟等待窗口在当前代码中演化为 6 分钟的 ReconcilerMaxWaitForUnmountDuration)即是最佳的导读路径;完整的版本索引可从 CHANGELOG/ 进入相邻版本继续追溯。

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