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/
...
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)。
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 更从容面对服务复杂度带来的挑战,使其成为业界领先的容器编排平台。