首页
/ Kubernetes v1.6 版本深度解析与升级指南:etcd3 存储迁移、RBAC Beta、调度"注解迁移到字段"全景解读

Kubernetes v1.6 版本深度解析与升级指南:etcd3 存储迁移、RBAC Beta、调度"注解迁移到字段"全景解读

2026-09-06 18:18:25作者:平淮齐Percy

本文以 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 进入 Betarbac.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/v1beta1 generator、废弃 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. 1.6 鼓励 etcd3,从 etcd2 切换到 etcd3 是一次跨存储引擎的全量数据迁移。迁移期间必须停止 API Server 对 etcd 的写入;按官方流程,HA 安装暂时无法完成该迁移。
  2. 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-user flag 废弃,改用 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 的其它破坏性变更

  • Serviceendpoints.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(含 NoExecutetolerationSeconds
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.goPodQOSClassQOSClass 字段,约 L4592/L4889)。
  • 容器新增 terminationMessagePolicy 字段:可设 FallbackToLogsOnError,在用户不写终止消息文件时从容器日志读取终止消息;终止消息文件上限 4KB、每个 Pod 累计上限 12KB(常量定义见 pkg/apis/core/types.go 约 L2730-L2734)。
  • cAdvisor 升级到 v0.25.0:对 device mapper 关闭容器文件系统用量追踪(IOPS 过高),忽略 .mount cgroups。
  • 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 / Authorizationauthentication.k8s.ioauthorization.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)。
  • RBACPolicyRule.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-manager flag 门控)负责从带 NoExecute 污点的节点上移除 Pod;容忍支持通配 key;新增"forgiveness"的 alpha API 定义。
  • Volumes:PV/PVC 新增 StorageClassName 属性(替代 volume.beta.kubernetes.io/storage-class 注解,beta 注解本版本仍可用);StorageClass parameters 的 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 以 AlwaysAllow authorizer 启动(此时自动关闭匿名认证)。
  • 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 selectorcan-i(查询某操作是否被允许)、kubectl logs 可直接从 deployment/job/statefulset 取日志。

新的 create 子命令create poddisruptionbudgetcreate clusterrolecreate rolecreate clusterrolebindingcreate 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 表示启动优雅删除并等待资源完全删除;需要立即强制删除时用 --forcedrain --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.shget-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 -funexpected 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 的 SchedulerNameAffinityTolerations,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)。
  • 存储与 StorageClassStorageClass/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.mdCHANGELOG-1.7.md(例如 propagationPolicy、StatefulSet hostname 字段等后续收尾)。

结语

Kubernetes v1.6 是"存储层换引擎 + 调度注解成字段 + 若干 Beta 能力集中转正"的承上启下版本:etcd3/protobuf 的引入确立了此后多年集群状态存储的技术路线;RBAC、kubeadm、亲和性、污点容忍等在当时定型的字段与语义至今仍是使用者每天面对的对象模型。理解这份 changelog,本质上是理解 Kubernetes 对象模型如何从"注解实验区"走向"字段稳定区",以及升级一个生产级调度系统需要跨越的迁移成本——这正是 CHANGELOG/CHANGELOG-1.6.md 留给后来者最有价值的部分。

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