阿里云容器服務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.26 | 無 |
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。