全部產品
Search
文件中心

Container Service for Kubernetes:(停止維護)ACK發布Kubernetes1.24版本說明

更新時間:Dec 07, 2024

阿里雲Container ServiceKubernetes版(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調度親和性配置,允許叢集所有節點為Auto Scaling節點。

  • 關閉ServError類型的解析結果緩衝。

  • 按Hostname反親和調度由preferred改成required,即強制按節點反親和調度。

  • 增加自訂參數支援。

  • 預設開啟解析日誌。

CRI

containerd 1.5.13

CSI

v1.26

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)便於解析日誌,不需要再使用Regex去解析非結構化的日誌。推薦使用結構化日誌列印或者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。

參考連結