Kubernetes v1.6 版本深度解析与升级指南:etcd3 存储迁移、RBAC Beta、调度"注解迁移到字段"全景解读
本文以 Kubernetes 官方仓库中的历史发布记录 CHANGELOG/CHANGELOG-1.6.md 为主体素材,系统梳理 v1.6.0 正式版及其后 13 个补丁版本(v1.6.1~v1.6.13)的技术全貌,重点覆盖 etcd3 存储层切换与 protobuf 序列化、RBAC 转正、kubeadm/kubefed 进入 Beta、调度特性由注解迁移至 API 字段等核心工程决策。读完本文,你将能掌握 v1.6 升级前的强制准备项(Action Required)、注解与字段两代配置形态的转换方法、各组件新增与废弃的命令行参数,以及关键已知问题的规避与修复对照。
说明:v1.6 是 2017 年前后的历史版本,本仓库为演进至今的主干代码;文中所引事实均以该 CHANGELOG 为准,同时给出可继续对照的当前仓库源码路径,帮助读者以"历史发布 + 现代代码"双重视角理解 Kubernetes API 的演进脉络。
一、v1.6 的发布主题:十个关键里程碑
根据 v1.6.0 的 "Major updates and release themes" 一节,该版本确立了以下核心变化:
- 支持到 5000 节点:集群规模上限的提升依赖 etcd v3 作为默认存储后端(kube-apiserver 的默认存储后端由 etcd2 切到 etcd3)。
- RBAC 进入 Beta:
rbac.authorization.k8s.io/v1beta1,并为控制平面、节点、控制器组件定义了安全的默认角色。 - kubeadm 集群引导工具进入 Beta:全部通信走 TLS、可由 kubeadm 安装授权插件(默认即 RBAC)、bootstrap token 支持管理与过期。
- kubefed 联邦引导工具进入 Beta:支持在自建集群上托管联邦、自动配置加入集群的 kube-dns、允许向联邦组件透传参数。
- 运行时交互全面走 CRI:kubelet 通过 Container Runtime Interface 与容器运行时交互,Docker-CRI 实现进入 Beta 并默认启用(可用
--enable-cri=false关闭)。 - 调度特性批量转正(Beta):多调度器(multiple schedulers)、节点亲和/反亲和、Pod 亲和/反亲和、污点与容忍(taints and tolerations);并支持按 Pod 指定节点故障后可继续绑定在该节点的时长(
tolerationSeconds)。 - 存储特性批量转 GA:StorageClass 在 Azure、AWS、GCE、OpenStack、vSphere 上预装并设为默认;动态供给(Dynamic Provisioning)可配置。
- DaemonSet 支持滚动更新。
- 废弃动作:移除
extensions/v1beta1的 Jobs 资源与job/v1beta1generator、废弃federation/deploy/deploy.sh、废弃 AWS 与 Azure 的 bash kube-up 部署、移除cmd/kube-discovery等。
这些主题在后续小节的升级指南与 API 变更中会逐一落到具体操作与参数上。
二、升级前必读:etcd 备份与存储层切换(etcd2 → etcd3 与 protobuf)
CHANGELOG 在 v1.6.0 章节开头用了整段 WARNING 强调备份,原因是 1.6 的存储层发生了两个方向性变化:
- 1.6 鼓励 etcd3,从 etcd2 切换到 etcd3 是一次跨存储引擎的全量数据迁移。迁移期间必须停止 API Server 对 etcd 的写入;按官方流程,HA 安装暂时无法完成该迁移。
- etcd3 下默认改用 protobuf 编码存储(media type
application/vnd.kubernetes.protobuf)。该切换不可逆——回滚的唯一办法是从切换前备份恢复,且会丢失备份之后的所有变更(因为 1.5 不支持 protobuf 编码,从 protobuf 回滚到 1.5 必须整库恢复)。
为保留回滚能力,文档给出的两个关键参数是:
--storage-media-type application/json
即让 kube-apiserver 继续以 application/json 作为存储 media type,后续再择机切到 application/vnd.kubernetes.protobuf。同时,"Action Required / Internal Storage Layer" 一节给出了更完整的约束:
在升级到 1.6 之前,要么先升级到 etcd3,要么在启动 apiserver 时显式指定
--storage-backend=etcd2 --storage-media-type=application/json。
另外两个与后端相关的行为细节:
- 若 kube-apiserver 以
--storage-backend=etcd2启动,则强制使用application/json([#43122])。 - 自定义
--etcd-prefix在 etcd3 模式下的规范化行为被恢复([#42506]),避免此前 prefix 异常导致的数据寻址错误。
这些参数在现代 kube-apiserver 中仍通过 cmd/kube-apiserver/app 下的 options 组装(如 pkg/kubeapiserver/options),只是默认值早已全面转向 etcd3。
三、Action Required:升级到 v1.6 必须处理的动作清单
v1.6.0 的 "Action Required" 是全文档信息密度最高、实操价值最大的部分,按组件逐条整理如下。
3.1 证书 API(Certificates API)
certificates.k8s.io 从 alpha 升为 beta 并默认启用。使用旧版 alpha 证书 API 的用户,须在升级前删除 API 中的 v1alpha1 CSR,升级后按 v1beta1 重建([#39772])。
3.2 集群自动扩缩(Cluster Autoscaler)
若正使用或计划使用 Cluster Autoscaler,文档建议等待 Kubernetes 1.6.1:1.6.0 的 Autoscaler 在存在不可调度 Pod、需要扩容且云厂商为新建节点配置网络较慢时,可能把集群扩得比实际需要略大(集群通常会在约 10 分钟后回到正常规模)。1.6.1 起改用 0.5.1,修复了该问题,并把运行状态暴露到 kube-system/cluster-autoscaler-status ConfigMap 中。
3.3 Deployment / StatefulSet / DaemonSet:ControllerRef 语义收紧
这三个控制器全面接入 ControllerRef 所有权机制,避免相互争抢 Pod/ReplicaSet。升级时不允许存在 selector 相互重叠的 Deployment 或与其它控制器(如 ReplicaSet)重叠的 StatefulSet,否则所有权可能发生意外转移(分别见 [#42175]、[#42080]、[#42173])。
3.4 联邦(Federation)
kubefed init的--dns-provider参数改为必填,不再默认google-clouddns,例如kubefed init --dns-provider=google-clouddns。- 联邦服务在 etcd 中的存储位置发生变化,存量联邦服务必须导出后删除、升级后再重建。
3.5 节点组件(Kubelet / Docker-CRI / CNI / QoS)
这是动作最多的一组:
Docker-CRI 默认启用,且与旧 kubelet 创建的容器不兼容:文档建议升级前先 drain 节点;若做原地升级,kubelet 会自动重启节点上所有由 Kubernetes 管理的容器。CRI 与不符合 CNI 规范错误处理行为的插件不兼容(标准 bridge 插件已验证可用),临时手段是显式 --enable-cri=false。
CNI 插件影响节点就绪状态:kubelet 会阻塞节点 Ready,直到 /etc/cni/net.d(或自定义 CNI 配置路径)出现配置文件,避免在网络就绪前启动需要网络的 Pod。依赖 Ready=True 条件来门控 Pod 创建/调度的客户端需要适配这一变化。
QoS 增强(涉及 cgroup 层级与节点可分配资源),文档给出三个退出开关,含义如下表:
| 新默认行为 | 退出开关 | 说明 |
|---|---|---|
| Pod 落入新的 cgroup 层级 | --cgroups-per-qos=false |
该特性要求升级时 drain 并重启节点 |
配置了 kube-reserved/system-reserved 时对所有 Pod 强制执行节点可分配量 |
--enforce-node-allocatable="" |
另配 --system-reserved-cgroup、--kube-reserved-cgroup |
| 硬驱逐阈值从 Capacity 中扣除后计算 Node Allocatable | --experimental-allocatable-ignore-eviction=true |
开启内存硬驱逐的集群升级后可调度容量会下降 |
运行时支持范围收紧:移除对 Docker 1.9.x 的支持;验证通过的版本为 1.10.3、1.11.2、1.12.6。
删除了一批已废弃的 kubelet flag:--config、--auth-path、--resource-container、--system-container、--reconcile-cidr。
其它节点注意事项:pre-1.0 时代的 mirror pod 临时修复被移除,不支持从 pre-1.0 直接升级到 1.6;fluentd 迁移为 DaemonSet,目标节点需带 beta.kubernetes.io/fluentd-ds-ready=true 标签。
3.6 kubectl:taint 版本匹配与 create secret 语法
kubectl taint(1.5 为 alpha)要求客户端与服务端版本一致:1.6 客户端打 1.6 服务端、1.5 客户端打 1.5 服务端,混用(skewed)环境不可用。kubectl create secret不再支持在单个--from-literal里用逗号分隔多个值,必须为每个值分别传--from-literal。
3.7 RBAC:v1beta1 语义与授权规则变化
- 默认 ClusterRole/ClusterRoleBinding 会在服务启动时自动补全缺失权限与主体;若不想自动更新,给对象加注解
rbac.authorization.kubernetes.io/autoupdate=false。 v1beta1的 RoleBinding/ClusterRoleBinding 的 subject 由apiVersion改为apiGroup以完整限定:ServiceAccount 主体默认apiGroup="",User/Group 主体默认apiGroup="rbac.authorization.k8s.io"。- 创建/更新 RoleBinding 或 ClusterRoleBinding 需要双重授权:①对该 API 请求有权限;②被允许 bind 所引用的角色(要么已拥有该角色全部权限,要么对该角色拥有
bind权限)。 --authorization-rbac-super-userflag 废弃,改用system:masters组的特权访问。- v1beta1 中移除对用户
*的特殊处理:要匹配所有用户应显式绑定system:authenticated和/或system:unauthenticated;存量 v1alpha1 绑定*的会自动转换为system:authenticated组。
3.8 Scheduling:注解到字段的大迁移(重点)
1.6 将调度相关的三组 alpha 注解正式升级为 PodSpec/NodeSpec 的字段,只有升级到 1.6 之后新字段才被识别。转换要求如下:
多调度器 → schedulerName 字段:弃用 scheduler.alpha.kubernetes.io/name 注解,自定义调度器也要改读 PodSpec 的 schedulerName。
亲和/反亲和 → affinity 字段:默认不再读 scheduler.alpha.kubernetes.io/affinity 注解;若想继续用注解版 alpha 能力,需在 --feature-gates 中加入 AffinityInAnnotations=true,例如 --feature-gates=FooBar=true,AffinityInAnnotations=true。一个语义破坏点:alpha 版中"空的 podAffinityTerm.namespaces 列表表示所有命名空间"的行为不再支持,无论 alpha 还是 beta 现在都表示"与声明该亲和规则的 Pod 同命名空间"。beta 版也不再支持调度器的 --failure-domains 参数。
污点 → NodeSpec taints 字段:升级 master 与 kubectl 后需用 kubectl taint 重建全部污点。1.6 升级后旧的(以注解形式内部存储的)污点不再生效,查看方式如下:
# 仍在 1.5 时查看现有污点
kubectl describe node <node name> # 看 Taints 小节
# 运行 1.6 后查看 1.5 时期创建的污点(注解形式)
kubectl get node <node name> -o yaml # 看 scheduler.alpha.kubernetes.io/taints 注解
# 任意时刻删除"旧版"污点注解(行尾的减号表示删除该 key)
kubectl annotate nodes <node name> scheduler.alpha.kubernetes.io/taints-
同时引入了 NoExecute 污点效果(可驱逐已运行 Pod)与容忍上的 tolerationSeconds 字段(延迟驱逐)。注意:1.5 时代创建的污点只影响新 Pod 调度,master 升级与重建污点都不会影响已运行 Pod。Rescheduler 依赖污点且此改动向后不兼容——Rescheduler 0.3(随 1.6 发布)认识新污点并会清理旧注解;若同时使用 0.2,为避免升级期间驱逐循环,需保证 master 原子升级(如 GCE 用 upgrade.sh)或按"先升级 rescheduler、再 scheduler、最后其它 master 组件"的顺序操作。
容忍 → PodSpec tolerations 字段:升级 master 后须更新 PodSpec 设置 tolerations 并移除 scheduler.alpha.kubernetes.io/tolerations 注解。查找注解形式的容忍:
kubectl get <controller kind> <controller name> -o yaml # 查看 scheduler.alpha.kubernetes.io/tolerations 注解
随后用 kubectl replace / kubectl apply / kubectl patch 或重建控制器来迁移(这些操作只能在升级后执行)。此外,新增的 alpha 特性 TaintBasedEvictions(--feature-gates=TaintBasedEvictions=true)允许 NodeController 用 NoExecute 污点表达节点 NotReady/Unreachable,配合 tolerationSeconds 即可让每个 Pod 自己决定节点不可达后可滞留多久,替代默认的 5 分钟。
在今天的仓库中,这些字段仍然定义在 PodSpec 类型上,可对照 pkg/apis/core/types.go 中的 SchedulerName string(约 L4009)、Tolerations []Toleration(约 L4012)、Affinity *Affinity(约 L4005)——这正是当年"注解 → 字段"迁移的最终归宿。
3.9 Service / StatefulSet / Volumes 的其它破坏性变更
- Service:
endpoints.beta.kubernetes.io/hostnames-map注解不再支持,改用Endpoints.subsets[].addresses[].hostname字段。 - Volumes:StorageClass 在五大云上预装且默认标记,改变了 PersistentVolumeClaim 的默认行为——不指定 StorageClass 的 PVC 会触发动态供给,而非绑定到现有 PV 池;想保留旧行为需把
storageclass.beta.kubernetes.io/is-default-class改为false。Flex volume 插件更新为支持 attach/detach 接口,破坏向后兼容,需更新驱动并实现新的 callout。
四、Notable Features:按成熟度标记的新能力
v1.6 用 [alpha] / [beta] / [stable] 明确标注了各功能成熟度,以下按组件摘录核心项。
| 组件 | 成熟度 | 关键能力 |
|---|---|---|
| Autoscaling | alpha | HPA 经 API Server Aggregator 取指标;支持基于多个自定义指标扩缩容 |
| DaemonSet | beta | 滚动更新(rolling update) |
| Deployment | beta | 无法推进滚动的新版本会在 API 中呈现 blocked 状态 |
| Federation | beta | kubefed 支持 on-prem 集群托管联邦、自动配置 kube-dns、透传组件参数 |
| Internal Storage | stable | 集群状态默认使用 etcd3,存量集群需规划数据迁移窗口 |
| kubeadm | beta | 基线功能与 CLI flags 标记为 beta(kubeadm alpha 子命令仍为 alpha);upgrade 与 HA 尚不支持 |
| kubeadm | alpha | Bootstrap Token 认证与管理(含基于时间的过期);新增 cloud-controller-manager 二进制用于测试新云厂商流程 |
| Node Components | stable | Init 容器转正为 PodSpec 字段(beta 注解仍被尊重且优先级更高) |
| Node Components | beta | Docker-CRI 默认启用;Node Problem Detector v0.3.0(支持 journald、任意系统守护进程日志、原生 daemon 运行) |
| Node Components | alpha | Critical Pods(feature gate ExperimentalCriticalPodAnnotation,配合 scheduler.alpha.kubernetes.io/critical-pod 注解与 rescheduler);GPU 支持由 --experimental-nvidia-gpus 替换为 Accelerators=true feature gate,支持多 GPU |
| Scheduling | beta | 多调度器、节点/Pod 亲和反亲和、taints & tolerations(含 NoExecute 与 tolerationSeconds) |
| Service Catalog | alpha | 新增 PodPreset API 资源与准入控制器,向 Pod 注入卷与环境变量 |
| Volumes | stable | storage.k8s.io/v1、五大云默认 StorageClass、从 ConfigMap/Secret 灌入环境变量、ScaleIO 与 Portworx 卷插件、GCE/GKE GCI 上使用 NFSv3/NFSv4/GlusterFS |
| Volumes | beta | PV 挂载选项(mount options) |
| Volumes | alpha | Projected volume(把 secret/configmap/downward API 投影到同一目录的一体化卷驱动) |
另外值得注意的节点侧行为增强(原文 "Node Components" 一节):
- Pod 的 QoS Class 写入 Pod Status(见当前代码 pkg/apis/core/types.go 的
PodQOSClass与QOSClass字段,约 L4592/L4889)。 - 容器新增
terminationMessagePolicy字段:可设FallbackToLogsOnError,在用户不写终止消息文件时从容器日志读取终止消息;终止消息文件上限 4KB、每个 Pod 累计上限 12KB(常量定义见 pkg/apis/core/types.go 约 L2730-L2734)。 - cAdvisor 升级到 v0.25.0:对 device mapper 关闭容器文件系统用量追踪(IOPS 过高),忽略
.mountcgroups。 - Pod 删除延迟:直到 Pod 的 compute resource 占用全部回收后才删除 Pod 对象,避免节点/调度器对正在清理的资源超卖;副作用是 Pod 删除延迟可能变长(大文件系统足迹时更明显)。
- 每个 Pod 默认拥有独立的 cgroup(相关演进见 v1.6.0-beta.1 的
--enforce-node-allocatable与 cgroup 命名小写化等条目)。
五、API 资源变更摘要(Changes to API Resources)
按 API 资源组整理 v1.6 的规范变更,便于按组检索:
- ABAC:
"user":"*"/"group":"*"策略只匹配已认证请求;匹配匿名请求须显式写"group":"system:unauthenticated"。 - Admission Control:新增
PodPreset资源与准入控制器;DefaultTolerationSeconds准入控制器新增并默认启用;ResourceQuota 支持默认限制资源、支持按 StorageClass 配额存储;ServiceAccount/PodSpec 新增automountServiceAccountToken字段(类型*bool,Pod 上为 false 则 Pod 不自动挂载 token,ServiceAccount 上为 false 则默认不挂载、Pod spec 可显式覆盖);准入控制支持版本化配置文件。 - Authentication / Authorization:
authentication.k8s.io与authorization.k8s.io双双升至 v1;SubjectAccessReview 现在会把 subresource 与 resourceName 传给 authorizer。 - Autoscaling:引入支持更丰富指标定义的新 alpha 版 HPA;HorizontalPodAutoscaler 不再提供于
extensions/v1beta1,改用autoscaling/v1。 - Certificates:CertificateSigningRequest 增加
extra字段保存请求用户的全部信息(镜像 SubjectAccessReview 的字段);原生支持 token 引导流程(在kube-public命名空间签发众所周知的 ConfigMap、清理过期 token),对应新 secret 类型bootstrap.kubernetes.io/token。 - ConfigMap / Secrets:卷与环境变量源可加
optional: true容忍对象或 key 缺失;支持envFrom从整个 ConfigMap / Secret 一次性定义多个环境变量。 - CronJob:新增可配置的保留数量上限(成功/失败 Job 各保留多少)。
- DaemonSet:接入 ControllerRef;调度时尊重 critical pod 注解与节点污点/Pod 容忍;新增 ObservedGeneration 状态;控制器会主动杀掉失败 Pod 以重建;可在节点 Unreachable/NotReady 的基于污点驱逐下存活。
- Deployment / ReplicaSet:新增
apps/v1beta1.Deployments(与 extensions 版本默认值不同)及对应 generator;Deployment/ReplicaSet 增加 readyReplicas 等状态;ReplicaSet 带上创建它的 Deployment 的 ownerRef。 - Pod / PodSecurityPolicy:Init 容器转正为字段;
affinity、node affinity 由注解改为 API 字段;新增 QoS 状态字段;PDB 的百分比minAvailable修复了对 StatefulSet Pod 的计算;PodSecurityPolicy 默认在 extensions API 组启用(现对应策略位于 pkg/apis/policy)。 - RBAC:
PolicyRule.attributeRestrictions字段从 v1alpha1 移除;支持通过bind动词授权绑定特定角色。 - Service:容忍未就绪 Pod 的 Endpoints 也会列出 Terminating 状态的 Pod;LoadBalancerSourceRanges 更新修复;修复 UDP 包无法到达新部署服务的问题;loadbalancer 类型 Service 同时消耗 loadbalancer 与 nodeport 配额。
- StatefulSet:修复多挂载跨 zone 的放置启发式(同一 Pod 的多个卷落同一 zone);修复可能死锁的控制器行为(只对自己身份匹配的 Pod 动作)。
- Taints & Tolerations:NodeController 新增 taint-manager(默认开启,
enable-taint-managerflag 门控)负责从带 NoExecute 污点的节点上移除 Pod;容忍支持通配 key;新增"forgiveness"的 alpha API 定义。 - Volumes:PV/PVC 新增
StorageClassName属性(替代volume.beta.kubernetes.io/storage-class注解,beta 注解本版本仍可用);StorageClassparameters的 key 不得占用kubernetes.io/k8s.io命名空间;新增storage.k8s.io/v1;alpha 版动态供给注解volume.alpha.kubernetes.io/storage-class语义被移除,由默认 StorageClass 与 DefaultStorageClass 准入插件替代。
六、主要组件变更:命令行参数与行为清单
6.1 kube-apiserver
--anonymous-auth默认开启,除非 API Server 以AlwaysAllowauthorizer 启动(此时自动关闭匿名认证)。- OIDC:使用
--oidc-username-claim=email时,身份提供方必须返回"email_verified":true声明。 --basic-auth-file支持在第四列可选指定用户组。- 读写两类 inflight 请求上限分离(read-only 与 mutating 各自独立限流)。
--long-running-request-regexp废弃:长连接请求改为按 verb(watch、proxy)或子资源(proxy、portforward、log、exec、attach)识别。- 级联删除请求(
DeleteOptions.OrphanDependents=false)未立即完成删除时返回 HTTP 202。 - JSON 序列化统一:数组字段不再区分
null与[],一律输出[]。 - OpenAPI spec 中 definition 使用完整包路径命名,并开始覆盖内联类型。
- watch 调用由
/watch/路径前缀改为?watch=true查询参数(客户端侧同步修改)。
6.2 API Server Aggregator 与 genericapiserver
kubernetes-discovery 更名为 kube-aggregator;修复了经其转发时的连接升级问题。同期 genericapiserver 做了大量依赖裁剪(逐一切断 pkg/version、serviceaccount、extensions、storage、certificates 等依赖)与行为修复:空列表的 items 统一返回空数组而非 null、恢复 /healthz/ping handler、从服务器证书与 SNI 链中抽取 CA 证书、统一 swagger 与 openapi 配置等。这些为后续 kube-apiserver 可拆分与独立 API Server 生态(即后来 apiserver-builder / 多租户方向)打下基础。
6.3 kubectl
新命令:apply set-last-applied(更新 last-applied-configuration 注解)、apply view-last-applied(查看上次应用的配置)、set selector、can-i(查询某操作是否被允许)、kubectl logs 可直接从 deployment/job/statefulset 取日志。
新的 create 子命令:create poddisruptionbudget、create clusterrole、create role、create clusterrolebinding、create service externalname(后续版本还补了 create rolebinding)。
apply / edit 行为:
apply支持显式将字段置为null来清空;对没有 LastAppliedConfig 注解的资源给出警告;对 TPR/未注册类型回退到通用三路 JSON merge patch。- PATCH(apply、edit)支持合并基础类型列表。
edit现在按 API 返回的原始形态编辑对象,可编辑第三方资源与扩展 API Server;不再做客户端转换,--output-version对除kubectl convert外全部废弃。指定版本改在资源字段中写全限定名,如job.v1.batch/myjob。edit不再在未指定/关闭--save-config时改写 last-applied-configuration 注解,避免 apply 回滚 edit 的改动。
删除语义:--grace-period=0 表示启动优雅删除并等待资源完全删除;需要立即强制删除时用 --force。drain --force 允许移除其管理资源已被删除的 Pod。
6.4 kubeadm
- master 改用新标签与污点标记:标签
node-role.kubernetes.io/master="",污点为NoSchedule效果;要在 master 上调度工作负载(如网络 DaemonSet)需容忍node-role.kubernetes.io/master="":NoSchedule。 - kubelet API 加锁,仅集群管理员可访问;
localhost:8080的非安全 API 访问被禁用;控制平面各组件之间、apiserver 与 kubelet 之间全部安全通信。 - kubeadm 创建的集群默认开启 RBAC,部分旧 add-on 的 YAML 需要更新(以其官方文档为准)。
- 仅支持 etcd3,最低 3.0.14。
kubeadm reset不再自动 drain 节点(节点凭据无该权限),官方提供了从 apiserver/master 驱动的替代拆除流程。- 部分 flag 改名或移除(如
--use-kubernetes-version改名--kubernetes-version、移除--cloud-provider),仍需要的配置改经 config 文件传递。
6.5 kube-dns:stubDomains 与上游 DNS
kube-dns 引入 dnsmasq-nanny 管理 dnsmasq 缓存/mux 层,配置写入 kube-system:kube-dns ConfigMap(若不存在会创建空 ConfigMap),格式如下:
{
"stubDomains": {
"acme.local": ["1.2.3.4"]
},
"upstreamNameservers": ["8.8.8.8", "8.8.4.4"]
}
stubDomains是"域名 → 该域使用的 nameserver 列表"的映射,用于把私有 DNS 域注入 kube-dns 命名空间;上例中*.acme.local的解析由1.2.3.4承担。upstreamNameservers是上游解析器列表,覆盖/etc/resolv.conf的默认配置。- kube-dns 改用独立 ServiceAccount
system:serviceaccount:kube-system:kube-dns,自动绑定正确 RBAC 权限(1.6 内版本迭代至 kube-dns 1.14.5)。
6.6 kube-proxy、Scheduler 与其它的可操作变化
- kube-proxy:为 Windows 增加 TCP/UDP userspace 代理与 DNS 后缀搜索列表支持;若 services 映射未变化则跳过 iptables 规则同步;移除过时的
net.experimental.kubernetes.io/proxy-mode/net.beta.kubernetes.io/proxy-mode注解;增强对极老 iptables(如 CentOS 6)的兼容。 - Scheduler:支持 StatefulSet Pod 的跨拓扑打散,并把 StatefulSet Pod 视为同一等价类以减少调度计算;调度 extender 可只收节点名、自行缓存其余节点信息;新增
--failure-domains之外的多调度器 v1 语义。 - Garbage Collector:新增前台垃圾回收——owner 对象要等全部依赖被 GC 删除后才删除;
deleteOptions.orphanDependents将在 1.7 废弃,改用deleteOptions.propagationPolicy。 - 节点地址:Node Status 可上报 InternalDNS / ExternalDNS 两种新地址类型;apiserver 用
--kubelet-preferred-address-types指定访问节点的地址优先级。
七、集群供给脚本与 Addons 的取舍
供给脚本层的变更体现了"发行版工具逐步取代脚本"的趋势:
- AWS:树内 bash 部署(
cluster/kube-up.sh、get-kube.sh)废弃,v1.5.x 是最后支持版本;同时修复 tear-down 泄漏 DHCP Option Set 的问题。 - Azure kube-up 移除、vSphere kube-up 移除;GCE 移除 debian/trusty master 支持。
- GCE 两个重要开关(
kube-up.sh):ENABLE_LEGACY_ABAC=false:GCE provider 默认同时启用 RBAC 与宽松的旧版 ABAC(后者会让所有 ServiceAccount 变成超级用户),导出该变量可退出宽松 ABAC;ENABLE_APISERVER_BASIC_AUDIT=true:启用 apiserver 基础审计日志,写入/var/log/kube-apiserver-audit.log,与主日志共用 logrotate,并会经 fluentd 上送。
- Addon 版本更新:Dashboard v1.6.0、Heapster v1.3.0、GLBC 0.9.x、kube-dns 系列(1.11.0 → 1.14.2 → 1.14.5)、defaultbackend 1.3、cluster-proportional-autoscaler 修补 CVE-2016-8859;fluentd-gcp 全面 ConfigMap 化,且在以 DaemonSet 运行时容忍全部 NoExecute 污点;docker registry add-on 改用 DaemonSet。
外部依赖版本基线(供 CI 与安装参考,非强制推荐):Docker 验证 1.10.3 / 1.11.2 / 1.12.6(1.12.6 已知 overlay2 与 live-restore 支持不完整;1.11.2 有 Debian Jessie aufs 内核崩溃、FD 泄漏、单容器额外内存开销等已知问题);rkt 1.23.0+;etcd 3.0.17(v1.6.0 起默认 3.0.14 起跳,后续 CI 使用 3.0.17)。
八、已知问题与补丁版本演进(v1.6.0 → v1.6.13)
CHANGELOG 对每个补丁版本都记录了修复,这些"已知问题 → 修复版本"对排障极具参考价值:
| 版本 | 已知问题 / 说明 | 修复与结论 |
|---|---|---|
| v1.6.0 | kubeadm init 会 hang([#43815]) |
使用 v1.6.1(修复死锁) |
| v1.6.0 | Docker-CRI 下 Pod.Spec.HostPid 恒为 false([#44041]) |
等 v1.6.2 修复 |
| v1.6.0 | Cluster Autoscaler 可能过度扩容 | 用 v1.6.1(CA 0.5.1,状态暴露到 cluster-autoscaler-status ConfigMap) |
| v1.6.3 | subPath 为文件而非目录时 Pod 可能无法启动(回归,[#45613]);另引入磁盘驱逐时 kubelet panic | 文档明确"不要升级 v1.6.3",v1.6.4 修复 |
| v1.6.4 / v1.6.5 | 升级旧集群时 GLBC 可能覆盖 GCP Health Check 的手工修改(GKE/GLBC 场景) | v1.6.5 起 GLBC 0.9.5 修复;自 1.6.4 起步的集群不受影响 |
| v1.6.6 | — | Azure 供给卷容器权限改私有(Action Required:1.6.0–1.6.5 已建的 Azure 卷需手工改权限) |
| v1.6.9 | — | 修复 API Server watch cache 初始化后可能丢失首个 watch 事件;GCE 防止 known_tokens.csv 损坏 |
| v1.6.10 | — | apiserver 新增 --request-timeout(全局请求超时可配置);修复 kubectl logs -f 的 unexpected stream type "";修复"卷尚未按节点挂载"导致的 ContainerCreating 卡死 |
| v1.6.11 | — | 修复 GET 后 PUT 未写回 etcd 规范表示的问题(1.5 引入,影响跨版本/跨存储/跨加密迁移);StatefulSet 回填 hostname/subdomain 字段以自愈升级到 1.7 后的 DNS 问题;kube-dns 1.14.5 |
| v1.6.13 | — | cAdvisor v0.25.1(支持 Docker overlay2);修复 kube-proxy 在请求已关闭 healthcheck 时的 panic;修复 Flexvolume/FC/ISCSI 卷节点重启后未重挂载 |
其中 v1.6.11 关于 GET-then-PUT 写回规范表示的修复尤其值得关注:它恢复了"外部代理可通过 apiserver 在 etcd 中做跨 API 版本、跨存储类型、跨加密级别的内容迁移"这一能力。
九、在源码中继续追溯 v1.6 的遗产
虽然 v1.6 已成历史,但其多数 API 决策延续至今,可在当前仓库中直接对照:
- 调度字段迁移的终点:PodSpec 的
SchedulerName、Affinity、Tolerations,Init 容器与 QoS 状态字段,automountServiceAccountToken等,见 pkg/apis/core/types.go(分别约在 L4005-L4012、L3909、L4889、L3953)。 - RBAC 类型:ClusterRole / ClusterRoleBinding / Subject 等定义在 pkg/apis/rbac/types.go,注册与默认角色逻辑在对应 registry 与 controller(如 pkg/controller/clusterroleaggregation)。
- 存储与 StorageClass:
StorageClass/StorageClassList类型见 pkg/apis/storage/types.go(约 L33/L85),已演进为storage.k8s.io/v1稳定组;存储控制器实现见 pkg/controller/volume。 - kubeadm:现代实现位于 cmd/kubeadm(app 目录承载全部 init/join/reset/token 等子命令);apiserver 侧长连接与流式请求、匿名认证等逻辑位于 cmd/kube-apiserver/app。
- kube-dns 配置范式:stubDomains / upstreamNameservers 的 ConfigMap 模式已成为集群 DNS 的标准配置形态,后续 kube-dns / CoreDNS 文档与 addon 均沿袭该思路。
如需顺藤摸瓜回顾上一代与下一代差异,可在仓库 CHANGELOG 目录中对照 CHANGELOG-1.5.md 与 CHANGELOG-1.7.md(例如 propagationPolicy、StatefulSet hostname 字段等后续收尾)。
结语
Kubernetes v1.6 是"存储层换引擎 + 调度注解成字段 + 若干 Beta 能力集中转正"的承上启下版本:etcd3/protobuf 的引入确立了此后多年集群状态存储的技术路线;RBAC、kubeadm、亲和性、污点容忍等在当时定型的字段与语义至今仍是使用者每天面对的对象模型。理解这份 changelog,本质上是理解 Kubernetes 对象模型如何从"注解实验区"走向"字段稳定区",以及升级一个生产级调度系统需要跨越的迁移成本——这正是 CHANGELOG/CHANGELOG-1.6.md 留给后来者最有价值的部分。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0624
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00