Kubernetes 1.22 将于 8 月 4 日发布,本文带你一起来看看这个版本带来的新特性,以便你为新版本的测试升级做好准备。
删除一系列已弃用 API
Kubernetes 1.22 最大的变化之一是删除了一系列已废弃的 API,包括:
- Beta 版的
ValidatingWebhookConfiguration
和MutatingWebhookConfiguration
(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/v1beta1 和 networking.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.min
和 memory.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 版,默认开启。
欢迎长按下面的二维码关注 漫谈云原生 公众号,输入 任意关键字 查询更多云原生知识库。