Kubernetes v1.23即将发布,有哪些重磅更新?

2023-03-18 14:32:34 浏览数 (1)

Kubernetes 1.23即将发布,此版本带来了 45 项增强功能,与 Kubernetes 1.22 中的 56 项和 Kubernetes 1.21 中的 50 项相近。在这 45 项增强功能中,11 项已升级为稳定版,多达 15 项是不断改进的现有功能,还有 19 项是全新的。

此版本中包含的新功能相对较少。与 kubectl events 命令一样,支持 OpenAPI v3 和 gRPC 探针。此外,也开始对一些未知领域探索,例如 CSI 驱动程序和 Windows 支持正在稳步发展。

然而,此次发布的锦上添花的是所有即将进入 GA 状态的强大功能。例如:CronJobs、IPv4/IPv6 双栈支持、临时卷和 HPA API。

另外 Kubernetes 1.23 中启用和删除了一部分 API。具体参考:https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.23.md

该版本的 Kubernetes 附带 45 项新增强功能,使其更加成熟、安全和可扩展。在本文中,我们将重点关注 Kubernetes API、调度、容器和基础设施、存储、网络和安全方面的关键变化。

让我们从Kubernetes API开始,这也是使它具有可伸缩性和可扩展性的基础。

Kubernetes API

kubectl event

使用 kubectl get events 可以更轻松地观察集群的整体状态并解决问题。但是,它受到 kubectl get 命令的选项和数据收集方法的限制。这就是为什么在 1.23 中发布了一个新命令作为 alpha 功能:kubectl event。

新命令将有利于:

  • 查看与特定资源相关的所有事件
  • 监控集群中的特定事件
  • 按事件的状态或特定命名空间中的类型过滤事件

您可以查看后续版本中即将推出的功能https://github.com/kubernetes/enhancements/tree/master/keps/sig-cli/1440-kubectl-events。不过您可以在现在的集群中安装新的 kubectl 版本后立即开始使用 kubectl events 命令。

将 HPA API 升级为 GA

水平 Pod 自动缩放器 (HPA)是 Kubernetes 的核心组件,可根据指标自动扩展 Pod 的数量。HPA 可以扩展或缩减许多资源,例如副本集、部署或具有 CPU 利用率等众所周知的指标的状态集。自 2015 年以来,它一直是 Kubernetes API 的一部分,并且最终走向通用可用性 (GA)。

此增强功能总结了将此 API 带到毕业的工作,包括:

  • 完成端到端测试。
  • 弃用旧版本的 API。
  • 容器资源占用目标:重命名 Resource 为 PodResource.
  • 重命名值 Disabled 有 ScalingDisabled。
  • 最大最小值重命名:对行为选择策略值的值从变化Min到MinChange和Max到MaxChange。

如果您已经在客户端和控制器中使用 HPA,则可以开始使用 v2 而不是 v2beta1。此次毕业也意味着您可以长期使用 HPA,因为它已准备好投入生产,现在是 Kubernetes API 的核心组件。

CRD 自定义资源表达式

CustomResourceDefinition (CRD) 是强大的抽象层,它扩展了 Kubernetes 并使其与所有可能的自定义资源一起工作。由于用户定义了新的自定义资源及其规范,因此使用 webhook、控制器和客户端工具进行验证可能会很棘手。

值得庆幸的是,它建议使用内联表达式语言,例如 通用表达语言,并集成到 CRD 中进行验证。

在 1.23 版本中,验证规则作为 alpha 功能提供,以便您可以添加 x-kubernetes-validation-rules,类似于以下示例中的 Kubernetes 文档:https://kubernetes.io/docs/home/

代码语言:javascript复制
...

    openAPIV3Schema:
      type: object
      properties:
        spec:
          type: object
          x-kubernetes-validation-rules:
            - rule: "self.minReplicas <= self.replicas"
              message: "replicas should be greater than or equal to minReplicas."
            - rule: "self.replicas <= self.maxReplicas"
              message: "replicas should be smaller than or equal to maxReplicas."
          properties:

            ...

            minReplicas:
              type: integer
            replicas:
              type: integer
            maxReplicas:
              type: integer
          required:
            - minReplicas
            - replicas
            - maxReplicas 

假设您要创建以下违反第二条规则的自定义资源实例:

代码语言:javascript复制
apiVersion: "stable.example.com/v1"
kind: CronTab
metadata:
  name: my-new-cron-object
spec:
  minReplicas: 0
  replicas: 20
  maxReplicas: 10

Kubernetes API 将响应以下错误消息:

CronTab "my-new-cron-object" 无效:

规范:无效值:map[string]interface {}{"maxReplicas":10, "minReplicas":0, "replicas":20}: 副本应小于或等于 maxReplicas

如果您在集群中使用 CRD,则还必须在 Open API 架构和控制器中使用验证机制。在这个新版本中,您可以开始将它们迁移到 x-kubernetes-validation-rules,让 Kubernetes API 完成繁琐的验证工作。

可配置删除 statfulset PVC

添加了一个新的可选.spec.persistentVolumeClaimRetentionPolicy字段来控制是否以及如何在 StatefulSet 的生命周期中删除持久卷声明 (PVC)。

代码语言:javascript复制
apiVersion: apps/v1
kind: StatefulSet
…
spec:
  persistentVolumeClaimRetentionPolicy:
    whenDeleted: Retain
    whenScaled: Delete
…

grpc添加探针

gRPC 是一种现代开源高性能远程过程调用 (RPC) 框架,跨语言并且可以在任何环境中运行。它可以通过对负载平衡、跟踪、健康检查和身份验证的可插拔支持,有效地连接数据中心内和数据中心之间的服务。大多数互联网公司都会选择他作为服务之间网络通信框架,众所周知,之前Kubernetes已经支持了TCP 和 HTTP 选项,现在也支持了 grpc,您还可以配置使用如下配置。

代码语言:javascript复制
 readinessProbe:
      grpc:
        port: 9090
        service: my-service
      initialDelaySeconds: 5
      periodSeconds: 10

调度

简化调度程序配置,比如以前添加一个插件需要:

代码语言:javascript复制
apiVersion: kubescheduler.config.k8s.io/v1beta3
kind: KubeSchedulerConfiguration
profiles:
  - schedulerName: non-multipoint-scheduler
    plugins:
      preScore:
        enabled:
        - name: MyPlugin
      score:
        enabled:
        - name: MyPlugin
      preFilter:
        enabled:
        - name: MyPlugin
      filter:
        enabled:
        - name: MyPlugin

现在你可以用 multiPoint 更换 preScore,score,preFilter...:

代码语言:javascript复制
apiVersion: kubescheduler.config.k8s.io/v1beta3
kind: KubeSchedulerConfiguration
profiles:
  - schedulerName: multipoint-scheduler
    plugins:
      multiPoint:
        enabled:
        - name: MyPlugin

另外允许暂停 Job 以修改约束,此增强功能建立在Kubernetes 1.21 的“ #2232 Stopped Job ”之上,添加了.spec.suspend暂停作业的字段。

在 Kubernetes 1.23 中,可以在作业的 pod 模板中更新节点关联性、节点选择器、容忍度、标签和注释字段,然后再启动。通过这种方式,您可以影响 Pod 的运行位置,例如所有 Pod 都放置在同一区域中或在具有相同 GPU 模型的节点中。

容器和基础设施

临时容器

临时容器旨在用来观察其他 Pod 的状态、故障排除和调试。这个新功能还附带了一个 CLI 命令,使故障排除更容易:kubectl debug。该命令在 pod 中运行一个容器,而 kubectl exec 命令在容器中运行一个进程。

使用 v1.23,您将能够添加临时容器作为 pod 规范的一部分 PodSpec.EphemeralContainer. 它们类似于容器规范,但它们没有资源请求或端口,因为它们旨在临时添加到 pod。例如,您将能够为 my-service pod 添加一个 debian 容器并以交互方式连接以进行实时调试,如下所示:

代码语言:javascript复制
$ kubectl debug -it -m debian my-service -- bash
root@debug:~# ps x
  PID TTY      STAT   TIME COMMAND
    1 ?        Ss     0:00 /pause
   11 ?        Ss     0:00 bash
  127 ?        R      0:00 ps x

临时容器在 v1.22 中已经处于 alpha 状态,它们将在 1.23 版本中升级到 beta。如果您还没有尝试过,最好创建您的调试容器镜像并开始在您的工具箱中包含 kubectl debug 命令。

Windows 特权容器和主机网络模式

特权容器是强大的容器实例,因为它们可以访问和使用主机资源——类似于直接在主机上运行的进程。尽管它们构成了安全威胁,但它们有利于管理主机实例,并且在 Linux 容器中大量使用。

随着 1.23 版本的发布,Windows 实例的特权容器和主机网络模式将升级为测试版。如果您的集群中有 Windows 节点,或计划在将来包含这些节点,请查看设计文档。https://github.com/kubernetes/enhancements/tree/master/keps/sig-windows/1981-windows-privileged-container-support

此增强功能将 OS 字段添加到 PodSpec,因此您可以定义 Pod 应在哪个操作系统上运行。

这样,Kubernetes 平台就实现了不同服务在不同平台上运行的机制:

  • 拒绝不应在节点中运行的 Pod,在 kubelet 中实现。
  • 在适当的节点中调度 pod,以在调度器上实现。
  • 应用适当的安全约束,由准入插件实现。

存储

我们要强调 v1.23 的一个重要变化 存储SIG:卷挂载期间卷所有权更改。

目前,在卷绑定之前,卷权限会递归更新为 pod 规范中的 fsGroup 值。当卷大小很大时,更改所有权可能会导致创建 Pod 期间的等待时间过长。因此,添加了一个新字段 pod.Spec.SecurityContext.FSGroupChangePolicy 以允许用户指定权限和所有权更改应如何操作。

在 v1.23 中,此功能已升级到 GA,您可以 指定策略 有以下两个选项:

  • Always:始终更改权限和所有权以匹配 fsGroup 字段。
  • OnRootMismatch:仅当顶级目录与 fsGroup 字段不匹配时才更改权限和所有权。

如果您正在使用对权限更改敏感的应用程序,例如数据库,您应该检查新字段并将其包含在您的 pod 规范中,以避免在 pod 创建过程中等待过多的时间。

网络

IPv6 是 Kubernetes 团队期待已久的功能,特别是因为它在 Kubernetes v1.9 中作为 alpha 功能添加。在最新版本中,双栈 IPv4/IPv6 网络终于可以通用了。

此功能包括对 Pod 和服务的多个 IPv4/IPv6 地址的感知,并且它还支持本地 IPv4 到 IPv4 通信以及与集群之间的 IPv6 到 IPv6 通信。

代码语言:javascript复制
kind: Service
metadata:
  name: my-service
  labels:
    app: MyApp
spec:
  ipFamilyPolicy: PreferDualStack
  ipFamilies:
  - IPv6
  - IPv4
  selector:
    app: MyApp
  ports:
    - protocol: TCP
      port: 80

尽管 Kubernetes 提供双栈网络,但您可能会受到底层基础架构和云提供商的能力的限制。这是因为节点应该具有可路由的 IPv4/IPv6 网络接口,并且 pod 应该具有双栈网络连接。因此,您还需要一个能够感知双栈网络的网络插件来为 pod 和服务分配 IP。

一些 CNI 插件已经支持双栈网络,例如 kubenethttps://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/#kubenet, 生态系统支持随着 kubeadm 和 kind.https://kind.sigs.k8s.io/docs/user/configuration/#ip-family

安全

v1.23 版本有一项重要的增强功能 授权 SIG 我们要注意的是:Pod 安全标准升级到测试版。

Kubernetes Pod 安全标准为 Pod 定义了不同的隔离级别。这些标准让您可以明确、一致地定义如何限制 Pod 的行为。

如何启用 Alpha 功能呢?通过命名空间设置 pod 安全控制是一项 alpha 功能。您必须启用 PodSecurity 功能门才能使用它。

代码语言:javascript复制
--feature-gates= " ...,PodSecurity=true "

在之前的版本中, Pod 安全标准已作为 Alpha 功能提供以替换 PodSecurityPolicy。他们创建了一种在命名空间和标签的帮助下限制 pod 权限的方法,并实施策略——我们针对 v1.22 版本的博客文章有更多介绍https://www.armosec.io/blog/kubernetes-1-22-release-everything-you-should-know.不过 PodSecurityPolicy API 已弃用,并将 在 v1.25 中从 Kubernetes 中删除。

总结

在 2021 年的最后一个版本中,Kubernetes 带来了更多可扩展性和可靠性的 API 和基础设施功能增强。此外,存储、网络和安全方面的改进使 Kubernetes 更从容面对服务复杂度带来的挑战,使其成为业界领先的容器编排平台。

0 人点赞