ACS发布Kubernetes 1.24版本说明

更新时间: 2023-10-23 11:34:38

阿里云容器计算服务ACS严格遵循社区一致性认证。本文介绍ACS发布Kubernetes 1.24版本所做的变更说明。

版本解读

重大变化

  • 在Kubernetes 1.24版本后,通过Dockershim对Docker的支持现已经移除,但是Docker构建的镜像可以继续使用,新建的节点请使用Containerd作为容器运行时。关于Dockershim移除对Docker的支持的更多信息,请参见Dockershim Removal FAQ。关于移除Dockershim的影响及反馈,请参见GitHub issue

  • 在Kubernetes 1.24版本后,kube-apiserver 99%的调用延迟下降10倍,同时负载增加大约25%,这是因为Kubernetes 1.24版本基于Go 1.18编译,而Go 1.18的垃圾回收算法发生重大改变。如果无法接受kube-apiserver使用内存增长,可以通过修改GOGC环境变量来解决(GOGC=63大约可以和以前的内存消耗一样)。

  • 在Kubernetes 1.24版本后,基于安全方面的考虑(特性门控LegacyServiceAccountTokenNoAutoGeneration默认启用),Secret API将不会为ServiceAccount自动创建Secret对象存放Token信息,需要使用TokenRequest API来获取ServiceAccount的Token,该Token具备过期时间,更加安全。如果一定需要创建一个永不过期的Token,请参见service-account-token-secrets

  • 在Kubernetes 1.24版本后,新建专有版集群时kubeadm添加控制面节点不会添加node-role.kubernetes.io/master标签,只添加node-role.kubernetes.io/control-plane标签,但是Taint里node-role.kubernetes.io/master:NoSchedulenode-role.kubernetes.io/control-plane:NoSchedule还会同时存在,1.25版本后将移除Taint里的node-role.kubernetes.io/master:NoSchedule

新增功能

  • 在Kubernetes 1.23版本后,结构化日志(Structured Logging)进入Beta,许多组件(kube-scheduler、kubelet等)日志都改成使用结构化日志,结构化日志使用 key="value" 形式(例如GET /healthz: (57.126µs) 200变为verb="GET" URI="/healthz" latency="57.126µs" resp=200)便于解析日志,不需要再使用正则表达式去解析非结构化的日志。推荐使用结构化日志打印或者JSON格式打印,详细信息,请参见introducing-structured-logs。同时JSON格式的日志信息默认使用stderr输出代替stdout

  • 在Kubernetes 1.23版本后,如果配置OS参数,kubelet会拒绝Pod操作系统参数pod.Spec.OS与节点的OS标签不匹配的Pods。

  • 在Kubernetes 1.23版本后,StatefulSet默认支持Pod就绪的最小时间.spec.minReadySeconds,特性门控StatefulSetMinReadySeconds进入Beta,详细信息请参见 Minimum Ready Seconds for StatefulSets

  • 在Kubernetes 1.23版本后,CSI CSIDriver.Spec.StorageCapacity字段支持修改。

  • 在Kubernetes 1.23版本后,开启JobReadyPods特性,可以在Job Status中显示Pods处于Ready状态的数量。

  • 在Kubernetes 1.23版本后,CRD新增CustomResourceValidationExpressions特性门控,基于x-kubernetes-validations拓展,可以使用通用表达式语言(CEL)来验证定制资源。

  • 在Kubernetes 1.23版本后,因为Go 1.17支持Windows ARM64,所以新增支持生成Windows ARM64的客户端二进制文件。

  • 在Kubernetes 1.23版本后,client-go为Workqueue新增一个Processing的状态,Shutdown Workqueue的时候会等待工作队列里所有正在进行的项目完成。

  • 在Kubernetes 1.23版本后,新增指标admission_webhook_request_total,包含标签:WebHook名字、Admission类型、请求动作、HTTP状态码、请求是否被拒绝、请求资源的Namespace。

  • 在Kubernetes 1.23版本后,APIServer的部分监控指标已经GA:controller_admission_duration_secondsstep_admission_duration_secondswebhook_admission_duration_secondsapiserver_current_inflight_requestsapiserver_response_sizes。除此之外APIServer还新增了针对LIST请求的指标。

  • 在Kubernetes 1.23版本后,部分Scheduler指标已经GA:pending_podspreemption_attempts_totalpreemption_victimsschedule_attempts_totalscheduling_attempt_duration_seconds(原e2e_scheduling_duration_seconds )、pod_scheduling_duration_secondspod_scheduling_attemptsframework_extension_point_duration_secondsplugin_execution_duration_secondsqueue_incoming_pods_total

  • 在Kubernetes 1.23版本后, 对kube-controller-manager的健康检查会包含每一个控制器的健康检查。

  • 在Kubernetes 1.24版本后,CSIStorageCapacity API支持显示当前可用的存储大小,确保Pod调度到足够存储容量的节点上,减少Volumes创建和挂载失败导致的Pod调度延迟,详细信息请参见Storage Capacity Constraints for Pod Scheduling

  • 在Kubernetes 1.24版本后,gRPC探针进入Beta,默认可用特性门控参数GRPCContainerProbe,使用方式请参见configure probes

  • 在Kubernetes 1.24版本后,CSI做了一些优化,例如Finalizer支持in-tree PV删除保护,内置存储插件支持迁移到CSI外部存储驱动,详细信息请参见In-tree Storage Plugin to CSI Migration Design Doc

  • 在Kubernetes 1.24版本后,为了能在Windows上运行kube-proxy,kube-proxy新增2个参数:

    • --forward-healthcheck-vip支持将到Service VIP的健康检查流量转发到kube-proxy的健康检查服务。

    • --root-hnsendpoint-name指定根网络命名空间的HNS端点的名称。

  • 在Kubernetes 1.24版本后,CronJob新增可选字段timeZone。开启特性CronJobTimeZone后,您可以在特定的时区运行CronJob。该特性将在Kubernetes 1.25版本进入Beta。

  • 在Kubernetes 1.24版本后,丰富了监控指标。

    • 增加webhook_fail_open_count指标用于监控Webhooks失败。

    • kube-proxy引入新的指标sync_proxy_rules_no_local_endpoints_total展示没有内部Endpoints的服务数量。

    • kubelet新增一个指标kubelet_volume_stats_health_abnormal用于记录Volume健康状态。

    • 使用evictions_total代替evictions_number指标。

  • 在Kubernetes 1.24版本后,StatefulSets支持可配置maxUnavailable参数,使得滚动更新时可以更快地停止Pods。

  • 在Kubernetes 1.24版本后,OpenAPI V3默认开启。

  • 在Kubernetes 1.24版本后,Kubernetes基于Go 1.18编译,默认不再支持SHA-1哈希算法验证证书签名。

  • 在Kubernetes 1.24版本后,kubelet会在Mangle表中添加一个名为KUBE-IPTABLES-HINT的iptables链,需要在主机网络命名空间里修改iptables规则的容器化组件,可以使用它来更好的确认系统要使用iptables-legacy还是iptables-nft

  • 在Kubernetes 1.23和1.24版本中,kubectl做了一些功能优化,新增了一些指令,提升用户帮助可读性,补全提示支持fish和powershell。

    • kubectl logs默认选取第一个容器。

    • kubectl describe ingress包含IngressClass。

    • kubectl version包含嵌入式Kustomize信息。

    • kubectl get命令支持资源名称提示,例如kubectl get pod pod1 <TAB>会自动提示Podname等。

废弃功能

  • 在Kubernetes 1.23版本后,FlexVolume被废弃,推荐使用Out-of-tree CSI驱动方式。更多信息请参见Kubernetes Volume Plugin FAQ for Storage Vendors

  • 在Kubernetes 1.23版本后,klog废弃部分命令行参数,Kubernetes正在简化组件日志,详细信息请参见System Logs

  • 在Kubernetes 1.23版本后,kubeadm在initjoinupgrade命令中废弃了--experimental-patches参数,--patches--config不能混合使用。

  • 在Kubernetes 1.23版本后,kube-log-runner包含在Release的TAR包里,代替被废弃的--log-file参数,详细信息请参见 kube-log-runner

  • 在Kubernetes 1.23版本后,废弃指标scheduler_volume_scheduling_duration_seconds

  • 在Kubernetes 1.23版本后,使用apiserver_longrunning_requests指标代替废弃指标apiserver_longrunning_gauge

  • 在Kubernetes 1.23版本后,kubectl --dry-run必须指定--dry-run=(server|client|none)

  • 在Kubernetes 1.24版本后,Service.Spec.LoadBalancerIP被弃用,因为它无法用于双栈协议。

  • 在Kubernetes 1.24版本后,kube-apiserver移除参数--address--insecure-bind-address--port--insecure-port=0

  • 在Kubernetes 1.24版本后,kube-controller-manager和kube-scheduler移除启动参数--port=0--address

  • 在Kubernetes 1.24版本后,kube-apiserver --audit-log-version--audit-webhook-version仅支持audit.k8s.io/v1,Kubernetes 1.24移除audit.k8s.io/v1[alpha|beta]1,只能使用audit.k8s.io/v1

  • 在Kubernetes 1.24版本后,kubelet移除启动参数--network-plugin,仅当容器运行环境设置为Docker时,此特定于Docker的参数才有效,并会随着Dockershim一起删除。

  • 在Kubernetes 1.24版本后,动态日志清理功能已经被废弃,并在Kubernetes 1.24版本移除。该功能引入了一个日志过滤器,可以应用于所有Kubernetes系统组件的日志,以防止各种类型的敏感信息通过日志泄漏。此功能可能导致日志阻塞,所以废弃,更多信息请参见Dynamic log sanitization KEP-1753

  • VolumeSnapshot v1beta1 CRD在Kubernetes 1.20版本中被废弃,在Kubernetes 1.24版本中移除,需改用v1版本。

  • 在Kubernetes 1.24版本后,移除自1.11版本就废弃的service annotation tolerate-unready-endpoints,使用Service.spec.publishNotReadyAddresses代替。

  • 在Kubernetes 1.24版本后,废弃metadata.clusterName字段,并将在下一个版本中删除。

  • Kubernetes 1.24及以后的版本,去除了kube-proxy监听NodePort的逻辑,在NodePort与内核net.ipv4.ip_local_port_range范围有冲突的情况下,可能会导致偶发的TCP无法连接的情况,导致健康检查失败、业务异常等问题。升级前,请确保集群没有NodePort端口与任意节点net.ipv4.ip_local_port_range范围存在冲突。更多信息,请参见Kubernetes社区PR

API 变化

  • 在Kubernetes 1.23版本后:

    • 移除rbac.authorization.k8s.io/v1alpha1,使用rbac.authorization.k8s.io/v1

    • 移除scheduling.k8s.io/v1alpha1,使用scheduling.k8s.io/v1

  • 在Kubernetes 1.23版本后,HorizontalPodAutoscaler v2已经GA,autoscaling/v2beta2 API被废弃。

  • 在Kubernetes 1.23版本后,在创建和更新双协议栈的时候Service.spec.ipFamilyPolicy为必填项。用户使用双协议栈的Service必须指明ipFamilyPolicy为“PreferDualStack”或者“RequireDualStack”。

  • 在Kubernetes 1.23版本后,组件使用LogFormatRegistry配置的,需要更新代码使用logr v1.0.0 API,JSON日志输出现在使用go-logr/zapr的格式,并修复了一些问题。

  • 在Kubernetes 1.24版本后,client.authentication.k8s.io/v1alpha1已经被移除,使用v1版本替换。

  • 在Kubernetes 1.24版本后,node.k8s.io/v1alpha1已经移除,使用v1版本替换。

  • 在Kubernetes 1.24版本后,CSIStorageCapacity.storage.k8s.io改用v1版本,废弃v1beta1版本,在1.27彻底移除v1beta1。

  • 在Kubernetes 1.24版本后,移除networking.k8s.io/v1alpha1网络API。

特性门控

关于特性门控一般有三个阶段:Alpha默认禁用、Beta一般默认启用、GA将一直默认启用,且不能禁用(会在后续版本中删除这个开关功能),更多信息请参见Feature Gates。下面列举部分主要变化:

  • 在Kubernetes 1.23版本后,TTLAfterFinished特性门控已经GA,默认开启,资源执行完成后允许TTL控制器清理资源。

  • 在Kubernetes 1.23版本后,新增StatefulSetAutoDeletePVC允许自动删除StatefulSet Pods创建的PVCs。

  • 在Kubernetes 1.23版本后,PodSecurity进入Beta,默认开启。PodSecurity代替被废弃的PodSecurityPolicy准入控制器。

  • 在Kubernetes 1.23版本后,IPv4/IPv6 Dual-stack Networking已经GA,且移除IPv6DualStack特性门控。

  • 在Kubernetes 1.23版本后,NodeLease在1.17已经GA的特性开关被移除了,默认一直启用。

  • 在Kubernetes 1.23版本后,CSIVolumeFSGroupPolicy已经GA,默认一直启用。

  • 在Kubernetes 1.23版本后,通用临时卷GenericEphemeralVolume默认启用,使用方式请参见 Ephemeral Volumes。通用临时内联卷支持所有普通卷的功能。通用临时内联卷可以由支持持久存储的第三方存储驱动提供,普通卷可以由第三方存储提供、存储容量跟踪、从快照还原等。

  • 在Kubernetes 1.23版本后,IngressClassNamespacedParams已经GA,允许IngressClass资源中使用命名空间范围的参数引用,IngressClass.spec.parameters添加了两个字段- scopenamespace

  • 在Kubernetes 1.23版本后,StorageObjectInUseProtection如果仍在使用PersistentVolume或PersistentVolumeClaim对象,则将其删除操作推迟。已经在1.11版本GA,即将在1.25版本移除。

  • 在Kubernetes 1.23版本后,ConfigurableFSGroupPolicy已经GA,并重命名指标volume_fsgroup_recursive_applyvolume_apply_access_control。在Pod中挂载卷时,ConfigurableFSGroupPolicy允许用户为fsGroup配置卷访问权限和属主变更策略,详细信息请参见为 Pod 配置卷访问权限和属主变更策略

  • 在Kubernetes 1.23版本后,KubeletPodResourcesGetAllocatable进入Beta,默认开启Pod的GetAllocatableResources功能,增强节点资源分配能力,详细信息请参见GetAllocatableResources gRPC endpoint

  • 在Kubernetes 1.23版本后,WindowsHostProcessContainers进入Beta,默认启用对Windows HostProcess容器的支持。

  • 在Kubernetes 1.24版本后,NonPreemptingPriority支持Pod优先级抢占,已经GA。

  • 在Kubernetes 1.24版本后,废弃ValidateProxyRedirects和StreamingProxyRedirects。

  • 在Kubernetes 1.24版本后,JobReadyPods进入Beta,默认启用,允许跟踪记录Ready的Pod到Job对象的status字段中。

  • 在Kubernetes 1.24版本后,Indexed Jobs已经GA,无法禁用。

  • 在Kubernetes 1.24版本后,SuspendJob启用支持暂停和恢复作业,已经GA,且参数将在1.26版本移除。

  • 在Kubernetes 1.24版本后,RemoveSelfLink已经GA,将所有对象和集合的.metadata.selfLink字段设置为空字符串。 该字段自Kubernetes 1.16版本以来已被弃用。 启用此功能后,.metadata.selfLink字段仍然是Kubernetes API的一部分。

  • 在Kubernetes 1.24版本后,PodAffinityNamespaceSelector已经GA,且参数将在1.26版本移除,该特性允许Pod的亲和性策略不再局限于同命名空间的标签选择,可以实现跨命名空间的标签选择,这将实现更完善的亲和性调度策略。

  • 在Kubernetes 1.24版本后,AnyVolumeDataSource进入Beta,允许使用任何自定义的资源来作为PVC中的DataSource。

  • 在Kubernetes 1.24版本后,CSRDuration已经GA,CertificateSigningRequest资源类型允许您使用它申请发放X.509证书,CSRDuration 特性门控支持使用可选字段spec.expirationSeconds为颁发的证书设定一个特定的有效期,最小值为600。

  • 在Kubernetes 1.24版本后,服务器端字段验证ServerSideFieldValidation进入Beta,默认启用。验证资源模式在API服务器端而不是客户端执行(例如,kubectl createkubectl apply命令行)。

  • 启动kubelet的动态配置(DynamicKubeletConfig)功能在Kubernetes 1.22版本废弃,在1.24版本从kubelet featureGates中移除。

  • 在Kubernetes 1.24版本后,LegacyServiceAccountTokenNoAutoGeneration默认启用,将不会为ServiceAccount自动创建Secret。

  • 在Kubernetes 1.24版本后,移除在1.22版本中GA的SetHostnameAsFQDN、ImmutableEphemeralVolumes和NamespaceDefaultLabelName。

  • Kubernetes 1.23版本和 Kubernetes 1.24版本已经GA的特性门控(不需要额外配置,默认一直启用,无法禁用):ConfigurableFSGroupPolicy、ControllerManagerLeaderMigration、CSIMigrationAzureDisk、CSIMigrationOpenStack、CSIStorageCapacity、CSIVolumeFSGroupPolicy、CSRDuration、CronJobControllerV2、DefaultPodTopologySpread、EfficientWatchResumption、ExpandCSIVolumes、ExpandInUsePersistentVolumes、ExpandPersistentVolumes、GenericEphemeralVolume、IPv6DualStack、IndexedJob、IngressClassNamespacedParams、NonPreemptingPriority、PodAffinityNamespaceSelector、PodOverhead、PreferNominatedNode、RemoveSelfLink、ServiceLBNodePortControl、ServiceLoadBalancerClass、SuspendJob、DynamicKubeletConfig、TTLAfterFinished。

参考链接

阿里云首页 容器计算服务 相关技术圈