Kubernetes v1.36 云原生架构新特性详解:生产级集群升级指南
Kubernetes v1.36 云原生架构新特性详解生产级集群升级指南一、Kubernetes v1.36 发布概览1.1 版本发布时间线Kubernetes v1.36 预计于 2026 年 4 月底正式发布。根据 Kubernetes 项目的发布周期每个大版本大约每 4 个月发布一次。v1.36 是一个包含大量增强功能的重要版本同时也包含了一些破坏性变更需要集群管理员提前做好升级准备。1.2 核心变更摘要变更类型内容影响程度移除gitRepo 卷驱动永久禁用高弃用Service.spec.externalIPs 字段中GASELinux 卷标签性能优化中BetaDRA 设备 taint 和 tolerations低BetaDRA 可分区设备支持中GAServiceAccount 令牌外部签名中1.3 升级建议在升级到 v1.36 之前建议执行以下检查审计现有工作负载检查是否使用了 gitRepo 卷评估 Ingress 方案规划 Ingress NGINX 退役后的替代方案测试外部 IP 使用确认是否依赖 externalIPs 字段验证 SELinux 配置确保 SELinux 策略兼容新的挂载行为图 1: Kubernetes v1.36 架构概览二、重大安全变更Ingress NGINX 退役与替代方案2.1 Ingress NGINX 退役背景2026 年 3 月 24 日Kubernetes SIG Network 和安全响应委员会正式宣布退役 Ingress NGINX 项目。自该日期起不再有新的发布、bug 修复或安全漏洞更新。现有部署仍可继续运行但不再推荐用于生产环境。退役原因维护团队资源不足安全漏洞响应时间过长社区转向更现代的 Gateway API2.2 替代方案对比方案成熟度迁移成本推荐场景Gateway API Contour高中生产环境首选Gateway API Envoy Gateway中中新项目推荐Traefik高低中小规模集群HAProxy Ingress高低简单 HTTP/HTTPS 路由2.3 迁移到 Gateway API 实战以下是使用 Gateway API 替代 Ingress NGINX 的配置示例# Gateway API 配置示例apiVersion:gateway.networking.k8s.io/v1kind:Gatewaymetadata:name:production-gatewaynamespace:ingress-nginxspec:gatewayClassName:envoy-gateway-classlisteners:-name:httpprotocol:HTTPport:80-name:httpsprotocol:HTTPSport:443tls:mode:TerminatecertificateRefs:-name:tls-secret---apiVersion:gateway.networking.k8s.io/v1kind:HTTPRoutemetadata:name:app-routenamespace:defaultspec:parentRefs:-name:production-gatewaynamespace:ingress-nginxrules:-matches:-path:type:PathPrefixvalue:/apibackendRefs:-name:api-serviceport:8080-matches:-path:type:PathPrefixvalue:/backendRefs:-name:web-serviceport:80图 2: Ingress NGINX 迁移到 Gateway API 对比2.4 Java 应用部署示例/** * Kubernetes 部署配置生成器 * 用于生成 Gateway API 兼容的部署配置 */publicclassK8sDeploymentGenerator{privatestaticfinalStringGATEWAY_API_VERSIONgateway.networking.k8s.io/v1;/** * 生成 HTTPRoute 配置 * param serviceName 后端服务名称 * param servicePort 服务端口 * param pathPrefix 路径前缀 * return YAML 配置字符串 */publicStringgenerateHTTPRoute(StringserviceName,intservicePort,StringpathPrefix){StringBuilderyamlnewStringBuilder();yaml.append(apiVersion: ).append(GATEWAY_API_VERSION).append(\n);yaml.append(kind: HTTPRoute\n);yaml.append(metadata:\n);yaml.append( name: ).append(serviceName).append(-route\n);yaml.append(spec:\n);yaml.append( parentRefs:\n);yaml.append( - name: production-gateway\n);yaml.append( namespace: ingress-nginx\n);yaml.append( rules:\n);yaml.append( - matches:\n);yaml.append( - path:\n);yaml.append( type: PathPrefix\n);yaml.append( value: ).append(pathPrefix).append(\n);yaml.append( backendRefs:\n);yaml.append( - name: ).append(serviceName).append(\n);yaml.append( port: ).append(servicePort).append(\n);returnyaml.toString();}publicstaticvoidmain(String[]args){K8sDeploymentGeneratorgeneratornewK8sDeploymentGenerator();Stringconfiggenerator.generateHTTPRoute(api-service,8080,/api);System.out.println(config);}}三、gitRepo 卷驱动永久移除影响与迁移方案3.1 移除原因gitRepo 卷类型自 v1.11 起已被弃用但在 v1.36 之前仍可使用。该卷类型存在严重的安全问题攻击者可能利用 gitRepo 以 root 身份在节点上执行代码。安全风险允许在 Pod 初始化时自动克隆 Git 仓库缺乏适当的权限控制可能导致节点级别的代码执行3.2 迁移方案方案一使用 initContainer git-syncapiVersion:v1kind:Podmetadata:name:app-with-gitspec:volumes:-name:git-dataemptyDir:{}initContainers:-name:git-syncimage:registry.k8s.io/git-sync/git-sync:v4.0.0args:---repohttps://github.com/example/config-repo---branchmain---depth1---period30svolumeMounts:-name:git-datamountPath:/tmp/gitcontainers:-name:appimage:myapp:latestvolumeMounts:-name:git-datamountPath:/etc/configreadOnly:true方案二使用 ConfigMap 或 Secret对于配置文件推荐使用 ConfigMap 或 SecretapiVersion:v1kind:ConfigMapmetadata:name:app-configdata:application.yml:|server: port: 8080 spring: application: name: my-app---apiVersion:apps/v1kind:Deploymentmetadata:name:my-appspec:template:spec:containers:-name:appvolumeMounts:-name:configmountPath:/etc/configvolumes:-name:configconfigMap:name:app-config3.3 Python 对照示例配置管理 Kubernetes 配置管理工具 用于将 Git 仓库内容同步到 ConfigMap importsubprocessimporttempfileimportosfrompathlibimportPathimportyamlclassGitToConfigMapSync:def__init__(self,repo_url:str,branch:strmain):self.repo_urlrepo_url self.branchbranchdefclone_repo(self,target_dir:str)-None:克隆 Git 仓库到指定目录subprocess.run([git,clone,--depth,1,--branch,self.branch,self.repo_url,target_dir],checkTrue)defgenerate_configmap(self,source_dir:str,name:str,namespace:strdefault)-str:从目录生成 ConfigMap YAMLconfigmap{apiVersion:v1,kind:ConfigMap,metadata:{name:name,namespace:namespace},data:{}}forfile_pathinPath(source_dir).rglob(*):iffile_path.is_file():relative_pathfile_path.relative_to(source_dir)withopen(file_path,r,encodingutf-8)asf:configmap[data][str(relative_path)]f.read()returnyaml.dump(configmap,allow_unicodeTrue,default_flow_styleFalse)defsync(self,configmap_name:str,namespace:strdefault)-str:执行完整同步流程withtempfile.TemporaryDirectory()astmpdir:self.clone_repo(tmpdir)returnself.generate_configmap(tmpdir,configmap_name,namespace)# 使用示例if__name____main__:syncerGitToConfigMapSync(repo_urlhttps://github.com/example/config-repo,branchmain)configmap_yamlsyncer.sync(app-config,default)print(configmap_yaml)四、Service.spec.externalIPs 弃用安全路由新方案4.1 安全风险externalIPs 字段允许将任意外部 IP 路由到 Service这可能导致中间人攻击CVE-2020-8554。从 v1.36 开始使用该字段将显示弃用警告计划在 v1.43 中完全移除。4.2 替代方案需求场景推荐方案说明云环境入站流量LoadBalancer Service云厂商管理的负载均衡器简单端口暴露NodePort Service直接暴露节点端口灵活路由Gateway API现代化的流量管理方案内部服务发现ClusterIP Ingress标准内部服务发现4.3 LoadBalancer Service 配置apiVersion:v1kind:Servicemetadata:name:production-serviceannotations:# AWS 示例service.beta.kubernetes.io/aws-load-balancer-type:nlbservice.beta.kubernetes.io/aws-load-balancer-scheme:internet-facingspec:type:LoadBalancerports:-port:443targetPort:8443protocol:TCPname:httpsselector:app:production五、性能优化SELinux 卷标签 GA5.1 性能提升原理v1.36 将 SELinux 卷标签优化功能正式 GA。该功能使用mount -o contextXYZ选项替代递归文件重标签在挂载时一次性应用正确的 SELinux 标签显著减少 Pod 启动延迟。性能对比v1.35 及之前递归遍历所有文件大卷可能需要数分钟v1.36挂载时一次性应用标签秒级完成图 3: SELinux 卷标签性能对比5.2 配置示例apiVersion:v1kind:Podmetadata:name:selinux-optimized-podspec:securityContext:seLinuxOptions:level:s0:c123,c456# 显式启用 SELinux 挂载优化seLinuxChangePolicy:MountOptioncontainers:-name:appimage:myapp:latestvolumeMounts:-name:datamountPath:/datavolumes:-name:datapersistentVolumeClaim:claimName:data-pvc# 在 Pod 级别启用 SELinux 挂载selinuxMount:true5.3 注意事项⚠️重要警告混合使用特权和非特权 Pod 共享卷时可能导致问题。Pod 作者需要正确设置seLinuxChangePolicy字段和 SELinux 卷标签。六、动态资源分配DRA新特性6.1 设备 taint 和 tolerationsBetav1.36 将 DRA 设备 taint 功能推进到 Beta。该功能允许 DRA 驱动将设备标记为tainted确保只有明确请求的工作负载才能使用这些设备。使用场景专用 GPU 保留给特定团队特殊硬件FPGA、ASIC的访问控制测试设备的隔离使用6.2 可分区设备支持DRA 现在支持将单个硬件加速器分割成多个逻辑单元允许多个工作负载共享同一物理设备。这对于 GPU 等昂贵资源尤其有用。图 4: DRA 可分区设备示意图示例配置apiVersion:resource.k8s.io/v1alpha3kind:DeviceClassmetadata:name:partitionable-gpuspec:selectors:-cel:expression:device.driver nvidia.com/gpuconfig:-opaque:domain:nvidia.comparameters:partition:1g.5gb# 分区规格---apiVersion:v1kind:Podmetadata:name:gpu-partition-podspec:containers:-name:ml-trainingimage:tensorflow/tensorflow:latestresources:claims:-name:gpu-partitionrequest:gpu-requestresourceClaims:-name:gpu-partitionresourceClaimName:gpu-partition-claim---apiVersion:resource.k8s.io/v1alpha3kind:ResourceClaimmetadata:name:gpu-partition-claimspec:deviceClassName:partitionable-gpu七、生产环境升级检查清单7.1 升级前检查#!/bin/bash# Kubernetes v1.36 升级前检查脚本echo Kubernetes v1.36 升级前检查 # 检查 gitRepo 卷使用echo[1/5] 检查 gitRepo 卷使用情况...kubectl get pods --all-namespaces-ojsonpath{range .items[*]}{.metadata.namespace}{\t}{.metadata.name}{\n}{range .spec.volumes[*]}{.gitRepo}{\n}{end}{end}|grep-v^$# 检查 externalIPs 使用echo[2/5] 检查 externalIPs 使用情况...kubectl get services --all-namespaces-ojsonpath{range .items[*]}{.metadata.namespace}{\t}{.metadata.name}{\t}{.spec.externalIPs}{\n}{end}|grep-v\[\]# 检查 Ingress NGINX 部署echo[3/5] 检查 Ingress NGINX 部署...kubectl get deployments --all-namespaces-lapp.kubernetes.io/nameingress-nginx# 检查 SELinux 状态echo[4/5] 检查节点 SELinux 状态...kubectl get nodes-ojsonpath{range .items[*]}{.metadata.name}{\t}{.status.nodeInfo.operatingSystem}{\n}{end}# 检查当前版本echo[5/5] 当前 Kubernetes 版本...kubectl version--shortecho 检查完成 图 5: 升级检查流程图7.2 升级步骤备份 etcd 数据升级控制平面组件升级节点组件kubelet、kube-proxy验证工作负载运行状态执行应用层迁移如 Ingress 配置八、总结与展望Kubernetes v1.36 是一个以安全和性能为核心优化的版本。主要亮点包括✅安全加固移除 gitRepo 卷驱动、弃用 externalIPs、退役 Ingress NGINX✅性能提升SELinux 卷标签优化显著减少 Pod 启动时间✅资源管理DRA 功能增强支持设备 taint 和可分区设备✅现代化推动 Gateway API 成为标准入站流量管理方案升级建议生产环境建议在 v1.36 正式发布后 2-4 周进行升级先在测试环境验证所有工作负载兼容性优先处理 gitRepo 和 externalIPs 的迁移规划 Ingress NGINX 到 Gateway API 的迁移路线图版权声明本文内容为原创基于公开资料独立撰写。文中示例代码可自由使用于学习和个人项目。转载或引用请注明出处。