在疫情的重重包围之下,历时17周的匠心打磨,观星者Kubernetes 1.24终于在五一假期正式发布啦!
Kubernetes 1.24有来自全球1029家企业和1179位个人的贡献。每一位参与者都如同一颗星星,帮助Kubernetes在星辰大海中指引航行的方向。天文望远镜与遥远的七仙女星座的时空遐想,也正是1.24版本logo作者BritneeLaverack的所述之意。
Dockershim被移除
在Kubernetes 1.24,Dockershim组件正式从kubelet中移除。从Kubernetes 1.24开始,默认将无法使用Docker Engine作为容器运行。从下图的架构可以看出,Dockershim处于一个非常尴尬的地位,它扮演着Docker、containerd 和CRI之间的翻译官或代理角色,但事实上新版本的containerd 兼容CRI接口标准,可以绕开Docker直接与CRI对接。冤冤相报何时了,在双方较量与磨合了几年之后,Kubernetes 终究还是移除Dockershim。
在没有特殊需求的情况下,云君还是推荐大家使用containerd 或 CRI-O等受支持的容器运行时软件。如果您依赖Docker Engine,也可以使用cri-dockerd这样的软件来解决。不管您使用哪种方式,云君都建议您做好一些兼容性测试工作,以确保Kubernetes 1.24集群的正常运行。例如,云君在使用containerd 1.6.3及以下版本的时候,就遇到了“Incompatible CNIversions”或“Failed to destroy network for sandbox”等CNI插件相关的报错。按照containerd 官方的说法“containerd 1.6.4 修复了这两个问题”,后来云君进行多次版本兼容测试,升级调整之后解决了问题。
另外,云君要说的是如果你以前是docker的用户,现在转向使用containerd的话,系统中将没有Docker命令行,取而代之的是ctr命令行,这样你可能短时间难以适应。好在社区已经提供了“nerdctl”和“crlctl”这样的近乎兼容docker命令的小工具,下面云君列出docker、ctr、crictl、nerdctl命令行的部分对照表给大家感受一下:
命令功能 | docker | ctr | crictl | nerdctl |
查看容器运行状态 | docker ps | ctr task ls/ctr container ls | crictl ps | nerdctl ps |
查看镜像 | docker images | ctr image ls | crictl images | nerdctl images |
查看容器日志 | docker logs | 无 | crictl logs | nerdctl logs |
查看容器数据信息 | docker inspect | ctr container info | crictl inspect | nerdctl inspect |
查看容器资源 | docker stats | 无 | crictl stats | nerdctl stats |
运行一个新的容器 | docker run | ctr run | 无 | nerdctl run |
修改镜像标签 | docker tag | ctr image tag | 无 | nerdctl tag |
创建新容器 | docker create | ctr container create | crictl create | nerdctl create |
导入镜像 | docker load | ctr image import | 无 | nerdctl load |
导出镜像 | docker save | ctr image export | 无 | nerdctl save |
删除容器 | docker rm | ctr container rm | crictl rm | nerdctl rm |
删除镜像 | docker rmi | ctr image rm | crictl rmi | nerdctl rmi |
拉取镜像 | docker pull | ctr image pull | ctictl pull | nerdctl pull |
推送镜像 | docker push | ctr image push | 无 | nerdctl push |
在容器内部执行命令 | docker exec | 无 | crictl exec | nerdctl exec |
“nerdctl”和“crlctl”小工具安装非常方便,将官方的二进制文件拷贝到/usr/local/bin目录就可以直接使用了。如果您还对Docker比较怀旧的话,执行“alias docker=nerdctl”这样的命令后,您依然可以体验到与Docker相似的感觉。如果您觉得Dockershim被移除之后,Kubernetes 1.24集群的兼容以及适配变得难以适应,也可以使用类似“kube-install”这样的工具来一键部署Kubernetes 1.24集群,这样“kube-install”默认会自动部署上nerdctl工具配置docker别名映射以及相关的CNI插件兼容等工作,让您快速拥有一套生产可用的集群。
更多关键更新
Service ClusterIP预留功能
Kubernetes Service ClusterIP 服务是唯一的,如果您尝试使用已经分配的 ClusterIP 创建Service将会存在冲突。为了避免这个冲突问题,Kubernetes 1.24支持动态和静态两种ClusterIP配置方式:
-
动态:Kubernetes集群将在配置的ClusterIP范围内自动选择一个空闲 IP地址。
-
静态:这是Kubernetes 1.24引入的新特性,允许你为Service分配静态 IP 地址池。静态 IP 地址池最少有 16 个 IP 地址,最多不超过 256 个。手动启用此功能后,群集Service将从IP 地址池中自动分配,从而降低冲突风险。
Openstack和Azure存储插件迁移
将Openstack Cinder和Azure磁盘插件的相关代码移出Kubernetes 主库。在迁移In-Tree存储插件的内部,以调用CSI插件,同时维护原始API。
OpenAPI v3开启
Kubernetes 1.24为以OpenAPIv3发布,并默认开启 OpenAPI V3,新增端点 /openapi/v3/apis/{group}/{version},而且为其提供了测试版支持。
默认关闭新beta APIs
默认情况下,现有的 beta API会被启用,而新的beta API暂时仍然处于关闭状态。
Storage Capacity 和Volume Expansion 正式 GA
存储容量跟踪支持通过CSIStorageCapacity对象展示当前可用的存储容量,并增强对使用CSI卷对late binding的POD的进行调度。卷扩展增加了对调整现有永久卷大小的支持,另外CSI StorageCapacity.storage.k8s.io v1beta1 版本将在未来进行废弃。
NonPreemptingPriority功能稳定
此功能为PriorityClass添加了一个新选项,可以启用或禁用pod的抢占调度。
gRPC ContainerProbe升级至 Beta
在 Kubernetes 1.24 中,原生支持 gRPC 探针。gRPC ContainerProbe功能已经进入测试阶段,默认情况下是可用的。现在,您可以在 Kubernetes 中为 gRPC 应用程序配置startup、liveness和readiness探针,而无需暴露 HTTP endpoint或使用额外的可执行文件。
CredentialProvider 升级至 Beta
Kubelet CredentialProvider最初在Kubernetes 1.20中作为Alpha发布,在Kubernetes 1.24中已经升级到Beta版。这允许kubelet使用exec插件动态检索容器镜像注册表的凭据,而不是将凭据存储在节点的文件系统上。这样通过灵活可拓展的插件机制动态接入任何云提供商的镜像注册认证。
Contextual Logging为Alpha
Kubernetes 1.24 引入了ContextualLogging,使函数的调用者能够控制日志输出格式、详细程度、附加值等日志记录的所有方面。
Sigstore与软件供应链安全
Kubernetes 1.24 是第一个正式使用 Sigstore 的版本。发布制品使用联合签名进行签发,并且支持验证镜像签名。发布制品的签发和验证是为了提高Kubernetes发布过程的软件供应链安全性。
部分功能废弃
下面列举出几个主要废弃的功能点:
-
Kube-controller-manager、Kube-scheduler和kube-apiserver均移除了—address和--port等一些非安全的flag参数。
-
Kube-apiserver 移除了对--master-count和--endpoint-reconciler-type=master-count 参数;
-
kubelet 移除了DynamicKubeletConfig功能,同时废弃 --pod-infra-container-image 参数。
-
Service 的annotation tolerate-unready-endpoints 被完全移除,替代方案为Service.spec.publishNotReadyAddresses。
-
RuntimeClass API 版本 node.k8s.io/v1Alpha1废弃,以后请使用 node.k8s.io/v1API接口。
参考文档:
-
https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.24.md
-
https://github.com/cloudnativer/kube-install/releases/tag/v0.8.0
-
https://github.com/kubernetes/kubernetes/releases/tag/v1.24.0