阿里云容器服务Kubernetes版(ACK)严格遵循社区一致性认证。本文介绍ACK发布Kubernetes 1.24版本所做的变更说明。
版本升级说明
ACK针对Kubernetes 1.24版本提供了组件的升级和优化。
核心组件 | 版本号 | 升级注意事项 |
Kubernetes | 1.24.6-aliyun.1 |
|
etcd | 3.5.4 | 无 |
CoreDNS | v1.9.3.6-32932850-aliyun | 此次升级不会对业务造成影响,支持的新特性如下:
|
CRI | containerd 1.5.13 | 无 |
CSI | v1.20.7-aafce42-aliyun | 无 |
CNI | Flannel v0.15.1.13-941db231-aliyun |
|
Terway | Terway版本需要大于v1.1.0。 | |
NVIDIA Container Runtime | 3.7.0 | 无 |
Ingress Controller | v1.2.0-aliyun.1 |
|
版本解读
重大变化
在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:NoSchedule
和node-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_seconds
、step_admission_duration_seconds
、webhook_admission_duration_seconds
、apiserver_current_inflight_requests
和apiserver_response_sizes
。除此之外APIServer还新增了针对LIST请求的指标。在Kubernetes 1.23版本后,部分Scheduler指标已经GA:
pending_pods
、preemption_attempts_total
、preemption_victims
、schedule_attempts_total
、scheduling_attempt_duration_seconds
(原e2e_scheduling_duration_seconds
)、pod_scheduling_duration_seconds
、pod_scheduling_attempts
、framework_extension_point_duration_seconds
、plugin_execution_duration_seconds
和queue_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在
init
、join
和upgrade
命令中废弃了--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
添加了两个字段- scope
和namespace
。在Kubernetes 1.23版本后,StorageObjectInUseProtection如果仍在使用PersistentVolume或PersistentVolumeClaim对象,则将其删除操作推迟。已经在1.11版本GA,即将在1.25版本移除。
在Kubernetes 1.23版本后,ConfigurableFSGroupPolicy已经GA,并重命名指标
volume_fsgroup_recursive_apply
为volume_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 create
或kubectl 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。