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 的配置示例:
yaml
# Gateway API 配置示例
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: production-gateway
namespace: ingress-nginx
spec:
gatewayClassName: envoy-gateway-class
listeners:
- name: http
protocol: HTTP
port: 80
- name: https
protocol: HTTPS
port: 443
tls:
mode: Terminate
certificateRefs:
- name: tls-secret
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: app-route
namespace: default
spec:
parentRefs:
- name: production-gateway
namespace: ingress-nginx
rules:
- matches:
- path:
type: PathPrefix
value: /api
backendRefs:
- name: api-service
port: 8080
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: web-service
port: 80
图 2: Ingress NGINX 迁移到 Gateway API 对比
2.4 Java 应用部署示例
java
/**
* Kubernetes 部署配置生成器
* 用于生成 Gateway API 兼容的部署配置
*/
public class K8sDeploymentGenerator {
private static final String GATEWAY_API_VERSION = "gateway.networking.k8s.io/v1";
/**
* 生成 HTTPRoute 配置
* @param serviceName 后端服务名称
* @param servicePort 服务端口
* @param pathPrefix 路径前缀
* @return YAML 配置字符串
*/
public String generateHTTPRoute(String serviceName, int servicePort, String pathPrefix) {
StringBuilder yaml = new StringBuilder();
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");
return yaml.toString();
}
public static void main(String[] args) {
K8sDeploymentGenerator generator = new K8sDeploymentGenerator();
String config = 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
yaml
apiVersion: v1
kind: Pod
metadata:
name: app-with-git
spec:
volumes:
- name: git-data
emptyDir: {}
initContainers:
- name: git-sync
image: registry.k8s.io/git-sync/git-sync:v4.0.0
args:
- --repo=https://github.com/example/config-repo
- --branch=main
- --depth=1
- --period=30s
volumeMounts:
- name: git-data
mountPath: /tmp/git
containers:
- name: app
image: myapp:latest
volumeMounts:
- name: git-data
mountPath: /etc/config
readOnly: true
方案二:使用 ConfigMap 或 Secret
对于配置文件,推荐使用 ConfigMap 或 Secret:
yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
application.yml: |
server:
port: 8080
spring:
application:
name: my-app
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
template:
spec:
containers:
- name: app
volumeMounts:
- name: config
mountPath: /etc/config
volumes:
- name: config
configMap:
name: app-config
3.3 Python 对照示例(配置管理)
python
"""
Kubernetes 配置管理工具
用于将 Git 仓库内容同步到 ConfigMap
"""
import subprocess
import tempfile
import os
from pathlib import Path
import yaml
class GitToConfigMapSync:
def __init__(self, repo_url: str, branch: str = "main"):
self.repo_url = repo_url
self.branch = branch
def clone_repo(self, target_dir: str) -> None:
"""克隆 Git 仓库到指定目录"""
subprocess.run([
"git", "clone",
"--depth", "1",
"--branch", self.branch,
self.repo_url,
target_dir
], check=True)
def generate_configmap(self, source_dir: str, name: str, namespace: str = "default") -> str:
"""从目录生成 ConfigMap YAML"""
configmap = {
"apiVersion": "v1",
"kind": "ConfigMap",
"metadata": {
"name": name,
"namespace": namespace
},
"data": {}
}
for file_path in Path(source_dir).rglob("*"):
if file_path.is_file():
relative_path = file_path.relative_to(source_dir)
with open(file_path, 'r', encoding='utf-8') as f:
configmap["data"][str(relative_path)] = f.read()
return yaml.dump(configmap, allow_unicode=True, default_flow_style=False)
def sync(self, configmap_name: str, namespace: str = "default") -> str:
"""执行完整同步流程"""
with tempfile.TemporaryDirectory() as tmpdir:
self.clone_repo(tmpdir)
return self.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 配置
yaml
apiVersion: v1
kind: Service
metadata:
name: production-service
annotations:
# AWS 示例
service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
service.beta.kubernetes.io/aws-load-balancer-scheme: "internet-facing"
spec:
type: LoadBalancer
ports:
- port: 443
targetPort: 8443
protocol: TCP
name: https
selector:
app: production
五、性能优化:SELinux 卷标签 GA
5.1 性能提升原理
v1.36 将 SELinux 卷标签优化功能正式 GA。该功能使用 mount -o context=XYZ 选项替代递归文件重标签,在挂载时一次性应用正确的 SELinux 标签,显著减少 Pod 启动延迟。
性能对比:
- v1.35 及之前:递归遍历所有文件,大卷可能需要数分钟
- v1.36:挂载时一次性应用标签,秒级完成

图 3: SELinux 卷标签性能对比
5.2 配置示例
yaml
apiVersion: v1
kind: Pod
metadata:
name: selinux-optimized-pod
spec:
securityContext:
seLinuxOptions:
level: "s0:c123,c456"
# 显式启用 SELinux 挂载优化
seLinuxChangePolicy: MountOption
containers:
- name: app
image: myapp:latest
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
persistentVolumeClaim:
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 可分区设备示意图
示例配置:
yaml
apiVersion: resource.k8s.io/v1alpha3
kind: DeviceClass
metadata:
name: partitionable-gpu
spec:
selectors:
- cel:
expression: device.driver == "nvidia.com/gpu"
config:
- opaque:
domain: nvidia.com
parameters:
partition: "1g.5gb" # 分区规格
---
apiVersion: v1
kind: Pod
metadata:
name: gpu-partition-pod
spec:
containers:
- name: ml-training
image: tensorflow/tensorflow:latest
resources:
claims:
- name: gpu-partition
request: gpu-request
resourceClaims:
- name: gpu-partition
resourceClaimName: gpu-partition-claim
---
apiVersion: resource.k8s.io/v1alpha3
kind: ResourceClaim
metadata:
name: gpu-partition-claim
spec:
deviceClassName: partitionable-gpu
七、生产环境升级检查清单
7.1 升级前检查
bash
#!/bin/bash
# Kubernetes v1.36 升级前检查脚本
echo "=== Kubernetes v1.36 升级前检查 ==="
# 检查 gitRepo 卷使用
echo "[1/5] 检查 gitRepo 卷使用情况..."
kubectl get pods --all-namespaces -o jsonpath='{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 -o jsonpath='{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 -l app.kubernetes.io/name=ingress-nginx
# 检查 SELinux 状态
echo "[4/5] 检查节点 SELinux 状态..."
kubectl get nodes -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.nodeInfo.operatingSystem}{"\n"}{end}'
# 检查当前版本
echo "[5/5] 当前 Kubernetes 版本..."
kubectl version --short
echo "=== 检查完成 ==="

图 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 的迁移路线图
版权声明:本文内容为原创,基于公开资料独立撰写。文中示例代码可自由使用于学习和个人项目。转载或引用请注明出处。