ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Kubernetes 1.18 版本发布记录详解:从 v1.18.0 到 v1.18.20 的新特性、破坏性变更与安全升级

Kubernetes 1.18 版本发布记录详解:从 v1.18.0 到 v1.18.20 的新特性、破坏性变更与安全升级 Kubernetes 1.18 版本发布记录详解从 v1.18.0 到 v1.18.20 的新特性、破坏性变更与安全升级【免费下载链接】kubernetesProduction-Grade Container Scheduling and Management项目地址: https://gitcode.com/GitHub_Trending/kuber/kubernetes本文基于仓库中的 CHANGELOG/CHANGELOG-1.18.md 展开系统梳理 Kubernetes 1.18 系列v1.18.0 至 v1.18.20 共 20 个正式版的完整发布脉络v1.18.0 的六大主题特性Topology Manager 转 Beta、Server-Side Apply Beta 2、IngressClass 等新 API、各组件kube-apiserver / kubelet / kubectl / client-go的破坏性变更与必须迁移项、1.18 生命周期内披露的 CVE 安全漏洞及修复版本、以及各补丁版本的关键修复。读完本文你可以准确判断哪些集群必须升级、升级前需要做哪些迁移准备以及如何验证发布产物的完整性。版本线与发布产物结构CHANGELOG-1.18.md 按版本从高到低组织覆盖以下版本正式版v1.18.20该系列的最后一个补丁版本、v1.18.19、v1.18.18、……、v1.18.0预发布版v1.18.5-rc.1、v1.18.0-rc.1、v1.18.0-beta.2、v1.18.0-beta.1、v1.18.0-alpha.5、v1.18.0-alpha.4手工 tag无产物、v1.18.0-alpha.3、v1.18.0-alpha.2、v1.18.0-alpha.1。每个发布版本都提供四类产物并附带 sha512 校验和用于完整性验证产物内容典型文件Source Code完整二进制包与纯源码包kubernetes.tar.gz、kubernetes-src.tar.gzClient Binarieskubectl 等客户端覆盖 darwin/linux/windows 多架构kubernetes-client-linux-amd64.tar.gzServer Binarieskube-apiserver、kube-controller-manager、kube-scheduler 等控制面组件kubernetes-server-linux-amd64.tar.gzNode Binarieskubelet、kube-proxy 等节点组件kubernetes-node-linux-amd64.tar.gz、kubernetes-node-windows-amd64.tar.gz值得注意的异常版本记录v1.18.7 与 v1.17.10CHANGELOG 中明确标注Release artifacts for 1.18.7 and 1.17.10 are incomplete. Do not use these releases.即该版本的产物不完整禁止使用v1.18.11记录为No artifacts for v1.18.11 were released.即未发布二进制产物仅有变更记录v1.18.0-alpha.4因发布工具在打 alpha.3 tag 时出现 bug手工补推的 tagNo binaries have been produced or will be provided其变更内容已并入 alpha.3 的 changelog 章节。对于仍在使用 1.18 的集群选择 v1.18.20 是合理的它累计包含了 1.18 系列全部的安全修复见下文 CVE 章节。v1.18.0 的六大主题特性Topology Manager 转 BetaNUMA 对齐v1.18.0 发布说明的主题之一是 Topology Manager 特性从 Alpha 提升到 Beta。该特性用于在多路multi-socket节点上对齐 CPU 与设备如 SR-IOV VF的 NUMA 分配——在此之前CPU Manager 与 Device Manager 各自独立做资源分配决策可能导致跨 NUMA 节点分配损害低延迟类应用的性能。从当前仓库源码结构看该特性的实现集中在 pkg/kubelet/cm/topologymanager 包包含 policy.go、policy_single_numa_node.go、policy_best_effort.go、policy_restricted.go 等多种策略实现以及 scope_container.go、scope_pod.go 等粒度控制文件——与 CHANGELOG 中使工作负载运行在针对低延迟优化的环境这一描述相互印证。v1.18.0 中还修复了 TopologyManager 的一个关键 bug此前只有容器创建被某种方式串行化时TopologyManager 才能保证对齐修复后在任何容器创建场景下对齐都有保证。Server-Side Apply Beta 2managedFields 全量跟踪Server-Side Apply 在 1.16 进入 Beta1.18 推出第二个 Beta 版本。核心变化对所有新创建的 Kubernetes 对象metadata 中会带有 managedFields 字段列出各 manager 及其拥有的字段——这让谁在什么时候改了什么变得可审计。注意一个回归修复时间线v1.18.3 修复了未使用 server-side apply 的 create/update/patch 请求中 metadata.managedFields 处理的回归v1.18.4 又修复了旧 API 客户端1.15 之前提交 update/patch 请求时 managedFields 处理的回归。这两个修复与所有新对象都被跟踪字段这一新行为的正确性直接相关。Ingress 扩展IngressClass 与 pathTypev1.18 为 Ingress 带来两项重要新增pathType 字段指明路径匹配方式取值包括默认的 ImplementationSpecific以及新增的 Exact 和 PrefixIngressClass 资源用新的 spec.ingressClassName 字段将 Ingress 关联到特定控制器取代已弃用的 kubernetes.io/ingress.class 注解。在当前仓库中这些类型定义可以在 staging/src/k8s.io/api/networking/v1/types.go 中找到IngressClass 结构体及其 Spec 包含 parameters 字段支持 Namespace 与 Cluster 两种作用域的 IngressClassParametersReference用于引用 IngressClass 的具体参数对象。kubectl debug基于临时容器Ephemeral Containers的调试SIG CLI 在 v1.18 引入了 kubectlalpha debug 命令调试工具允许向运行中的 Pod 附加一个临时容器进行交互式排查。这与同期 kubelet 侧的变化相配套kubelet 与默认 docker 运行时支持在目标容器的 Linux 进程命名空间中运行临时容器其他容器运行时需自行实现该支持后此特性才对其可用。存储SIG Storage多项特性 GA 与 Windows CSI Alphav1.18.0 的存储侧变化最为集中转 GA 的特性Raw Block SupportBlockVolume 与 CSIBlockVolume卷可以以块设备形式暴露给容器而不只是挂载文件系统Volume CloningVolumePVCDataSource通过 Kubernetes API 使用 CSI 克隆 PVC 及其底层存储卷CSIDriver API 对象毕业到 storage.k8s.io/v1简化 CSI 驱动发现允许驱动自定义 Kubernetes 行为。当前仓库中 CSIDriver 类型定义可见于 staging/src/k8s.io/api/storage/v1/types.go。新 Alpha 特性Windows CSI Support通过新组件 CSIProxy 让非特权预批准容器在 Windows 上执行特权存储操作容器化 CSI 节点插件由此可以在 Windows 上落地Recursive Volume Ownership OnRootMismatch 选项为需要改变所有权且目录/文件众多的卷缩短挂载时间的策略选项。同期还在 CSI 迁移方面推进CSIMigrationOpenStack 提升到 Beta默认关闭需安装 OpenStack Cinder CSI 驱动内置的 kubernetes.io/cinder 驱动 1.16 已弃用、1.20 移除迁移的 PV/PVC 会获得 volume.beta.kubernetes.io/migrated-to 注解提示外部 provisioner 接管这些对象的供给与删除。其他值得注意的发布项IPv6 转 BetaSIG Networkkube-proxy 的 iptables proxier 增加 IPv4/IPv6 双栈支持kubelet 支持 --node-ip :: 自动检测 IPv6 作为节点主地址kubeadm 支持双栈 node cidr mask 自动计算且允许在启用双栈时配置单栈集群NodeLocal DNSCache 转 GA以 DaemonSet 形式在每个节点运行 DNS 缓存 Pod改善 clusterDNS 的性能与可靠性自 1.13 Alpha 以来的毕业EndpointSlice 默认启用新增 EndpointSliceProxying 特性门控决定是否让 kube-proxy 使用 EndpointSlice默认关闭将EndpointSlice 控制器与代理路径两个行为解耦。紧急升级注意事项升级前必读CHANGELOG 中 v1.18.0 的 Urgent Upgrade Notes 是升级 1.18 的硬性检查清单按组件归纳如下。kube-apiserver--encryption-provider-config 的 cacheSize 语义变化此前显式配置 cacheSize: 0 会被静默默认成缓存 1000 个密钥在 1.18 中该写法会返回配置校验错误。若要禁用缓存需将 cacheSize 设为负值。CacheSize 类型由 int32 改为 *int32以便区分显式传 0与未传值同时 KMS provider 的 Unix socket 端点现在在加载 EncryptionConfiguration 时即被校验原先由 GRPCService 处理CSR 审批权限收紧使用 certificatesigningrequests/approval API 的消费方现在必须拥有针对 CSR 请求的具体 signer 的 approve 权限与新的 signerName 字段相关。kubelet--enable-cadvisor-json-endpoints 默认关闭该 flag 在 1.15 已弃用、1.19 移除若依赖 cAdvisor v1 Json API需在命令行显式开启CSIMigrationOpenStack 转 Beta默认关闭迁移窗口为 1.20内置 Cinder 驱动移除时点已有 Pod/PVC 应在移除前完成迁移。kubectl不再默认连接 http://localhost:8080kubectl 与 client-go 都不再把 localhost:8080 作为默认服务器地址。仍在使用该 legacy 地址的集群强烈建议先加固无法加固的client-go 用户可设置环境变量 KUBERNETES_MASTERkubectl 用户可通过 --server、--kubeconfig 或 KUBECONFIG 显式指定地址kubectl run 只创建 Pod移除了此前已弃用的 generator 机制及无关 flag创建 Deployment 等其他对象需改用 kubectl create 的对应子命令kubectl rolling-update 命令被移除。client-go方法签名全面改为接收 context这是 1.18 对 Go 开发者影响最大的破坏性变更生成的 clientset、dynamic、metadata、scale 客户端的方法签名均改为接收 context.Context 作为第一个参数Create / Update / Patch 方法分别改为接收 CreateOptions / UpdateOptions / PatchOptionsDelete / DeleteCollection 改为按值而非按引用接收 DeleteOptions旧接口被保留在新的 deprecated 包中以便渐进迁移这些包计划在 1.21 移除官方提供了 clientgofix 工具批量改写方法调用rest.Request 的 Do、DoRaw、Stream、Watch 均要求调用方传入 context.Context用于超时与取消信号并移除了 Request 的 Context 方法——不需要的场景传 context.Background() 即可。指标metrics大规模更名大量弃用指标在 1.18 被移除需要迁移到对应替代指标其中 v1.14.0 起可用的替代包括节选rest_client_request_latency_seconds → rest_client_request_duration_secondsapiserver_request_latencies → apiserver_request_duration_secondsapiserver_request_count → apiserver_request_totalkubelet_pod_worker_latency_microseconds → kubelet_pod_worker_duration_secondskubelet_runtime_operations → kubelet_runtime_operations_totalscheduler_e2e_scheduling_latency_microseconds → scheduler_e2e_scheduling_duration_secondskubeproxy_sync_proxy_rules_latency_microseconds → kubeproxy_sync_proxy_rules_duration_secondskubelet 资源指标端点也发生变化/metrics/resource/v1alpha1 及其中所有指标被弃用需迁移到 /metrics/resource同时 node_cpu_usage_seconds、container_cpu_usage_seconds 等命名在 1.18.1 又经历了一次回滚式的 _total 后缀修正部分回滚了 1.18.0 中移除 _total 后缀的变更。弃用与移除清单v1.18.0以下 API 自 1.18 起不再提供服务这是硬性破坏点apps/v1beta1 与 apps/v1beta2 下的全部资源 → 使用 apps/v1extensions/v1beta1 下的 daemonsets、deployments、replicasets → 使用 apps/v1extensions/v1beta1 下的 networkpolicies → 使用 networking.k8s.io/v1extensions/v1beta1 下的 podsecuritypolicies → 使用 policy/v1beta1。其他组件的弃用要点kube-proxy--healthz-port、--metrics-port 弃用改用 --healthz-bind-address、--metrics-bind-addresskubeadmkubeadm upgrade node 的 kubelet-version 参数弃用kubeadm alpha certs renew 的实验性 flag --use-api 弃用kube-dns 弃用kubeadm-config ConfigMap 中的 ClusterStatus 结构弃用同一信息可从 etcd 与 kube-apiserver Pod 的注解 kubeadm.kubernetes.io/etcd.advertise-client-urls、kubeadm.kubernetes.io/kube-apiserver.advertise-address.endpoint 获取kubectl--dry-run 的布尔/无值写法弃用未来版本必须取 --dry-runserver|client|none--server-dry-run 由 --dry-runserver 取代kubeletStreamingProxyRedirects 特性与 --redirect-container-streaming flag 弃用v1.20 起将无法启用该 flag默认行为通过 kubelet 代理流式请求成为唯一支持选项调度器scheduling_duration_seconds summary 指标弃用scheduling_algorithm_predicate_evaluation_seconds 与 scheduling_algorithm_priority_evaluation_seconds 由 framework_extension_point_duration_seconds[extension_pointFilter|Score] 取代Policy API 中 AlwaysCheckAllPredicates 弃用其他k8s.io/node-api 组件停止更新RuntimeClass 类型移入 k8s.io/api客户端移入 k8s.io/client-goapiserver_request_total 移除 client 标签cluster-monitoring addon 被移除。同时以下 feature gates 因对应特性已在先前版本无条件启用而被移除不再有 --feature-gates 开关PodPriority、TaintNodesByCondition、ResourceQuotaScopeSelectors、ScheduleDaemonSetPods以及 CustomResourceValidation、CustomResourceSubresources、CustomResourceWebhookConversion、CustomResourcePublishOpenAPI、CustomResourceDefaulting。新 API 类型、字段与配置变化v1.18.0新 API 类型/版本IngressClass 资源networking.k8s.io/v1CSIDriver 毕业到 storage.k8s.io/v1kubescheduler.config.k8s.io/v1alpha2支持多个调度 profile按 Pod 的 spec.schedulerName 选择 profile、Scheduler Extenders 可在 v1alpha2 component config 中配置、PostFilter 扩展点更名为 PreScore、HardPodAffinityWeight 从顶层参数移入 InterPodAffinity 插件的 PluginConfig。新 API 字段autoscaling/v2beta2 HPA 新增 spec.behavior可分别对扩容/缩容配置稳定窗口、策略列表与选择方式按绝对 Pod 数或百分比限制增减Ingress 新增 spec.ingressClassName 与 path 的 pathTypeAnyVolumeDataSourceAlphaPVC 的 spec.dataSource 可引用自定义类型作为数据源ConfigurableFSGroupPolicyAlphav1 Pod 可设置 spec.securityContext.fsGroupChangePolicy 控制卷的文件权限应用方式ServiceAppProtocolAlphaServicePort 与 EndpointPort 可设置 appProtocol 字段ImmutableEphemeralVolumesAlphaSecret 与 ConfigMap 增加 immutable 字段标记其内容不可变。配置与命令行变化v1.18.0 新增kube-apiserver--egress-selector-config-file 接受 apiserver.k8s.io/v1beta1 EgressSelectorConfiguration支持为到网络代理的 HTTP/gRPC 连接配置代理新增 --goaway-chance flag按比例优雅关闭GOAWAYHTTP/2 连接防止客户端粘在单 apiserver 上最小 0 关闭最大 .02 即 1/50 请求建议 .001 起步单 apiserver 或不使用 LB 的集群不应启用kube-proxy新增 --ipvs-tcp-timeout、--ipvs-tcpfin-timeout、--ipvs-udp-timeout 配置 IPVS 连接超时新增可选 --detect-local-mode flag取值 ClusterCIDR默认与旧行为一致与 NodeCIDRkube-controller-manager新增 --endpointslice-updates-batch-period减少 Pod 变更引发的 endpointslice 更新次数kube-controller-manager 与 kube-scheduler 默认暴露 profiling 以对齐 kube-apiserver可用 --profilingfalse 关闭kube-proxy、kubelet、kube-controller-manager、kube-scheduler 均新增 --show-hidden-metrics-for-version可展示上一小版本已弃用的隐藏指标kubelet podresources API 改为只提供活跃 Pod 的信息。安全漏洞与修复版本1.18 生命周期内的安全条目是判断必须升级的主要依据CVE-2020-8557Medium容器 /etc/hosts 文件导致节点本地拒绝服务在 v1.18.6 修复同版本还包含 CVE-2020-8559。CVE-2020-8559Medium从被攻陷的节点到集群的特权提升在 v1.18.6 的紧急升级说明中列出。该修复带来一个行为变化需要注意API Server 不再代理非 101 响应的升级upgrade请求——这可能会影响对升级请求返回非 101 响应码的被代理后端如扩展 API server。CVE-2021-25735Validating Admission Webhook 观察不到部分旧字段v1.18.18 修复kube-apiserver 存在安全缺陷可能使 Node 更新绕过 Validating Admission Webhook。仅当运行基于 Node 对象旧状态至少部分地做出拒绝决定的 Node Validating Webhook 时才受影响通过内置 NodeRestriction admission 插件的 kubelet 调用不受影响。CHANGELOG 给出的受影响与修复版本对应关系受影响版本修复版本kube-apiserver v1.20.0 – v1.20.5v1.21.0kube-apiserver v1.19.0 – v1.19.9v1.20.6kube-apiserver ≤ v1.18.17v1.20.6 / v1.19.10 / v1.18.18CVSS 评级Medium6.5向量 CVSS:3.0/AV:N/AC:L/PR:H/UI:N/S:U/C:N/I:H/A:H报告者为 RedHat 的 Rogerio Bastos 与 Ari Lima。CVE-2021-3121v1.18.18 通过重新生成 protobuf 代码修复同时升级 gogo/protobuf v1.3.1 → v1.3.2 等依赖。CVE-2020-9283golang.org/x/net 与 x/crypto 更新以带入修复。另有一个间接安全相关变化client-go 在 v1.18.14 将高详细度verbosity ≥ 9头日志中的 Authorization 头内容掩码化v1.18.10 增加了对 docker config 文件畸形时不记录其内容的防护v1.18.0 中 AzureFile 与 CephFS 改用新的 Mount 库防止敏感挂载选项进入日志。补丁版本关键修复速览v1.18.0 之后以下为各补丁版本中具有普遍参考价值的修复按主题归纳kubelet / 节点侧v1.18.6声明了 startupProbe 但未声明 readinessProbe 的容器此前在 startupProbe 完成前被视为 Ready现在被视为 NotReady行为收紧影响发布探针设计kube-apiserver 的 /readyz 扩展了 informer-sync 检查确保内部 informer 已同步才报告就绪v1.18.16节点在与 API server 至少完成一次同步前不会被标记为 Readyv1.18.17kubelet 自动清理孤儿卷目录修复了失败节点未正确设置 NoExecute taint 的问题v1.18.19修复容器首次重启后 startupProbe 停止工作的问题v1.18.20回滚了上一版 portforward 清理修复因其引入了可能导致 kubelet 分段错误的回归。kube-apiserver / API 机制侧v1.18.9修复设置字段/标签选择器并带分页 limit 的 list 请求返回不一致结果的 bug修复 watch 请求处理中的潜在内存泄漏v1.18.10修复 etcd_object_counts 指标上报v1.18.18修复 API server 启动时的竞态——确保先前创建的 webhook 配置在第一个写请求被接受前已生效修复 PFpriority and fairnessfilter 中的数据竞争降低单个 etcd lease 可挂载的事件对象上限缓解高事件 churn 导致的 master 不稳定v1.18.19新增 Priority Fairness 规则豁免所有探针路径/readyz、/healthz、/livez防止 kubelet 重启健康的 kube-apiserver 实例。存储侧v1.18.5CSI 卷挂载通过 informer 修复扩展性问题v1.18.15修复 CSI 迁移的 inline EBS 卷在 volumeID 带 aws:// 前缀时挂载失败v1.18.17CSI 卷数据文件创建失败时不再自动删除全部数据改为仅移除数据文件与卷路径数据保护行为变更运维需知v1.18.16修复某些 dangling attachment 状态下 CSI 卷无法恢复的问题。网络 / 调度侧v1.18.6修复某些 VXLAN 网络插件下 63 秒或 1 秒连接延迟的问题1.16 起被广泛注意到——此前用 ethtool 关闭主网卡校验和卸载checksum offload的用户可以撤销该 workaroundv1.18.3修复 1.18 回归中 Init 容器未被计入调度时资源请求计算的问题v1.18.11修复带 topologySpreadConstraints 的 Pod 被调度到缺少必需 label 的节点kubectl drain 高 CPU 占用问题v1.18.18EndpointSlice 允许端口数上限从 100 提升到 20000。依赖变更版本间值得关注的条目CHANGELOG 每个版本都有 Dependencies 小节Added / Changed / Removed。1.18 系列中出现的代表性依赖变更包括v1.18.8使用 go1.13.15 构建v1.18.9github.com/evanphx/json-patch 更新至 v4.9.0incompatible移除 github.com/jessevdk/go-flagsv1.18.18gogo/protobuf v1.3.1 → v1.3.2配合 CVE-2021-3121 修复golang.org/x/net 与 golang.org/x/sys 更新v1.18.19sigs.k8s.io/structured-merge-diff/v3 v3.0.0 → v3.0.1。版本选择与维护建议基于 CHANGELOG-1.18.md 的完整记录给出面向运维决策的事实性结论若集群仍在 1.18 线应至少升级到 v1.18.18 以修复 CVE-2021-25735理想目标是 v1.18.20该系列最终补丁累计全部安全修复升级 v1.18.0 前的强制动作检查是否仍消费 extensions/v1beta1、apps/v1beta1/v1beta2 API确认客户端代码与 kubectl 工作流已适配 context 签名与 kubectl run/dry-run 行为变化核对监控面板中已移除的旧指标名检查加密配置中 cacheSize: 0 的写法避免使用 v1.18.7产物不完整官方明确 Do not use产物验证部署前用 CHANGELOG 中对应版本的 sha512 校验和核对下载的 tar.gz防止产物损坏或被篡改完整的逐版本条目含每条变更的 SIG 归属见仓库文档 CHANGELOG/CHANGELOG-1.18.md其目录结构每个版本下的 Downloads / Changelog since / Changes by Kind / Dependencies 小节也适用于仓库中其他小版本的 CHANGELOG 文件如 CHANGELOG/CHANGELOG-1.17.md、CHANGELOG/CHANGELOG-1.19.md。小结Kubernetes 1.18 是一个承前启后的版本一方面清理了大量历史包袱移除 extensions/v1beta1 系列 API、client-go 旧接口、kubectl 旧命令与旧指标另一方面将 Server-Side Apply、Topology Manager、IngressClass、存储 GA 特性等现代能力推向可用状态。CHANGELOG-1.18.md 以统一的按变更类型 依赖变更 安全信息结构完整记录了从 v1.18.0 到 v1.18.20 的全部演进是评估集群升级窗口、排查版本相关回归、核对发布产物完整性的权威一手资料。【免费下载链接】kubernetesProduction-Grade Container Scheduling and Management项目地址: https://gitcode.com/GitHub_Trending/kuber/kubernetes创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表