当前位置: 首页 > news >正文

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 之前,建议执行以下检查:

  1. 审计现有工作负载:检查是否使用了 gitRepo 卷
  2. 评估 Ingress 方案:规划 Ingress NGINX 退役后的替代方案
  3. 测试外部 IP 使用:确认是否依赖 externalIPs 字段
  4. 验证 SELinux 配置:确保 SELinux 策略兼容新的挂载行为

    图 1: Kubernetes v1.36 架构概览

二、重大安全变更:Ingress NGINX 退役与替代方案

2.1 Ingress NGINX 退役背景

2026 年 3 月 24 日,Kubernetes SIG Network 和安全响应委员会正式宣布退役 Ingress NGINX 项目。自该日期起,不再有新的发布、bug 修复或安全漏洞更新。现有部署仍可继续运行,但不再推荐用于生产环境。

退役原因

  • 维护团队资源不足
  • 安全漏洞响应时间过长
  • 社区转向更现代的 Gateway API

2.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_VERSION="gateway.networking.k8s.io/v1";/** * 生成 HTTPRoute 配置 * @param serviceName 后端服务名称 * @param servicePort 服务端口 * @param pathPrefix 路径前缀 * @return YAML 配置字符串 */publicStringgenerateHTTPRoute(StringserviceName,intservicePort,StringpathPrefix){StringBuilderyaml=newStringBuilder();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){K8sDeploymentGeneratorgenerator=newK8sDeploymentGenerator();Stringconfig=generator.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-sync

apiVersion:v1kind:Podmetadata:name:app-with-gitspec:volumes:-name:git-dataemptyDir:{}initContainers:-name:git-syncimage:registry.k8s.io/git-sync/git-sync:v4.0.0args:---repo=https://github.com/example/config-repo---branch=main---depth=1---period=30svolumeMounts:-name:git-datamountPath:/tmp/gitcontainers:-name:appimage:myapp:latestvolumeMounts:-name:git-datamountPath:/etc/configreadOnly:true

方案二:使用 ConfigMap 或 Secret

对于配置文件,推荐使用 ConfigMap 或 Secret:

apiVersion: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-config

3.3 Python 对照示例(配置管理)

""" Kubernetes 配置管理工具 用于将 Git 仓库内容同步到 ConfigMap """importsubprocessimporttempfileimportosfrompathlibimportPathimportyamlclassGitToConfigMapSync:def__init__(self,repo_url:str,branch:str="main"):self.repo_url=repo_url self.branch=branchdefclone_repo(self,target_dir:str)->None:"""克隆 Git 仓库到指定目录"""subprocess.run(["git","clone","--depth","1","--branch",self.branch,self.repo_url,target_dir],check=True)defgenerate_configmap(self,source_dir:str,name:str,namespace:str="default")->str:"""从目录生成 ConfigMap YAML"""configmap={"apiVersion":"v1","kind":"ConfigMap","metadata":{"name":name,"namespace":namespace},"data":{}}forfile_pathinPath(source_dir).rglob("*"):iffile_path.is_file():relative_path=file_path.relative_to(source_dir)withopen(file_path,'r',encoding='utf-8')asf:configmap["data"][str(relative_path)]=f.read()returnyaml.dump(configmap,allow_unicode=True,default_flow_style=False)defsync(self,configmap_name:str,namespace:str="default")->str:"""执行完整同步流程"""withtempfile.TemporaryDirectory()astmpdir:self.clone_repo(tmpdir)returnself.generate_configmap(tmpdir,configmap_name,namespace)# 使用示例if__name__=="__main__":syncer=GitToConfigMapSync(repo_url="https://github.com/example/config-repo",branch="main")configmap_yaml=syncer.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:"nlb"service.beta.kubernetes.io/aws-load-balancer-scheme:"internet-facing"spec:type:LoadBalancerports:-port:443targetPort:8443protocol:TCPname:httpsselector:app:production

五、性能优化:SELinux 卷标签 GA

5.1 性能提升原理

v1.36 将 SELinux 卷标签优化功能正式 GA。该功能使用mount -o context=XYZ选项替代递归文件重标签,在挂载时一次性应用正确的 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:true

5.3 注意事项

⚠️重要警告:混合使用特权和非特权 Pod 共享卷时可能导致问题。Pod 作者需要正确设置seLinuxChangePolicy字段和 SELinux 卷标签。


六、动态资源分配(DRA)新特性

6.1 设备 taint 和 tolerations(Beta)

v1.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/gpu"config:-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/name=ingress-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 升级步骤

  1. 备份 etcd 数据
  2. 升级控制平面组件
  3. 升级节点组件(kubelet、kube-proxy)
  4. 验证工作负载运行状态
  5. 执行应用层迁移(如 Ingress 配置)

八、总结与展望

Kubernetes v1.36 是一个以安全和性能为核心优化的版本。主要亮点包括:

安全加固:移除 gitRepo 卷驱动、弃用 externalIPs、退役 Ingress NGINX
性能提升:SELinux 卷标签优化,显著减少 Pod 启动时间
资源管理:DRA 功能增强,支持设备 taint 和可分区设备
现代化:推动 Gateway API 成为标准入站流量管理方案

升级建议

  • 生产环境建议在 v1.36 正式发布后 2-4 周进行升级
  • 先在测试环境验证所有工作负载兼容性
  • 优先处理 gitRepo 和 externalIPs 的迁移
  • 规划 Ingress NGINX 到 Gateway API 的迁移路线图

版权声明:本文内容为原创,基于公开资料独立撰写。文中示例代码可自由使用于学习和个人项目。转载或引用请注明出处。

http://www.cnnetsun.cn/news/1876560.html

相关文章:

  • devops系列(二) Git 工作流与版本控制:团队协作不踩坑
  • Java 从入门到精通(十五):线程同步与 synchronized,为什么多个线程改同一个变量时结果总会乱?
  • 收藏 | 零基础小白也能看懂:Transformer大模型是如何炼成的
  • HJ175 小红的整数配对
  • 短视频商城APP源码开发:技术、功能与运营全链路解决方案
  • 华为OD机试 - 魔法收积木 - 二进制(Python/JS/C/C++ 新系统 200分)
  • VS Code 插件系统深度剖析
  • SpringCloud微服务进阶-Nacos更加全能的注册中心澈
  • 消息队列Kafka与RabbitMQ深度解析:把分布式消息核心讲透,吊打面试官
  • ASTM D4169视网膜下注射套件的包装运输验证方案
  • 三相UVW的时间分配
  • MT6826S磁编码器:高精度与强抗干扰的工业级解决方案
  • AI Agent岗位面试通过率有多低:真实数据
  • 三维地图可视化 ThreeJS vue 开源项目
  • CV算法工程师成长路线:从入门到面试的25个关键节点
  • AI编程工具对比:Claude Code vs Devin vs Copilot
  • 模型解析 | GPT-3:开启上下文学习的1750亿参数巨兽(上)
  • 从模型装配到参数化:HFSS局部坐标系与面坐标系的进阶实战
  • 斯坦福AI开发课程对我帮助有多大:真实反馈
  • 别再羡慕Discord了!用TailChat在莱卡云上自建一个,保姆级图文教程(含Nginx反代配置)
  • 倾斜摄影模型修复避坑指南:从水面修补到道路置平,模方(ModelFun)实战操作全记录
  • 拿下CV算法offer:30+场面试总结的核心知识点
  • YOLO26涨点改进| CVPR 2026 | 独家创新首发、Conv改进篇| 全新TMConv三角掩码卷积模块,轻量化涨点改进,增强特征的空间感知能力,助力目标检测,图像去噪,图像分割有效涨点
  • Python 对象模型与属性访问机制
  • OpenFace 2.2.0:面部行为分析计算机视觉工具深度解析与实战应用指南
  • FFmpeg基础知识速览
  • 前端敏感数据国密SM2加密传输实战:从安全测试到代码落地
  • 获得solidworks 3d零件的包围框 长宽高 boundingbox c#
  • AI驱动学术写作:8款实用工具简化毕业设计流程
  • Joplin大纲插件终极指南:3分钟掌握智能文档导航