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

  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 的配置示例:

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 升级步骤

  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 的迁移路线图

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

相关推荐
张3238 小时前
K8s控制器学习难点
云原生·容器·kubernetes
小猿姐9 小时前
实测对比:哪款开源 Kubernetes MySQL Operator 最值得用?(2026 深度评测)
数据库·mysql·云原生
么卡16 小时前
我在 Debian 11 上把 K8s 单机搭起来了,过程没你想的那么顺(/opt 目录版)
kubernetes
AI攻城狮17 小时前
Adaptive Thinking 的代价:当 AI 自己决定"想多少"
人工智能·云原生·aigc
Dontla18 小时前
Kubernetes Liveness Probe存活探针 / Readiness Probe就绪探针介绍(Startup Probe启动探针)重启容器
云原生·容器·kubernetes
AI攻城狮18 小时前
Vibe Coding 时代:为什么你不应该盲目启用 AI 编码插件
人工智能·云原生·aigc
Gofarlic_OMS20 小时前
Windchill的license合规使用报告自动化生成与审计追踪系统
大数据·运维·人工智能·云原生·自动化·云计算
cyber_两只龙宝20 小时前
【Oracle】Oracle之DQL中WHERE限制条件查询
linux·运维·数据库·云原生·oracle
lvyuanj1 天前
zookeeper_cluster
分布式·zookeeper·云原生