vlambda博客
学习文章列表

K8S 生态周报| Kubernetes v1.22.0 正式发布,新特性一览!

「K8S 生态周报」内容主要包含我所接触到的 K8S 生态相关的每周值得推荐的一些信息。欢迎订阅知乎专栏「k8s生态」[1]

Kubernetes v1.22 已经在今天正式发布了,这是 2021 年的第二个正式发布的版本。此版本中共包含 53 项增强更新,其中 13 项达到 stable,24 项达到 beta 还有 16 项为 alpha。当然,也有 3 项特性被标记为废弃。

MoeLove
不只限于 Container, Docker, Kubernetes 等技术,与你分享更多实用且具有前景的技术。欢迎关注
146篇原创内容
Official Account

从今年的 4 月份,Kubernetes 的发布节奏由原来的每 3 个月一个版本修改成了每 4 个月一个版本,这也是第一个应用了此节奏的长周期版本。我们一起来看看有哪些值得注意的变更吧!

Server-side Apply 特性达到 GA

Server-side Apply 这个特性主要目标是把逻辑从 kubectl apply 移动到 kube-apiserver 中,这可以修复当前遇到的很多有关所有权冲突的问题。

还记得在之前的『K8S生态周报』中我曾为你介绍过 Kubernetes 新增的 .meta.managedFields 吗?Server-side Apply 当前就是通过此特性来跟踪对象字段的更改的。

同时此特性的好处在于你可以直接通过 API 完成声明式配置的操作,而无需依赖于特定的 kubectl apply 命令,比如直接通过 curl 即可完成。

此功能的用法如下:

kubectl apply --server-side [--dry-run=server]

Pod Security Policy 的替代品

PodSecurity admission controller  是在 Kubernets v1.21 中被废弃的 Pod Security Policies 的替代品。

这个 admission controller 可以按 namespace 级别启用 Pod Security Standards  ,可以有以下三种模式:

  • enforce: 违反策略的 Pod 将被拒绝;
  • audit:违反策略的 Pod 将会添加审计注释,但其他情况下都允许;
  • warn:违反策略的 Pod 将会触发面向用户的警告;

可通过如下配置文件进行控制:

apiVersion: apiserver.config.k8s.io/v1
kind: AdmissionConfiguration
plugins:
- name: PodSecurity
  configuration:
    defaults:  # Defaults applied when a mode label is not set.
      enforce:         <default enforce policy level>
      enforce-version: <default enforce policy version>
      audit:         <default audit policy level>
      audit-version: <default audit policy version>
      warn:          <default warn policy level>
      warn-version:  <default warn policy version>
    exemptions:
      usernames:         [ <array of authenticated usernames to exempt> ]
      runtimeClassNames: [ <array of runtime class names to exempt> ]
      namespaces:        [ <array of namespaces to exempt> ]

Node swap 支持

此特性现在是 Alpha 阶段。

虽然 swap 并不够快,但是现在有很多场景都是需要用到它的,尤其是一些 Java 和 Node 应用。

在 Kubernetes 的 issue 列表中有一个存在了 5 年左右的讨论,就是针对于能否开启 swap 支持的。当前这个特性一旦开启就是针对于整个 Node 的,并不能精确到某个 Pod 中。

你可以通过如下步骤启用此特性:

  • 在 Node 中启用 swap;
  • 开启 kubelet 的 NodeMemorySwap 特性;
  • 设置 --fail-on-swap=false
  • 可选在 Kubelet 的配置中增加 MemorySwap.SwapBehavior=UnlimitedSwap

更多内容可参考:https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/2400-node-swap

外部客户端凭证提供工具

这个功能允许 client-go 使用外部工具进行身份验证,比如 LDAP、Kerberos、OAuth2、SAML 等。这个特性是从 v1.10 开始引入的。

使用此特性的话,需要你在 kubeconfig 配置文件中作为 user 字段下的字段进行配置。比如:

apiVersion: v1
kind: Config
users:
- name: my-user
  user:
    exec:
      command"example-client-go-exec-plugin"
      apiVersion: "client.authentication.k8s.io/v1beta1"

      env:
      - name: "FOO"
        value: "bar"

      args:
      - "arg1"
      - "arg2"
      
      provideClusterInfo: true
clusters:
...

user.exec字段下配置可用的 client-go-exec plugin 即可。现在也有一个示例项目可供参考 https://github.com/ankeesler/sample-exec-plugin

可索引的 Job API

在 Kubernetes v1.21 中新增的可索引 Job API 可以更加方便的调度并行化的 Job。你可以使用如下的方式通过环境变量让 Job 中的 Pod 知道自己的索引:

[...]
    spec:
      subdomain: my-job-svc
      containers:
      - name: task
        image: registry.example.com/processing-image
        command: ["./process",  "--index""$JOB_COMPLETION_INDEX""--hosts-pattern""my-job-{{.id}}.my-job-svc"]

为 Job API 增加 suspend 字段

自 v1.21 起,Job 可以通过设置 .spec.suspend=true 字段来临时的挂起。可以比较方便的去进行控制,类似 Argo workflow 中,也可以对某个 workflow 进行挂起操作。

CSR 的有效期

通过在 CertificateSigningRequestSpec 中增加的 ExpirationSeconds 可以接受的最小值是 600(10分钟),这样就可以很好的控制其有效期了。现在默认的是 1 年。

内存资源的 QoS

之前 Kubernetes 在使用 cgroups v1 ,对于 Pod 的 QoS 其实只适用于 CPU 资源。Kubernetes v1.22 中通过引入 cgroups v2 来提供了一个 alpha 特性,允许对内存资源也提供 QoS。(如果没记错,貌似是腾讯云团队提交的 KEP 吧)

其他值得注意的变更,请参考之前发布的每期『K8S生态周报』及


当然,你也可以通过KIND 使用如下命令来快速的体验 Kubernetes v1.22 :

kind create cluster --image=kindest/node:v1.22.0@sha256:b8bda84bb3a190e6e028b1760d277454a72267a5454b57db34437c34a588d047




TheMoeLove

参考资料

[1]

k8s生态: https://zhuanlan.zhihu.com/container