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

版本升级说明

ACK针对Kubernetes 1.24版本提供了组件的升级和优化。

核心组件 版本号 升级注意事项
Kubernetes 1.24.6-aliyun.1
  • 升级前请仔细阅读版本解读
  • Kubernetes 1.24通过Dockershim对Docker的支持现已移除,但是Docker构建的镜像可以继续使用,新建的节点请使用Containerd作为容器运行时。更多信息,请参见Dockershim Removal FAQ
  • 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.24及以后的版本,去除了kube-proxy监听NodePort的逻辑,在NodePort与内核net.ipv4.ip_local_port_range范围有冲突的情况下,可能会导致偶发的TCP无法连接的情况,导致健康检查失败、业务异常等问题。升级前,请确保集群没有NodePort端口与任意节点net.ipv4.ip_local_port_range范围存在冲突。更多信息,请参见Kubernetes社区PR
  • CVE-2022-3172
etcd 3.5.4
CoreDNS v1.9.3.6-32932850-aliyun 此次升级不会对业务造成影响,支持的新特性如下:
  • 优化CoreDNS调度亲和性配置,允许集群所有节点为弹性伸缩节点。
  • 关闭ServError类型的解析结果缓存。
  • 按Hostname反亲和调度由preferred改成required,即强制按节点反亲和调度。
  • 增加自定义参数支持。
  • 默认开启解析日志。
CRI containerd 1.5.13
CSI v1.20.7-aafce42-aliyun
CNI Flannel v0.15.1.13-941db231-aliyun
  • 增加用于安装Flannel CNI插件的初始化容器。
  • 将默认的IP缓存路径移动至/var/run目录中,以避免重启机器导致的IP泄露问题。
  • 支持ARM64机型。
  • 修复CVE-2022-28391、CVE-2022-37434。
Terway Terway版本需要大于v1.1.0。
NVIDIA Container Runtime 3.7.0
Ingress Controller v1.2.0-aliyun.1
  • Ingress Controller 0.44.0及以下版本使用了v1beta1版本的Ingress API(该资源版本在1.22版本阿里云集群中得到了保留),无法在Kubernetes 1.24集群中正常运行,您需要先在1.22集群中升级Nginx Ingress Controller到1.2.0版本及以上再进行集群的升级。
  • 组件升级可能会造成业务的瞬断和配置兼容性问题,请您在组件升级过程中充分验证无误后,再进行集群的升级。

版本解读

重大变化

  • 在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。

参考链接