Kubernetes 1.21 震撼发布 | PSP 将被废除,BareMetal 得到增强

美国时间 4 月 8 日,Kubernetes 1.21 正式发布。此版本更新距离上版本发布时隔 4 个月,是 2021 年的第一个新版本。受新冠疫情和国际形势变化影响以及发布团队的全球化性质,发布过程也经历了非常大的挑战。

新版本包含 51 个 enhancements「1.20 版本 43 个、1.19 版本 34 个」其中 13 个功能升级为稳定版,16 个已有功能进行优化,另有多达 20 个全新功能,2 个不推荐使用功能。

如果说 Kubernetes 1.20 是最酷的版本,那么如期而至的 Kubernetes 1.21 更进一竿,在多个方面实现重大突破,也带来以下几方面意义非凡的变化和看点:

01

PSP 在 1.21 废

未来会在 1.25 中移除

Pod Security Policy 作为 Kubernetes 目前常用的安全策略管理和授权机制,在一些限制存储和网络特权使用的场景中,此功能提供了诸多便利。但社区结合功能使用情况,发现它对目前存在的版本不兼容等问题,因此做出了以上决定。

用户不得不引入外部安全组件,社区也正在设计新的原生安全机制,Pod Isolation Policy 设计讨论中。

02

Bare Metal 增强相关

GracefulNodeShutdown 升级为 Beta 版本

节点优雅关闭 「GracefulNodeShutdown」功能是在 Kubernetes 1.20 版本中以 Alpha 发布的。该功能解决了节点关机的时候许多用户和集群管理员在集群迁移以及维护时所面临的问题。

由于实际使用中 Pod 常常无法遵循其自身的生命周期。其一方面是节点因为某些情况需要关闭时,由于 Pod 无法知道节点将要关闭,节点上的 Pod 将会一瞬间全部 Down 掉。这可能极大地影响业务的正常稳定运行。

该功能通过使 Kubelet 感知节点的关闭事件,可先抑制关机动作然后以正常的流程终止运行的 Pod 使其有了关闭的宽限时间,再能让 Pod 提早调度到其他节点,以提高系统整体稳定性。

该功能也是一体机物理机 Kubernetes 集群生产级服务的必备特性,因此在该功能从 Alpha 到 Beta 的过程,DaoCloud 在经过生产级别的大量验证后发现并修复了一些存在的 Bug,最终保障其能够在生产环境使用,并且能够有效的提升服务器下线时整体服务的稳定性。

🔗 详细设计稿参考:

https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/2000-graceful-node-shutdown

03

Bare Metal 相关

新内存管理组件,增加对 hugepage 的支持

Kubelet 中提供了一个新的 Memory Manager 内存管理组件,以确保为 Guaranteed Pod 分配内存和 hugepages。它仅对保证的 QoS 类中的 Pod 起作用。

这对于内存优化对性能至关重要的应用程序很有用,比如使用 DPDK、数据库或虚拟机进行数据包处理。新的内存管理器还充当拓扑管理器的提示提供程序。该功能对单 NUMA 和多 NUMA 做了相应适配支持。

除此之外,关于物理机场景,社区还会在后续版本一些场景适配的功能,例如 Swap 开启的支持等。

🔗 详细设计稿参考:

https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/1769-memory-manager

🔗 图片来源:

https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/1769-memory-manager/mm_tm_diagram.png

04

服务网格场景增强

默认容器注解支持

之前的版本中,第一个容器会被被视为Pod的默认容器。如果执行一些针对容器的命令 ,不指定容器的时候会选择默认容器执行。

在服务网格场景中,也就是使用 Service Mesh 时,Pods 初始状态就拥有两个或者两个以上的容器:主容器和流量控制边车容器。这会使一些管理任务复杂化,例如读取日志 kubectl logs或使用 kubectl exec 到容器内执行命令都会默认到第一个容器,而通常容器组的容器列表的顺序是不被保证的。(因此如果没有带上 `-c` 或者 `–container`选项,它将使用默认容器,而默认容器是不能设置的)。

而 1.21 之后的版本中,我们可以通过新的注解 kubectl.kubernetes.io/default-container 添加到 Pod 来定义默认容器。提出此需求的正是 John Howard , Istio 项目的维护者,也是头号贡献者。

 

05

双栈功能

进入 Beta

Kubernetes 双栈支持在 1.18 提供了 alpha 支持,之后 1.20 进行了重构,在 1.21 升级为 Beta,容器组可以同时拥有 IPv4 和 IPv6 地址,这需要配合 CNI 使用。

服务 Service 既支持 IPv4 也支持 IPv6,节点 IP 也做了相应的双栈支持。当然双栈还存在一些支持上问题,比如目前 APIServer 只支持单栈等。

 

06

ReplicaSet

缩容删除顺序可控

容器组删除开销可以通过注解 controller.kubernetes.io/pod-deletion-cost 定义到 Pod 上,在触发 ReplicaSet 副本数减少时,如果该注解已经设置,会根据该注解决定删除顺序。

服务灰度发布过程等场景,用户可以使用该功能控制应用容器组的清理顺序,让升级等场景变得更可控。

 

07

存储卷健康 

Alpha

该功能提供 PV 运行状况监控能力,在 PV 运行状态不健康时对其进行标记。该功能包含两部分实现,一部分在 Kubelet 中,另一部分在外部的存储管理器中。

功能实现是 CSI 的一部分,启用该功能需要开启 Feature Gate CSIVolumeHealth。

 

08

调度器加速

优先调度到提名节点 Alpha

优先调度到提名节点 Alpha「默认不会开启,仅使用抢占式调度场景」在大型集群中调度 Pod 时,评估所有节点以寻找最佳候选节点可能会很耗时。为了加快此过程,此功能在在 Pod 中使用 .status.nominatedNodeName 字段指定首选节点。

如果 Pod 无法调度到提名节点上,调度器按照常规调度算法将 Pod 调度到集群中的其余节点。

⚠️ 注意: 关键 Pod 依赖调度器抢占机制以在集群资源压力较大时得到调度。因此不建议禁用抢占。

 

09

带索引的任务

Indexed Job

Indexed Job 对应的 Pod 容器组在创建时会带上 `batch.kubernetes.io/job-completion-index`,以 completions = 3 为例,索引从 0 到 2 依次设置。当所有 Pod 都成功完成,Indexed Job 才被认为完成。

 

10

Network Policy 

支持端口范围

随着大家对安全问题的重视,Network Policy 的使用越来越多,该功能可更方便的设置端口允许范围。如下示例中,port-endPort 范围的端口都包含在这一条网络规则中。

 ports: 
 - protocol: TCP
   port: 32000
   endPort: 32768

>>>> 其他需要了解的功能

  • [security] 新增 Admission controller DenyServiceExternalIPs 允许客户禁用 External IP
  • [apps] 不可变 Secret/ ConfigMap 功能 GA
  • [apps] CronJob 功能 GA
  • [security] PodDisruptionBudget 功能 GA,apiVersion 请使用 policy/v1
  • [apps] TTLAfterFinished FeatureGate GA,对应 Job 的字段 .spec.ttlSecondsAfterFinished
  • [apps] RunAsGroup 字段 GA
  • [node] Sysctl FeatureGate GA,对应容器组字段 spec.securityContext.sysctls,需注意的是 unsafe sysctl 并不推荐使用。
  • [node] 结构化日志支持 GA,目前只有 kubelet 完成了日志的结构化支持,其他组件会在后续版本支持。
  • [node] kubelet 中移除了 cAdvisor JSON metrics 支持
  • [apiserver] 限制可以附加到 Lease 的对象数量,该限制对性能有很大提升,部分环境 ETCD 压力下降超过一半。
  • [apiserver] kube-apiserver 增加了 UUID 特征 alpha。
  • [apiserver] apiserver 重启后 watch 缓存的快速恢复
  • [apiserver] 新增命名空间默认标签 kubernetes.io/metadata.name
  • [storage] GenericEphemeralVolume 功能 Beta,临时存储卷。
  • [storage] 调度增强了对存储卷容量和节点存储容量的考量
  • [storage] PVC 和PV 绑定选择过程优化,减少不必要的存储空间浪费。
  • [cli] kubectl 在请求头带上了 KUBECTL 相关的信息
  • [auth] ServiceAccountIssuerDiscovery 功能 GA,
  • [service] ServiceLoadBalancerClass 支持自定义负载均衡网关类型。
  • [service] Topology Aware Hints 功能作为 1.20 废弃的 topologyKeys 的替代方案,能够实现流量感知,例如把流量导向本地 EndPoint 来节约开销提升性能。

>>>> DaoCloud 贡献功能

本次发布中,DaoCloud 重点贡献了 Bare Metal 和服务网格相关的内容,具体功能点如下:

  • 节点优雅关闭功能 GracefulNodeShutdown 升级为 Beta 版本,修复 8 个 bug,并增加 e2e 测试。
  • 默认容器注解支持功能的设计和开发。
  • 双栈相关:kubeadm 双栈支持开启;kubeadm 对网段的检查,对 ipv6 site-local 网段给出相应提示;本地 DNS 缓存的 ipv6 支持版本 1.17.0 升级。
  • kubelet 的 cAdvisor JSON metrics API 废弃。
  • Pause 统一支持容器跨平台(linux 各个架构 amd 、arm等和 windows 支持)支持 k8s.gcr.io/pause:3.4.1
  • kubeadm 安装和节点添加过程的检查项增加与完善

>>>> 版本标志

Kubernetes 1.21 发布的徽标描绘了发布团队的全球化性质。发布团队成员来自 UTC + 8 到 UTC-8 的不同时区,发布团队的多样性也给新版本发布带来了很多挑战,但是团队最终解决了这些挑战。

发行徽标中的七边形地球仪标志着社区克服挑战的绝对决心。它庆祝了发布团队在过去几个月中惊人的团队合作,带来了一个有趣的 Kubernetes 发布版本!

徽标由来自印度的独立设计师 Aravind Sekar 设计「Aravind 帮助 PyCon India 等开源社区进行设计」

>>>> 社区贡献排名

2020.12.9 – 2021.4.9

贡献者是 Kubernetes 的核心。从可能到可为,从理念到繁荣,科技向善不仅仅是信仰与口号,更是行动与奉献。DaoCloud 公司内部早已设有开源贡献团队,长期跟踪关注并持续为 CNCF 旗下项目社区贡献代码,推动项目的健康发展。

未来,DaoCloud 将继续与社区一同推广云原生技术,实现将最前沿的模式自由化的愿景。我们也将继续用实际行动体现自己的独特价值,为整个行业做出更多的贡献。

🔗 本文参考资料来源:

https://github.com/kubernetes/sig-release/blob/master/releases/release-1.21/release-notes/release-notes-draft.md

🔗 关于新版本的更多内容,请查看官方文档:https://kubernetes.io/blog/

 

作者简介

Paco Xu. 

DaoCloud 架构师/ AD 团队 Leader

Kubernetes Kubeadm「Cluster-Lifecycle SIG」, Reviewer

 

张世明 

Kubernetes SIG Node, Member

Istio、Knative、KubeEdge Member