首页
/ Kubernetes 1.11 发布全解:v1.11.0 到 v1.11.10 的版本演进、升级注意事项与源码级细节

Kubernetes 1.11 发布全解:v1.11.0 到 v1.11.10 的版本演进、升级注意事项与源码级细节

2026-09-06 12:02:52作者:段琳惟

Kubernetes 1.11 是 1.x 版本线中一次承上启下的发布:Pod 优先级与抢占(Pod Priority and Preemption)在此版本转正为默认开启,CoreDNS 与 IPVS 负载均衡毕业到 GA,kubeadm 配置体系升级到 v1alpha2。本文基于官方仓库中的 CHANGELOG-1.11.md 全文梳理 1.11 系列(v1.11.0-alpha.1 至 v1.11.10)的发布脉络,完整还原其中的升级须知、弃用与移除清单、特性毕业状态,并结合当前仓库源码指出这些特性在今天代码库中的对应位置,帮助你判断哪些 1.11 变更对现有集群与客户端代码仍有实际影响。

版本谱系:从 alpha 到 v1.11.10 的发布节奏

CHANGELOG-1.11.md 按时间倒序记录了 1.11 系列的全部发布,结构为"每个版本一个 H1 标题 + 二进制下载表 + Changelog"。完整的版本序列为:

  • 发布候选与预发布:v1.11.0-alpha.1、v1.11.0-alpha.2、v1.11.0-beta.1、v1.11.0-beta.2、v1.11.0-rc.1、v1.11.0-rc.2、v1.11.0-rc.3
  • 正式版本:v1.11.0
  • 补丁版本:v1.11.1 ~ v1.11.10(v1.11.10 为该系列在文档中记录的最终补丁)

每个版本节均包含三部分下载内容,文件名与校验哈希一一对应:

  • Client Binaries(客户端):kubernetes-client-{darwin,linux,windows}-{386,amd64,arm,arm64,ppc64le,s390x}.tar.gz,覆盖 macOS、Linux、Windows 多种架构;
  • Server Binaries(服务端):kubernetes-server-linux-{amd64,arm,arm64,ppc64le,s390x}.tar.gz
  • Node Binaries(节点端):kubernetes-node-linux-{amd64,arm,arm64,ppc64le,s390x}.tar.gzkubernetes-node-windows-amd64.tar.gz
  • 另有完整的 kubernetes.tar.gzkubernetes-src.tar.gz(源码包)。

值得注意的是校验方式的演进:文档中 v1.11.0 至 v1.11.3 各节使用 sha256 哈希,而从 v1.11.4 起各节的下载表切换为 sha512 哈希列。例如 v1.11.3 的 kubernetes.tar.gz 校验值为 032fd2483176aea999cc92a455676cf1dbf70538e916fedaa6b851b50c6009c3(sha256),而 v1.11.10 的 kubernetes-src.tar.gz 则给出 512 位十六进制校验值。部署时按下对应版本的哈希列做完整性校验即可。

补丁版本中的关键变更(v1.11.1 ~ v1.11.10)

补丁版本并非纯 bug 修复,其中多条带有 "Action Required" 标记的条目需要运维侧跟进。按版本梳理如下(均引自 CHANGELOG-1.11.md):

v1.11.1(自 v1.11.0 以来的变更)

  • 移除 CSI 文件系统类型默认值 ext4:此前 CSI 卷在 volumeAttributes.fstype 缺省时会默认按 ext4 处理,该默认行为被移除;官方要求不在已审查驱动列表中的 CSI 驱动先在新测试集群验证。
  • Priority 准入插件默认启用:使用 --enable-admission-plugins 的 kube-apiserver 会自动带上 Priority 准入插件;如果仍在用 --admission-control 完整指定插件集合,且启用了 PodPriority 特性(1.11 默认开启),则需手动加入 Priority 插件。
  • 系统优先级类限制到 kube-systemsystem-node-criticalsystem-cluster-critical 两个优先级类被 PodPriority 准入插件限制为只能在 kube-system 命名空间中使用。
  • 其他值得关注的修复:修复事件高频写入拖垮 etcd 的可扩展性问题、kubectl delete 删除父资源时不再等待依赖对象、修复自 1.10 起失效的 RunAsGroup、垃圾回收(GC)控制器支持 CRD 与 APIService、kubelet 启动前先 reload systemd 配置等。

v1.11.2(自 v1.11.1 以来的变更)

  • Cluster Autoscaler 升级到 1.3.1:GCP 部署中 expendable pod priority cutoff 默认值从 0 改为 -10;优先级低于 0 的工作负载可能不再触发扩容,建议将非关键负载的优先级设为低于 -10。
  • Metadata Agent 与 Logging Agent(GCP 相关组件)的成组改进:metadata agent 升级为 0.2-0.0.21-1,移除 ConfigMap 改用命令行参数,存活探针切换为 /healthz;logging agent 调整日志严重级别、缓冲区上限降至 512k 等。
  • 修复 kube-proxy 在 --healthz-port=0HealthzBindAddress 的校验、使用 ExecPlugin kubeconfig 导致 kubelet 启动失败、CRD 非标准复数与子资源下的创建问题、kubectl 显示设置了 nominatedNodeName 的 Pod 时 panic 等。

v1.11.3(自 v1.11.2 以来的变更)

  • Action Required:API server 与 client-go 修复 UserInfo "extra" 数据的非字母数字字符支持。双方都升级后,extra 数据中才能正确包含 / 等在 HTTP 头中不合法以外的特殊字符。
  • 外部 PV binder(例如 kube-scheduler)绑定 PV 时 PVC 可能未及时同步到 controller 本地缓存,修复了在 PVC 找不到时防止错误回收 PV 的逻辑。
  • 修复多个 apiserver 同时启动时创建系统优先级类出错、CRD 子资源的 resourceVersion 无操作写入更新、Downward API 文件注入多行 annotation 乱序等。
  • 回滚了为 Windows Pod 设置 DNS 服务器的改动(DNS 交由 CNI 插件负责)。

v1.11.4 ~ v1.11.5

  • v1.11.4 修复了 vSphere 清理函数中 sync.RWMutex 误用导致写锁实际无效的问题(补丁通过在循环内匿名函数中正确加锁并延迟解锁)、kube-addon-manager 新增 --prune-whitelist 支持(解决移除 admission webhook addon 后 MutatingWebhookConfiguration 无法清理、集群无法准入新 Pod 的问题)、apiserver panic 返回 500 而非终止进程、http/2 缓冲区调优等。
  • v1.11.5 修复了关键安全问题 CVE-2018-1002105:kube-apiserver 升级请求代理处理器(upgrade request proxy handler)的严重安全漏洞。此外 IPVS 模式开始支持基于连接的优雅终止(connection based graceful termination),GCE/GKE 负载均衡健康检查默认间隔从 2 秒调整为 8 秒、unhealthyThreshold 调整为 3。

v1.11.6 ~ v1.11.8

  • v1.11.6 引入 --nodeport-addresses(同一主机不同网卡使用相同 host port)、--ipvs-exclude-cidrs(IPVS proxier 清理规则时跳过指定 CIDR)、--cni-bin-dir 支持逗号分隔的多目录、CRD 的 spec.additionalPrinterColumns 正式进入服务端打印列能力(此字段在当前仓库源码中可见:staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/types.go 中的 AdditionalPrinterColumns []CustomResourceColumnDefinition)。
  • v1.11.7 修复调度器在大量不可调度 Pod 场景下的饥饿问题、预抢占逻辑竞态、kube-proxy 优雅终止引入的 deadlock。
  • v1.11.8 引入 apiserver 请求体大小上限:CREATE/UPDATE/PATCH/DELETE 请求体超过 100MB 返回 413 Request Entity Too Large(用最新 apiserver 库构建的自定义 apiserver 同样生效,可通过 ServerRunOptions.MaxRequestBodyBytes 调整;该限制不适用于 pods/proxy 这类代理子资源);json patch 超过 10000 个操作同样返回 413。此外 watch 不再重复发送同一批事件导致观察者"回到过去"。

v1.11.9 ~ v1.11.10

  • v1.11.9 主要修复云厂商(Azure/AWS)负载均衡与安全组问题、admission webhook 请求缺少 apiVersion/kind、kube-proxy 新增 metrics-port 命令行参数等。
  • v1.11.10 为系列最终补丁:恢复 kubectl 的 --username/--password 标志;kubelet 在资源压力下不再驱逐优先级为 system-node-critical 的静态 Pod;更新 Cluster Autoscaler 至 1.3.8;Node-Problem-Detector 配置在 GKE/GCE 上与 Kubernetes 版本解耦;多个 GCP addon(prometheus-to-sd、fluentd-gcp-scaler、event-exporter)升级以获取安全修复。

升级到 1.11 前必须处理的事项(Urgent Upgrade Notes)

文档 "Urgent Upgrade Notes" 一节(标题原样保留为 "No, really, you MUST do this before you upgrade")列出两条升级前必须确认的事项:

1. JSON 配置中字段大小写必须正确

直接与 API server 通信的 JSON 资源定义中,键名大小写敏感。Kubernetes 1.8 引入的一个 bug 曾让 API server 接受错误大小写的请求并自动纠正为正确大小写;1.11 修复了该行为,API server 恢复严格校验。严格使用 kubectl 管理资源的用户不受影响,因为 kubectl 一直强制使用正确大小写。如果你的部署管线里有手写 JSON(尤其是对非 kubectl 客户端发送的请求),升级前必须排查字段大小写。

2. Pod 优先级与抢占默认开启

PodPriority 在 1.11 默认启用,意味着任何命名空间中的 Pod 都可以请求与系统关键 Pod 竞争、甚至抢占正在运行的系统关键 Pod 的优先级类。若不希望如此,可在升级到 1.11 之前为 kube-apiserver、kube-scheduler、kubelet 同时设置 --feature-gates=PodPriority=false。但官方并不建议禁用:关键系统 Pod 依赖调度器抢占机制,在集群资源紧张时仍能获得调度。

文档 "Before Upgrading" 部分进一步给出多租户集群的配套建议:为两个默认优先级类 system-cluster-criticalsystem-node-critical 创建 ResourceQuota,限制不可信用户创建高优先级 Pod。

1.11 的主要技术主题(按 SIG 划分)

SIG API Machinery:CRD 能力大幅增强

1.11 对 CustomResource 的改进是本轮 API 机制侧的主线:

  • CRD 子资源(subresource)转 Beta 并默认启用:更新 /status 子资源时不再只是忽略 .spec.metadata 的修改,而是拒绝一切 .status 以外的字段更新;且启用 /status 子资源后,CRD OpenAPI 校验 schema 的根节点允许使用 requireddescription
  • CRD 多版本:可以定义多个版本,但没有自动转换(转换能力后来才引入,1.11 中是 NOP converter)。
  • 服务端打印列:CRD 新增 spec.additionalPrinterColumns 字段,让自定义资源在 kubectl get 时显示自定义列。该字段在今天的仓库源码中仍然可见(见上文 apiextensions v1 types 第 201 行的 AdditionalPrinterColumns 字段定义),说明其 API 形状自 1.11 起延续至今。
  • CRD 状态与 Established 竞态:新增 Establishing 控制器,避免 Established 条件与 CR 实际可服务之间的竞态;HA 部署下 Established 条件会延迟 5 秒。
  • OpenAPI v3 校验:CRD 的 OpenAPI v3 校验 schema 支持 additionalProperties(与 properties 互斥)。
  • 其他:CRD 元数据在反序列化与从 etcd 读取时进行修剪和 schema 校验;/status 子资源支持 GET 和 PATCH;mutating webhook 支持 "remove" 操作;新增 dryRun 查询参数(1.11 中设置即拒绝,为未来客户端做前向兼容);/debug/flags/v 端点支持通过 PUT 动态调整 glog 日志级别。

SIG Auth:RBAC 聚合并入 GA、凭证插件转 Beta

  • RBAC cluster role aggregation(1.9 引入)在 1.11 毕业到 stable,行为无变化;
  • client-go credential plugins 毕业到 Beta,并新增支持从外部插件获取 TLS 凭证;
  • 审计事件可携带请求处理信息:
    • 授权环节写入 authorization.k8s.io/decision(allow/forbid)与 authorization.k8s.io/reason(人类可读原因,RBAC 场景包含放行的 role/binding/subject 名称);
    • PodSecurityPolicy 准入写入 podsecuritypolicy.admission.k8s.io/admit-policypodsecuritypolicy.admission.k8s.io/validate-policy
  • NodeRestriction 准入插件新增能力:阻止 kubelet 修改自己 Node 对象上的 taints;节点不再被允许删除自己的 Node 对象(旧 kubelet 在极少数云厂商 Node ID 变化场景下会尝试删除/重建自己的 Node 对象,集群管理员可用 kubectl delete node/<nodeName> 清理,或显式授予自删除权限)。

SIG Cluster Lifecycle:kubeadm v1alpha2 与 CoreDNS 默认化

  • kubeadm 配置文件 API 从 v1alpha1 升级到 kubeadm.k8s.io/v1alpha2:1.11 仍可读 v1alpha1 并自动转换(内部转换并写回集群 ConfigMap),但 v1alpha1 读取支持将在 v1.12 移除;
  • 新增一组配置管理命令:kubeadm config migrate(客户端侧、无需集群,把旧配置升级为新版,类似 Unix 管道)、kubeadm config print-defaultkubeadm config images list / kubeadm config images pullkubeadm upgrade node configkubeadm upgrade diff
  • CoreDNS 取代 kube-dns 成为默认 DNS 提供者(kube-dns 更新到 v1.14.10,CoreDNS 版本 v1.1.3);kubeadm 生成的 CoreDNS 容器以只读方式运行并丢弃不必要的 capabilities;
  • kubeadm init 现在把结构化、带版本号的 kubelet ComponentConfiguration 写入 /var/lib/kubelet/config.yaml,并把运行时动态检测的 flags 写入 /var/lib/kubelet/kubeadm-flags.env
  • kubeadm join 现在阻塞等待 kubelet 完成 TLS Bootstrap 成功(之前只做 discovery 就退出);
  • kubeadm upgrade 修复:不再因 Pod 重启产生竞态、支持外部 etcd、升级失败后可回滚并恢复 etcd、etcd 与控制面升级使用 TLS;
  • kubeadm 支持无公网环境与其他 CRI runtime;kubeadm 检测 Docker cgroup driver 并以匹配的 driver 启动 kubelet,消除新手常见报错。

SIG Network:IPVS 与 CoreDNS 双双 GA

  • IPVS 模式集群内负载均衡毕业到 GA:用内核 hash table 替代 iptables 规则做 Pod 负载均衡;
  • CoreDNS 毕业到 GA,成为服务发现默认方案;
  • 新增 --nodeport-addresses:不同接口监听相同 host port;
  • 新增 --ipvs-exclude-cidrs:IPVS proxier 清理规则时不触碰指定 CIDR;
  • NetworkPolicy 可在同一个 peer 元素中同时携带 namespaceSelectorpodSelector,从而精确指向其他命名空间中的特定 Pod;
  • kubelet 的 --cni-bin-dir 支持逗号分隔的多个 CNI 二进制目录,按顺序查找插件。

SIG Node:动态 kubelet 配置转 Beta

  • DynamicKubeletConfig 转 Beta 并默认开启(feature gate 默认 on),但启用动态配置仍需设置 kubelet 的 --dynamic-config-dir;使用动态配置时必须指定 Node.Spec.ConfigSource.ConfigMap.KubeletConfigKey;ConfigMap 变更时 kubelet 会自动更新配置(减少静默配置漂移);
  • CRI 日志轮转转 Beta 并默认启用(针对 CRI 容器运行时);
  • Linux sysctl 支持转 Beta:Pod 与 PodSecurityPolicy 新增 sysctl 相关字段;1.11+ 的 kubelet 会忽略 alpha 时代的 sysctl annotation,存量部署必须把 annotation 迁移为 API 字段;
  • cri-tools(crictl)项目 GA,Kubernetes 将 crictl 打入 cri-tools 的 deb/rpm 包,GCE 集群默认安装 crictl;
  • Pod 状态新增 ContainersReady condition;
  • kubelet 重启后会把扩展资源(extended resource)容量置零,设备插件重连后恢复有效值;
  • 远程容器运行时 gRPC 最大消息尺寸提升到 16MB;
  • kubelet 新增 --node-status-max-images 控制 Node 状态中上报的最大镜像数(默认 50);
  • CRI 容器日志路径从 containername_attempt#.log 改为 containername/attempt#.log

SIG Scheduling:优先级抢占 Beta 化与调度器改进

  • Pod Priority and Preemption 毕业到 Beta 并默认开启,文档强调这对运维是"重大且重要的变更"(涉及 sig-release 的发布清单调整);
  • 系统关键优先级类(system critical priority classes)在集群引导时自动创建;
  • 调度器新增 --write-config-to 标志,可将默认调度配置写入文件;
  • 亲和/反亲和 predicate 性能显著优化nodeSelector.matchFields 支持(1.11 仅支持 metadata.name);
  • 新增 scheduling_latency_seconds 汇总指标,并拆分为 predicate / priority / preemption 细粒度步骤;
  • RequestedToCapacityRatioPriority:参数化的优先级函数,把 requested/capacity 比值映射到分数(利用率 0 得 10 分、利用率 100 得 0 分,点之间线性插值,默认禁用,通过 scheduler policy 配置启用);
  • DaemonSet Pod 调度(ScheduleDaemonSetPods)为 alpha 特性:启用后由调度器而非 DaemonSet controller 绑定 Pod,DaemonSet controller 只在创建时给 Pod 追加 NodeAffinity 术语(替代 .spec.nodeName),不修改 .spec.template

SIG Storage:StorageProtection GA、卷扩容 Beta

  • StorageObjectInUseProtection 毕业到 GA:Pod 仍在使用时禁止删除 PVC、PV 仍绑定 PVC 时禁止删除 PV;
  • 卷扩容(PersistentVolume 扩容)转 Beta 并默认开启:Pod 重启后增大卷容量;
  • 新增 alpha 特性:在线卷扩容(Pod 不重启直接扩文件系统,kubelet 侧在线文件系统扩容已实现);按节点类型设置最大卷数(AWS EBS 与 GCE PD 提高每节点可挂载卷上限);subpath 目录可用 DownwardAPI 环境变量创建;
  • AWS EBS、Azure Disk、GCE PD、Ceph RBD 卷插件支持动态供应裸块设备(raw block volume);Cinder 增加块设备支持;为外部 CSI 驱动提供块卷 API 支持;
  • 拓扑感知的动态卷供应:StorageClass API 增加限制动态卷拓扑的能力(allowedTopologies 的基本管道);
  • ext3/ext4 卷创建不再为 root 保留 5% 空间(mkfs 传 -m0);
  • PodSecurityPolicy 支持把 hostPath 挂载限制为只读且限定在特定路径前缀之下;
  • AWS EBS 卷可在 Pod 中以只读方式使用;gitRepo 卷不再要求 git 1.8.5+。

SIG CLI:kubectl 重构与新能力

  • 本轮主线是重构 kubectl 内部结构以提升命令的可组合性、可读性与可测试性,为后续版本的 kubectl 插件扩展机制铺路;
  • 新增 kubectl wait:等待一个或多个资源被删除或达到特定条件(--for=[delete|condition=condition-name]);
  • 新增 kubectl api-resources:发现集群中的资源,支持按 verb 过滤并输出可与 kubectl get 组合的完整资源名;
  • go template 支持 base64decode 函数:kubectl get secret SECRET -o go-template='{{ .data.KEY | base64decode }}'
  • kubectl patch 支持 --dry-runkubectl apply --prune 支持 CronJob;
  • kubectl 与 client-go 在加载 kubeconfig 时会检测 user/cluster/context 重名并报错;
  • kubectl auth can-i 退出码修正(允许返回 0,禁止返回 1);kubectl rolling-update 弃用,改用 kubectl rollout
  • 服务端打印(server-side print)默认启用,可用 --server-print=false 关闭;
  • 该版本 kubectl 依赖 apps/v1 API,不能对早于 v1.9.0 的集群工作(kubectl 只保证与 ±1 个次要版本的集群兼容)。

其他 SIG 要点

  • SIG Instrumentation:Heapster 弃用(作为迁移到新监控模型的一部分),仍依赖 Heapster 做 autoscaling 的集群应迁移到 metrics-server 与 custom metrics API;kubelet 新增 /metrics/probes 端点,以 Prometheus 指标暴露容器存活/就绪探针结果;
  • SIG Windows:Windows Pod/容器支持更多 API——Pod/Container/日志文件系统的 metrics、run_as_user 安全上下文、Azure 磁盘的本地持久卷与 fstype;依赖 Windows Server 1803 的新特性:ConfigMap/Secret 卷挂载、SMB 与 iSCSI 的 Flexvolume 插件(树外提供);
  • SIG OpenStack:内置云厂商弃用(改用树外 provider),新增 Keystone 与 RBAC 集成的改进,11 个验收测试使其成为发布 gating job;
  • SIG vSphere:云厂商支持从 Kubernetes Secret 获取凭证(替代明文 vsphere.conf)、SAML token 认证;
  • SIG Azure:支持 Standard SKU 负载均衡器与公共 IP(excludeMasterFromStandardLB 默认 true;Standard LB 与 service.beta.kubernetes.io/azure-load-balancer-mode 注解不兼容,因为除 master 外所有节点都会成为后端);支持 service.beta.kubernetes.io/azure-allowed-service-tags 注解;azuredisk PVC 可通过 kubectl edit pvc 扩容(卷已挂载到运行中 VM 时会失败);Azure 磁盘支持块设备与外部资源组;VM 名称可含下划线。

弃用、移除与毕业状态清单

1.11 新弃用(New Deprecations)

弃用项 说明
etcd2 后端 继续使用将得到警告,支持将在 v1.13 移除;应尽快把集群升到 etcd3
InfluxDB 集群监控 随 Heapster 一起弃用;建议改用 metrics-server(提供 kubectl top 与 HPA 所用的 Metrics API),长期存储需求应使用监控方案原生的 Kubernetes 支持
kubelet --rotate-certificates 改用 kubelet 配置文件的 .RotateCertificates 字段
kubeadm v1alpha1 配置 读取支持保留到 v1.11,v1.12 移除;v1alpha2.CloudProvider.PrivilegedPods 字段被删除(前者改用树外云厂商 beta,后者可在 /etc/kubernetes/manifests/ 中为 apiserver 与 controller-manager 设置 .SecurityContext.Privileged=true
MasterConfiguration 的 Token 相关字段 重构为 BootstrapTokens 切片,对象内含 .Token.TTL.Usages.Groups
.NodeName/.CRISocket 迁移为 .NodeRegistration.Name/.NodeRegistration.CRISocket.NoTaintMaster 被删除
.AuthorizationModes v1alpha2 中移除;用 .APIServerExtraArgs/.APIServerExtraVolumes 替代(v1alpha1 文件自动升级并保留信息)
注解 service.alpha.kubernetes.io/tolerate-unready-endpoints 改用 Service.spec.publishNotReadyAddresses
kubectl --show-all v1.11 中已无实际作用(inert),未来移除
kubectl rolling-update 改用 kubectl rollout
kube-apiserver --endpoint-reconciler-type 默认值变为 leasemaster-count 类型弃用,1.13 移除
OpenStack 内置云厂商 改用树外 OpenStack provider
kubelet --allow-privileged 默认值改为 true,便于向 PodSecurityPolicy 过渡
client-go 旧 dynamic client 新 dynamic client 已取代,旧版仅保留一个版本于 client-go/deprecated-dynamic
OpenStack 内置凭证支持 改用 cloud-provider-openstack 的 client-keystone-auth
GitRepo 卷类型 弃用;替代方案:InitContainer 中 git clone 到 EmptyDir,再挂入业务容器
PV 节点亲和的 alpha annotation 升级前必须迁移到 beta 的 PersistentVolume.nodeAffinity 字段

1.11 移除的弃用项(Removed Deprecations)

  • kubeadm v1alpha2 中移除 .ImagePullPolicy(固定为 IfNotPresent;需要 Always 效果时在 kubeadm init 前执行 kubeadm config images pull,离线环境可 docker load 预载镜像);
  • kubeadm 移除从未使用的 .Etcd.SelfHosting
  • 移除已弃用且不活跃的 --enable-custom-metrics
  • 移除早在 #32894 就弃用的 --include-extended-apis
  • kubelet 不再在 node spec 中写 externalID(自 v1.1 起弃用);
  • 移除 initresource 准入插件;
  • core API 组移除 ObjectMetaListOptionsDeleteOptions,改从 meta/v1 引用;
  • check-network-mode 移除弃用的 --mode 标志;
  • 移除自 1.10 弃用的 alpha.kubernetes.io/nvidia-gpu 资源,改用 DevicePlugins 暴露的 nvidia.com/gpu
  • kube-cloud-controller-manager 移除 --service-account-private-key-file(改用 --use-service-account-credentials;kube-controller-manager 中该标志仍保留);
  • 移除自 1.10 弃用的 rknetes 代码(用 rktlet 和 CRI 替代);
  • 移除 ScheduleDaemonSetPods alpha 特性关联的 DaemonSet 调度(该特性在 1.11 重新以 alpha 引入);
  • 移除 METADATA_AGENT_VERSION 配置项;
  • 移除允许 controller manager 批准 kubelet 服务端证书的 alpha 能力(应改为自动化校验/批准节点证书签名请求)。

毕业到 Stable/GA 的特性

  • IPVS 集群内负载均衡(GA);
  • CoreDNS 成为 Kubernetes DNS 插件(GA);
  • Azure Go SDK 到稳定版(GA);
  • ClusterRole 聚合(GA);
  • CRI 校验测试套件(GA);
  • StorageObjectInUseProtection(GA)。

毕业到 Beta 的特性

  • 树外/外部云厂商支持(beta);
  • Pod 重启后扩容 PersistentVolumes(beta);
  • sysctl 支持(beta);
  • Azure VM Scale Sets(beta);
  • Azure 对 Cluster Autoscaler 的支持(beta);
  • 限制节点对 API 的访问(beta);
  • CRD 版本化(beta);
  • CRI 的 Windows 容器配置(beta);
  • CRI 日志与统计(beta);
  • 动态 Kubelet 配置(beta,DynamicKubeletConfig gate 默认开启);
  • CRI 容器日志轮转(beta,默认开启);
  • PriorityClass API 提升到 scheduling.k8s.io/v1beta1
  • priorityClass 特性转 beta;
  • client-go credential exec 插件(beta);
  • 自定义资源子资源(beta,默认启用)。

1.11 新增 alpha 特性

  • kube-scheduler 调度 DaemonSet Pod;
  • 在线 PersistentVolume 扩容(无需离线);
  • 设置节点最大卷数;
  • subpath 挂载中的环境变量展开;
  • Pod 容器以特定 group 运行(RunAsGroup);
  • token 绑定到 service 请求;
  • kubelet --experimental-qos-reserve--qos-reserved / kubeletconfig 的 QOSReserved 字段替代,需启用 QOSReserved feature gate。

其他重要变更与已知问题

升级兼容性要点(Before Upgrading 摘要)

除上文两条紧急事项外,文档还列出若干需要代码或配置跟进的行为变化:

  • 审计事件中 metav1.Status 响应不再整体拷贝:只记录 statusreasoncode 三个字段。例如 kubectl get pods abc 返回 404 Status 对象时,1.11 起审计事件只含这三个字段,依赖旧行为的解析代码必须更新;
  • client-go HTTP transport 使用 context.Context 取消 dial 操作k8s.io/client-go/transport/Config 结构更新为接受带 context.Context 参数的函数,使用到该字段的代码属于破坏性变更;
  • 默认挂载传播(mount propagation)从 HostToContainer(rslave)改回 None(private),与 1.9 及更早行为一致;1.10 的默认值曾导致部分 Pod 回归问题。依赖 rslave 默认行为的一方需显式设置;
  • kube-apiserver --storage-version 标志移除,必须改用 --storage-versions
  • 聚合 API server 作者不能依赖 kube-apiserver 做授权,必须自行做委托授权;
  • GC 控制器受 QPS 限制(之前不受限),需要更高 GC QPS 的集群要显式设置;
  • PersistentVolumeLabel 准入控制器默认禁用(AWS/GCE 用户依赖该功能时须加入 --enable-admission-plugins);
  • kubeadm 集群的 kubelet 默认关闭 10255 只读端口,改用 10250 安全端口 + ServiceAccount token(例如访问 kubelet /metrics);
  • kubelet 4194 端口的 cAdvisor Web UI 默认关闭--cadvisor-port=0),--cadvisor-port 将在 v1.12 移除;推荐以 DaemonSet 方式部署 cAdvisor;
  • kubeadm kubelet drop-in 结构大改(见 "SIG Cluster Lifecycle" 小节):结构化配置 /var/lib/kubelet/config.yaml + 环境文件 + KUBELET_EXTRA_ARGS/etc/default/kubelet/etc/sysconfig/kubelet)。

已知问题(Known Issues)

  • IPVS 模式的 kube-proxy 尚不支持为 terminating Pod 优雅关闭连接(后续版本修复——事实上 v1.11.5 的 changelog 已包含 IPVS 基于连接的优雅终止支持);
  • 某些环境下 kube-proxy 需要配置覆盖 hostname;
  • VPA(alpha)用户在 1.12 将大幅改实现,1.11 的 VPA 配置无法自动迁移到 1.12,提前使用 VPA 的用户需知晓。

外部依赖版本对照

文档 "External Dependencies" 一节给出 1.11 相对 1.10 的依赖变化,部署与兼容性问题排查时可作参考:默认 etcd 服务器版本 v3.2.18(1.10 为 v3.1.12);Rescheduler v0.4.0(1.10 为 v0.3.1);Go 构建版本 go1.10.2(1.10 为 go1.9.3),最低支持 go1.9.1 不变;CNI 保持 v0.6.0;CSI 从 0.2.0 升到 0.3.0;Heapster v1.5.2(1.10 为 v1.5.0);Cluster Autoscaler v1.3.0(1.10 为 v1.2.0);kube-dns v1.14.10;CAdvisor v0.30.1(1.10 为 v0.29.1);CoreDNS v1.1.3;Ingress GLBC v1.0.0;OIDC 认证 coreos/go-oidc v2 不变;Calico v2.6.7 不变;hcsshim 升到 v0.6.11;Istio addon 从 0.5.1 升到 0.8.0;验证通过的 Docker 版本与 1.10 相同(1.11.2–1.13.1 与 17.03.x)。

Bug 修复精选(General Fixes and Reliability)

1.11 的修复清单很长,以下按模块归纳对生产环境影响较大的一类:

API server / 存储层

  • 并发 GET/LIST 请求携带非空 resourceVersion 时 apiserver panic(修复);
  • 返回 0 条目的 ListRequest 中 ResourceVersion 传播不正确(修复);
  • JSON patch 包含越界操作时的 panic(修复);
  • 补丁自定义资源时 "unable to find api field" 的误报(修复);
  • 垃圾回收控制器潜在死锁(修复);
  • 修复 CRD 的 OpenAPI schema 不正确问题;
  • KUBE_API_VERSIONS 环境变量不再被识别(测试用;运行时应使用 runtime-config 标志)。

调度

  • 调度器 informer 接收不到全集群 Pod 事件(修复);
  • 亲和/反亲和 predicate 多处竞态与自亲和处理错误(修复);
  • Pod affinity nodeSelectorTerm.matchExpressions 允许为空且按文档语义处理(nil/空 不匹配任何对象);
  • extender 不可用时仍然继续调度;
  • 请求 *kubernetes.io 前缀资源、但无节点暴露该资源时,Pod 保持未调度(不再异常);
  • --leader-elect 恢复为 true(修复回归)。

kubelet / 存储

  • v1.JobSpec.backoffLimit 回归修复(此前导致失败的 Job 被无限重启);
  • PersistentVolume.NodeAffinity.NodeSelectorTerms 被 AND 而非 OR 处理(修复);
  • NFS PV 回收时的潜在无限循环(修复);
  • subpath 只读挂载在 SELinux 系统、以及卷挂载路径已存在于容器镜像中的失败(修复);
  • subpath 挂载中 UNIX socket 等特殊文件(修复);
  • 修复容器化 kubelet 的 nsenter GetFileType 问题;
  • 网络中断/变更后 kubelet 更新 Node 状态卡死(修复)。

kubectl / 工具链

  • kubectl delete 不再使用 reapers,完全依赖服务端 GC;
  • kubectl auth can-i 退出码修正;
  • kubectl drain --timeout 在驱逐(eviction)路径下的修复;
  • kubectl top nodes 缺失节点行的修复;
  • 服务端打印的列对齐修复;
  • kubectl create secret/configmap --from-file 在 Windows 上支持完整路径。

1.11 变更在源码中的落点

对于想核对这些 1.11 特性最终形态的读者,当前仓库提供了直接的源码坐标(注意:本仓库主干是远晚于 1.11 的版本,下列路径用于确认"特性 API 形状自 1.11 引入后延续至今",而非 1.11 当时的代码):

  • CRD 打印列staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/types.gospec.additionalPrinterColumns 对应的 AdditionalPrinterColumns []CustomResourceColumnDefinition(约第 201 行),即 1.11 引入的服务端打印列字段;
  • 特性门(feature gates)体系pkg/features/kube_features.go 集中定义了 kube-apiserver/kube-controller-manager/kube-scheduler/kubelet 各自的 feature gate 及其默认值。1.11 文档中反复出现的 "feature gate 默认值变化"(如 DynamicKubeletConfigSysctlsPodPriority)正是这一机制的产物;从源码结构看,1.11 中"默认开启"的 gate 在后续版本大多已固化为默认行为甚至移除 gate 本身,检索该文件可确认某个 gate 在当前版本的状态;
  • 准入插件注册与默认集合--enable-admission-plugins / --disable-admission-plugins 取代 --admission-control 后,Priority 等插件的默认启用逻辑位于 kube-apiserver 的选项与插件装配代码中(cmd/kube-apiserverstaging/src/k8s.io/apiserver 相关路径),与 1.11 changelog 中 "v1.11.1 起 Priority 默认启用" 的说明相互印证。

适用前提与使用建议

  • 本文全部内容基于 CHANGELOG-1.11.md,该文件属于发布记录文档,描述的是 1.11 系列当时的行为;当前仓库主干代码是更新的版本,行为可能已经演进(例如 1.11 中仍为 beta/alpha 的特性,今天可能已是 GA 或被移除)。
  • 若你的集群仍在 1.11 系列(或从 1.11 升级而来),优先核对三件事:JSON 字段大小写PodPriority 默认开启带来的多租户优先级配额kubeadm v1alpha2 配置迁移;若集群使用 GCE/GKE 的 addon,v1.11.10 中的 addon 安全升级(prometheus-to-sd v0.5.0、fluentd-gcp-scaler v0.5.1 等)值得跟进。
  • 二进制完整性校验:v1.11.0 ~ v1.11.3 用文档给出的 sha256 列,v1.11.4 ~ v1.11.10 用 sha512 列,按各自版本的表格取值。
  • 本仓库中 1.11 的变更说明可通过 CHANGELOG/README.md 的目录索引与其他版本(如 CHANGELOG-1.10.mdCHANGELOG-1.12.md)交叉阅读,以完整还原跨版本的升级路径。
登录后查看全文
热门项目推荐
相关项目推荐