Kubernetes 1.22 新特性预览

Kubernetes 1.22 将于 8 月 4 日发布,本文带你一起来看看这个版本带来的新特性,以便你为新版本的测试升级做好准备。

删除一系列已弃用 API

Kubernetes 1.22 最大的变化之一是删除了一系列已废弃的 API,包括:

  • Beta 版的 ValidatingWebhookConfigurationMutatingWebhookConfiguration (admissionregistration.k8s.io/v1beta1 应迁移到 admissionregistration.k8s.io/v1)
  • Beta 版的 CustomResourceDefinition (apiextensions.k8s.io/v1beta1 应迁移到 apiextensions.k8s.io/v1)
  • Beta 版的 APIService (apiregistration.k8s.io/v1beta1 应迁移到 apiregistration.k8s.io/v1)
  • Beta 版的 TokenReview (authentication.k8s.io/v1beta1 应迁移到 authentication.k8s.io/v1)
  • Beta 版的 SubjectAccessReview, LocalSubjectAccessReview, SelfSubjectAccessReview (authorization.k8s.io/v1beta1 应迁移到 authorization.k8s.io/v1)
  • Beta 版的 CertificateSigningRequest (certificates.k8s.io/v1beta1 应迁移到 certificates.k8s.io/v1)
  • Beta 版的 Lease (coordination.k8s.io/v1beta1 应迁移到 coordination.k8s.io/v1)
  • All beta Ingress (extensions/v1beta1networking.k8s.io/v1beta1 应迁移到 networking.k8s.io/v1)

为避免应用中断,上述 API 的迁移应该在你升级 Kubernetes 集群之前完成。你可以借助 kubectl convert 命令来帮你自动完成上述 API 版本的转换,如:

kubectl convert -f ./legacy-ingress.yaml --output-version networking.k8s.io/v1

关于这些 API 的详细说明可以参考 Kubernetes API 文档官方博客

Kubernetes 发布周期变更

受 COVID-19 的影响,从 2021 年 4 月 23 日起,Kubernetes 的发布周期正式从每年 4 个版本减少到每年 3 个版本。比如下一年(即 2022 年)的发布计划将为:

Week Number in Year Release Number Release Week
1 1.24 1 (January 03)
15 1.24 15 (April 12)
17 1.25 1 (April 26)
32 1.25 15 (August 09)
34 1.26 1 (August 22
49 1.26 14 (December 06)

client-go 凭据插件 GA

client-go 凭据插件 自 1.11 开始 Beta 到 1.22 正式 GA。很多之前的缺陷在这个版本得到修复,并且交互式登陆的流程得到完善。除此之外,一些云厂商的凭据插件也正式切换到独立的实现中(如 Azure 凭据插件已切换到 kubelogin)。

Pod Security Policy 替代

Pod Security Policy 已在 1.21 版本中宣布弃用,作为替代,1.22 引入了内置的 Pod Security Admission 控制器以及新的 Pod Security Standards 标准。Pod Security Standards 应用在命名空间级,它支持三种不同的策略,即:

Profile Description
Privileged 无限制策略,提供尽可能广泛的权限级别。该策略允许已知的特权升级。
Baseline 最低限度限制的策略,防止已知的特权升级。允许默认 (最低限度指定)Pod 配置。
Restricted 严格限制策略,遵循当前 Pod 加固最佳实践。

关于这三种策略的详细说明,请参考 Pod Security Standards 文档

服务器端应用 (Server-Side Apply) GA

服务端应用 协助用户和控制器通过声明式配置的方式管理他们的资源。客户端可以发送完整描述的目标,声明式地创建和 / 或修改对象。

CSI 子特性 GA

CSI Windows 和 CSI Service Account Token 在 1.22 中 GA:

  • 由于不支持特权容器,CSI Windows 通过 CSIProxy 代理了 Linux 节点中需要特权的那部分操作,从而可以让 CSI 插件以非特权容器的方式部署到 Windows 节点中。
  • CSI Service Account Token 使得 CSI 插件可以使用与 Pod 绑定的服务帐户令牌,而不是更有特权的密钥。它还提供了对重新发布这些卷的控制,以便可以刷新令牌。

Memory QoS (Alpha)

在 1.22 以前,由于 Kubernetes 使用了 cgroups v1 API,Pod 的 QoS 只能用于 CPU。而对于内存,只支持通过 memory.limit_in_bytes 限制内存的配额和通过 oom_scores 调整 OOM 事件发生时容器的杀死顺序。这就导致 Kubernetes 无法为 Guaranteed Pod 完全预留内存,而 Burstable Pod 在 OOM 发生时也有更大几率被内核杀死。

Kubernetes 1.22 引入了 cgroups v2 API 来控制内存的分配和隔离,借助 memory.minmemory.high 实现了内存的 QoS。容器请求的内存到 cgroups v2 的计算方法如下所示:

// Container
/cgroup2/kubepods/pod<UID>/<container-id>/memory.min=pod.spec.containers[i].resources.requests[memory]
/cgroup2/kubepods/pod<UID>/<container-id>/memory.high=(pod.spec.containers[i].resources.limits[memory]/node allocatable memory)*memory throttling factor // Burstable

// Pod
/cgroup2/kubepods/pod<UID>/memory.min=sum(pod.spec.containers[i].resources.requests[memory])

// QoS ancestor cgroup
/cgroup2/kubepods/burstable/memory.min=sum(pod[i].spec.containers[j].resources.requests[memory])

Seccomp 默认安全策略(Alpha)

Kubelet 1.22 新增了一个 SeccompDefault 的 Alpha 特性,用于开启 Seccomp 默认策略。特性开启后,RuntimeDefault 将作为默认的 Seccomp 策略,应用到集群中所有的 Pod 中(特性未开启时,默认为 Unconfined)。这可以说是极大的提升了整个集群的安全。

Windows 特权容器(Alpha)

自 Kubernetes 支持 Windows 以来,Windows 节点最大的一个缺陷可说是不支持特权容器,导致很多在 Linux 节点中可通过 Daemonset 来部署的扩展和插件在 Windows 节点中都需要放到 Kubernetes 之外管理(比如通过 Powershell 来安装、配置并通过主机服务来启动)。

1.22 新增了 Windows HostProcess 容器(需开启 WindowsHostProcessContainers 特性),正式让 Windows 节点也支持了特权容器。HostProcess 容器可用于在 Windows 节点上部署网络插件、存储配置、设备插件、kube-proxy 等组件,不需要专门的代理,也不需要直接安装主机服务。

HostProcess 容器需要在 Pod Spec 中的 securityContext 中开启,比如:

spec:
  securityContext:
    windowsOptions:
      hostProcess: true
      runAsUserName: "NT AUTHORITY\\Local service"
  hostNetwork: true
  containers:
  - name: test
    image: image1:latest
    command:
      - ping
      - -t
      - 127.0.0.1
  nodeSelector:
    "kubernetes.io/os": windows

注: Windows HostProcess 容器需要 Windows 节点运行 1.5.4 或更新版本的 containerd。

其他重大特性

除了上述特性之外,以下这些特性也值得你特别留意:

  • etcd 迁移到 3.5.0,带来很多安全、性能、监控以及开发体验的提升;
  • StreamingProxyRedirects 弃用且默认关闭,将于 1.24 删除;
  • kubeadm 支持以非 root 用户部署控制平面(需开启 RootlessControlPlane 特性);
  • kubelet 支持以非 root 用户运行(即 Rootless kubelet);
  • Pod Eviction 支持 policy/v1 API(policy/v1beta1 在 1.22 弃用);
  • DynamicKubeletConfig 弃用,该特性默认改为关闭状态;
  • 当配置 externalTrafficPolicy: Local 的 Service 在某个节点中只有 Terminating 状态的 Pod 时, kube-proxy 会继续向 Terminating 状态的 Pod 转发请求(而以前是直接丢包);
  • CertificateSigningRequest.certificates.k8s.io API 新增 expirationSeconds 的支持;
  • Node 新增 Swap 内存的支持(Alpha);
  • 新增 ExpandedDNSConfig 特性(Alpha)将 MaxDNSSearchPaths 扩展到 32,并将 MaxDNSSearchListChars 扩展到 2048。
  • MemoryManager、NetworkPolicyEndPort、PodDeletionCost、SuspendJob、ServiceLBNodePortControl 和 ServiceLoadBalancerClass 等一系列特性进入 Beta 版,默认开启。

欢迎长按下面的二维码关注 漫谈云原生 公众号,输入 任意关键字 查询更多云原生知识库。

Related Articles

comments powered by Disqus