![Kubernetes Release Note 解读(1.15, 1.16)](https://static001.infoq.cn/resource/image/bd/ce/bd76adf2434a000a36a3951c1d970ace.png)
本文作者 | 张晓宇、黄珂、鲁金达、李传云、陈俊、高相林
前言
Kubernetes v1.15 由 25 个增强功能组成:2 个进入稳定,13 个进入 Beta,10 个进入 Alpha。
Kubernetes v1.16 由 31 个增强功能组成:8 个进入稳定,8 个进入 Beta,15 个进入 Alpha。
因此从 1.14 尽快升级至 1.16 非常必要,以下将一一进行解读。
Node
1.15
已废弃的 kubelet 安全控制参数 AllowPrivileged、HostNetworkSources、HostPIDSources 和 HostIPCSources 已被移除。取而代之的是一些准入控制(例如 PodSecurityPolicy)来增强这些限制;
已弃用的 kubelet 启动参数
--allow-privileged
已被删除,相关 kubelet 脚本需要同步进行清理;kubelet 仅收集节点、container runtime、kubelet、Pod 和容器的 cgroups metrics。
1.16
Node 的 labels beta.kubernetes.io/metadata-proxy-ready, beta.kubernetes.io/metadata-proxy-ready 和 beta.kubernetes.io/kube-proxy-ds-ready 将不再打给新的 Node,而被以下 label 替换:
kubelet 的功能启动参数
HugePages
,VolumeScheduling
,CustomPodDNS
和PodReadinessGates
已经被移除。--containerized
在 1.14 被废弃,在 1.16 正式被移除。Node 的 label
beta.kubernetes.io/os
和beta.kubernetes.io/arch
在 1.14 被废弃,在 v1.18 将正式被移除。cadvisor metric 的 pod_name 字段 container_name 被 pod 和 container 替代,所有 Prometheus 相关的查询需要做相关更新升级。
scheduler
1.15
当 QOS 为 Best effort 的 Pod 的 Tolerations 出现冲突时,即它的 key 和 effect 均相同,则用使用最后一个 Toleration 作为最终调度的依据。
PodAffinity 的性能优化,提升了约两倍。
1.16
调度器使用 v1beta1 Event API。涉及改 API 的相关的工具需要同步更新。
Pod 打散限制已经进入 alpha 阶段。用户可以通过这些限制在整个集群对 Pod 进行打散部署。
CRD
1.16
Custom resources:CRD 作为对 Kubernetes 的扩展,被广泛运用。自 v1.7 版本起,CRD 已经在 Beta 版中可用。在 1.16 版本中,CRD 正式步入 GA 阶段(稳定阶段)。
Admission webhook:Admission webhooks 作为 Kubernetes 扩展机制被广泛使用。自 v1.9 版本以来已经在 Beta 版中可用。在 1.16 版本中,Admission webhook 也正式步入 GA 阶段(稳定阶段)。
Overhauled metrics:Kubernetes 广泛使用一个全局 metrics registry 来注册要公开的 metrics。通过实现 metrics registry,metrics 可以以更透明的方式注册。而在这之前,Kubernetes metrics 被排除在任何稳定性需求之外。
Volume Extension:新版本有大量和 Volume 及 Volume 修改相关的增强。CSI 规范中对 Volume 调整的支持正在转向 Beta 版,它允许任何 CSI spec Volume plugin 都可以调整大小。
API Server
1.16
PodPriority 默认为 true,相关 featuregate 将在 1.18 被废除。
WatchBookmark 特性进入 beta 阶段,并默认开启。该功能修复了长时间没有获得 event 的 Watch 请求在下一次 Watch 请求时需要重新 List 资源的问题。
API changes
所有 apps/v1beta1 和 apps/v1beta1 下的资源,使用 apps/v1 替代。
位于 extensions/v1beta1 下的资源 daemonsets, deployments, replicasets, etc. 使用 apps/v1 替代。
位于 extensions/v1beta1 下的资源 networkpolicies,使用 http://networking.k8s.io/v1 替代。
位于 extensions/v1beta1 下的资源 podsecuritypolicies,使用 policy/v1beta1 替代。
使用 --runtime-config 标志可以临时启用这些资源(不建议使用,建议切换到更稳定的 Scheme 版本):
这些资源的 API 将在 1.18 中被完全删除。
Aggregated discovery requests 现在会 timeout. Aggregated API servers 必须在 5 秒内完成 discovery calls。(其他请求可以长一些)
使用启动参数 EnableAggregatedDiscoveryTimeout=false
可以将超时时间延长至之前的 30 秒。但是 EnableAggregatedDiscoveryTimeout
将会在 1.17 时被移除。
storage
1.15
之前要想使用 CSI,只能通过 PV 和 PVC 组合的方式。有了 Inline CSI volume 这个能力,可以在定义 Pod 的时候,声明一个与其密切相关的 CSI Volume。Volume 随着 Pod 的创建而创建,Pod 的销毁而销毁。
在新建 PVC 时,可以克隆已经存在的一个 PVC,包括卷的规格以及卷的数据。可用于数据迁移,构建模拟线上环境等场景。需要注意的是该能力只会支持 CSI,In-tree 插件和 FlexVolume 不会有支持。
同时 storage sig 也一直在为 In-tree 存储插件迁移到 CSI 而努力,点击了解更多。
过去 kubelet 通过定期扫描文件方式采集 ephemeral-storage 空间使用情况。在 1.15 中引入了 project quotas。project quota 相比定期扫描方式,拥有更快的速度和准确性。如果文件被打开,后来删除了,扫描的方式是无法追踪到它,实际文件还占着空间,点击了解更多。
未来,还可以利用 project quotas 的能力,来强制限制每个 Volume 可使用的空间(拒绝达到空间后的 IO 写操作)。这样可以避免因为某个不重要的容器的存储写满,导致整个 Pod 被驱逐的情况,也更加贴近 “isolation” 的语义。
Feature 稳定性变化
PVs 在线容量调整进入 Beta 阶段。
在线容量调整,可以在 Pod 不进行重建的情况下,完成容量的扩容。
SubPath 支持使用环境变量进入 Beta 阶段。
利用 subPath 可以实现多个 Pod 使用同一 Volume 的子路径。使用 subPathExpr 参数,可以使用 Downward API 环境变量来为每个 Pod 构建独特的子路径。比如以每个 Pod 的 Name(subPathExpr: $(POD_NAME) 将 Volume 的子路径绑定到 Pod 的同一个挂载点,实现 Pod 间数据的隔离。
1.16
CSI 支持 Windows。Windows 用户福音,从 1.16 开始,CSI 也支持 Windows node 了。
克隆 PVC 进入 Beta 阶段。
Ephemeral Inline CSI volumes 支持进入 Beta 阶段。
CSI Volume resizing 支持进入 Beta 阶段。
Network
1.15
kube-proxy 允许在使用 ipvs 时无感重启、切换模式时不再自动清理规则、禁用 UDP 平滑终止。
service.spec.externalName 允许结尾有个 dot。
1.16
IPv4/IPv6双栈(alpha)
可以将 IPv4 和 IPv6 地址分配给 Pods 和 Services,为 IPv6 化进程迈出重要的一步,在 Kubernetes 集群上启用 IPv4/IPv6 双协议栈可提供下面的功能:
每个 pod 分配一个 IPv4 和 IPv6 地址;
可使用支持 IPv4 or IPv6 的 Service;
Pod 的出站流量可通过 IPv4 和 IPv6 路由。
EndpointSlice API(alpha)
当前的一个 Service 对象在实现上对应了一个 K8s Endpoints 对象,该对象包含了所有的 backend Pods 信息,随着 backend Pods 的规模的增大,单个 backend Pod 的 Add/Update/Delete 对管控组件 (apiserver, etcd, endpoints-controller, kube-proxy) 会造成很大的压力。
通过引入 EndpointSlice API,将 backend Pods 信息分片放入不同 EndpointSlice (一个 Service 包含多个 EndpointSlice 对象,一个 EndpointSlice 包含多个 Endpoint <一个 Endpoint 对应一个 backend 实例信息> - 默认最多 100 个) 解决性能问题的同时也为提供其他网络特性保留了高度的扩展性,如在 Endpoint 中包含了 backend 服务实例的拓扑位置信息 (region, zone,hostname 等) 可以用来帮助就近路由访问 Service 的请求。
对于 Service LoadBalancers 的 Finalizer Protection 进入 beta 阶段
这个功能确保 Service 资源对象不会被彻底删除直到相关的 load balancer 被删除。
API Changes
NetworkPolicy: extensions/v1beta1 弃用,用 networking.k8s.io/v1 API 替代;
Ingress: extensions/v1beta1 弃用,用 networking.k8s.io/v1beta1 API 替代。
本文转载自云栖社区。
原文链接:
https://yq.aliyun.com/articles/748085
评论