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 字段 | 中 |
| GA | SELinux 卷标签性能优化 | 中 |
| Beta | DRA 设备 taint 和 tolerations | 低 |
| Beta | DRA 可分区设备支持 | 中 |
| GA | ServiceAccount 令牌外部签名 | 中 |
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 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-config3.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:true5.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 升级步骤
- 备份 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 的迁移路线图
版权声明:本文内容为原创,基于公开资料独立撰写。文中示例代码可自由使用于学习和个人项目。转载或引用请注明出处。
