Kubernetes 1.11 发布全解:v1.11.0 到 v1.11.10 的版本演进、升级注意事项与源码级细节
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.gz及kubernetes-node-windows-amd64.tar.gz; - 另有完整的
kubernetes.tar.gz与kubernetes-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-system:
system-node-critical与system-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=0时HealthzBindAddress的校验、使用 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-critical 与 system-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 的根节点允许使用required与description。 - 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-policy与podsecuritypolicy.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-default、kubeadm config images list/kubeadm config images pull、kubeadm upgrade node config、kubeadm 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 元素中同时携带
namespaceSelector与podSelector,从而精确指向其他命名空间中的特定 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 状态新增
ContainersReadycondition; - 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-run;kubectl 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/v1API,不能对早于 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 |
默认值变为 lease;master-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 组移除
ObjectMeta、ListOptions、DeleteOptions,改从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,
DynamicKubeletConfiggate 默认开启); - CRI 容器日志轮转(beta,默认开启);
PriorityClassAPI 提升到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字段替代,需启用QOSReservedfeature gate。
其他重要变更与已知问题
升级兼容性要点(Before Upgrading 摘要)
除上文两条紧急事项外,文档还列出若干需要代码或配置跟进的行为变化:
- 审计事件中
metav1.Status响应不再整体拷贝:只记录status、reason、code三个字段。例如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.go 中
spec.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 默认值变化"(如
DynamicKubeletConfig、Sysctls、PodPriority)正是这一机制的产物;从源码结构看,1.11 中"默认开启"的 gate 在后续版本大多已固化为默认行为甚至移除 gate 本身,检索该文件可确认某个 gate 在当前版本的状态; - 准入插件注册与默认集合:
--enable-admission-plugins/--disable-admission-plugins取代--admission-control后,Priority等插件的默认启用逻辑位于 kube-apiserver 的选项与插件装配代码中(cmd/kube-apiserver与staging/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.md、CHANGELOG-1.12.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