运维

运维相关知识和内容

Kubernetes 1.32 新特性深度解读:原地升级与动态资源分配实战

Kubernetes 1.32 新特性深度解读:原地升级与动态资源分配实战

# Kubernetes 1.32 新特性深度解读:原地升级与动态资源分配实战

## 摘要

Kubernetes 1.32带来了多项重量级特性:InPlacePodVerticalScaling正式GA允许原地调整CPU/内存、DRA动态资源分配进入Beta支持GPU/FPGA等异构资源、SidecarContainers增强容器生命周期管理。

## 一、InPlacePodVerticalScaling(原地垂直伸缩)

### 1.1 背景与价值

在1.32之前,调整Pod的CPU/内存资源限制需要**删除并重建Pod**。对于有状态应用(数据库、消息队列),这意味着:

- 服务中断

- 数据迁移风险

- 重新调度可能找不到合适节点

InPlacePodVerticalScaling允许**在不重启Pod的情况下调整资源**。

### 1.2 工作原理

```

原有Pod: CPU=2, Memory=4Gi

│ kubectl patch pod

调整请求: CPU=4, Memory=8Gi

├─ 节点资源充足 → CGroup原地调整 → 完成

└─ 节点资源不足 → Pod标记ResizePending → 等待/驱逐

```

### 1.3 实战:原地调整Pod资源

```yaml

# pod-with-resize.yaml

apiVersion: v1

kind: Pod

metadata:

name: web-app

spec:

containers:

- name: app

image: nginx:1.25

resources:

requests:

cpu: "2"

memory: "4Gi"

limits:

cpu: "4"

memory: "8Gi"

# 必须声明允许原地调整

resizePolicy:

- resourceName: cpu

restartPolicy: NotRequired # CPU调整不重启

- resourceName: memory

restartPolicy: RestartContainer # 内存调整需重启容器

```

```bash

# 原地调整资源

kubectl patch pod web-app --type=json -p='[

{"op":"replace", "path":"/spec/containers/0/resources/requests/cpu", "value":"4"},

{"op":"replace", "path":"/spec/containers/0/resources/requests/memory", "value":"8Gi"},

{"op":"replace", "path":"/spec/containers/0/resources/limits/cpu", "value":"8"},

{"op":"replace", "path":"/spec/containers/0/resources/limits/memory", "value":"16Gi"}

]'

# 查看调整状态

kubectl get pod web-app -o jsonpath='{.status.resize}'

# 输出: InProgress 或 Proposed 或 Infeasible

```

### 1.4 注意事项

- **QoS类不变**:Guaranteed的Pod调整后仍为Guaranteed

- **内存调整可能触发容器重启**:由resizePolicy.restartPolicy决定

- **不支持资源减少**:当前仅支持增大资源

- **节点必须启用InPlacePodVerticalScaling特性门控**(1.32默认开启)

## 二、DRA动态资源分配(Dynamic Resource Allocation)

### 2.1 传统设备插件的局限

传统Device Plugin机制存在多个问题:

- 无法表达设备之间的拓扑关系(如GPU NVLink互连)

- 不支持设备分数/优先级

- 无法处理设备声明中的复杂约束

### 2.2 DRA核心概念

```

Pod → ResourceClaim(声明需要什么资源)

ResourceClass(由DRA Driver处理)

DRA Driver(与设备厂商驱动交互)

分配具体设备 → Pod使用

```

### 2.3 实战:DRA分配GPU

```yaml

# ResourceClass定义

apiVersion: resource.k8s.io/v1beta1

kind: ResourceClass

name: gpu.nvidia.com

driverName: gpu.dra.nvidia.com

---

# Pod使用DRA请求GPU

apiVersion: v1

kind: Pod

metadata:

name: gpu-training

spec:

containers:

- name: trainer

image: pytorch/pytorch:2.4

command: ["python", "train.py"]

resources:

claims:

- name: gpu-claim

resourceClaims:

- name: gpu-claim

resourceClaimTemplateName: gpu-template

---

# ResourceClaimTemplate

apiVersion: resource.k8s.io/v1beta1

kind: ResourceClaimTemplate

metadata:

name: gpu-template

spec:

spec:

resourceClassName: gpu.nvidia.com

parametersRef:

apiVersion: gpu.dra.nvidia.com/v1beta1

kind: GpuClaimParameters

name: gpu-params

---

# GPU厂商提供的参数CRD

apiVersion: gpu.dra.nvidia.com/v1beta1

kind: GpuClaimParameters

metadata:

name: gpu-params

spec:

count: 2 # 需要2块GPU

type: "H100" # GPU型号

nvlinkRequired: true # 需要NVLink互连

migEnabled: false # 不使用MIG

```

### 2.4 DRA vs Device Plugin对比

| 维度 | Device Plugin | DRA |

|------|--------------|-----|

| 设备拓扑 | 不支持 | 原生支持 |

| 复杂约束 | 仅数量 | 任意参数化 |

| 设备共享 | 需要额外方案 | 原生支持 |

| 热插拔 | 有限 | 更好支持 |

| 成熟度 | GA | Beta(1.32) |

## 三、SidecarContainers增强

### 3.1 原生Sidecar支持

```yaml

apiVersion: v1

kind: Pod

metadata:

name: app-with-sidecar

spec:

initContainers:

- name: log-sidecar

image: fluent/fluent-bit:3.0

restartPolicy: Always # 关键:标记为Sidecar

volumeMounts:

- name: logs

mountPath: /var/log/app

containers:

- name: app

image: myapp:latest

volumeMounts:

- name: logs

mountPath: /var/log/app

volumes:

- name: logs

emptyDir: {}

```

**Sidecar与普通initContainer的区别**:

- `restartPolicy: Always` 的initContainer就是Sidecar

- Sidecar不会阻塞主容器启动

- Sidecar崩溃会自动重启

- Pod终止时,Sidecar在主容器之后停止

## 四、其他重要特性

### 4.1 PodReadyToStartContainers条件

新增Pod条件,区分"网络就绪"和"应用就绪":

```bash

kubectl get pod myapp -o jsonpath='{.status.conditions[?(@.type=="ReadyToStartContainers")].status}'

# True表示网络和存储已就绪,容器可以启动

```

### 4.2 Kubelet Credential Provider增强

支持从外部获取容器镜像拉取凭证,无需在kubelet配置中硬编码:

```yaml

apiVersion: kubelet.config.k8s.io/v1

kind: KubeletConfiguration

imageCredentialProviderConfig:

matchImages:

- "*.registry.example.com"

provider: registry-credential-provider

defaultMode: "aws-ecr"

```

## 五、升级注意事项

### 5.1 升级前检查

```bash

# 检查API废弃

kubectl get --raw /metrics | grep deprecated

# 检查自定义资源兼容性

kubectl api-resources | grep -i dra

# 备份etcd

ETCDCTL_API=3 etcdctl snapshot save /backup/etcd-snapshot.db

```

### 5.2 升级步骤

```bash

# 1. 升级kubeadm

sudo apt-mark unhold kubeadm

sudo apt install -y kubeadm=1.32.0-*

sudo apt-mark hold kubeadm

# 2. 验证升级计划

sudo kubeadm upgrade plan

# 3. 执行升级

sudo kubeadm upgrade apply v1.32.0

# 4. 升级kubelet和kubectl

sudo apt-mark unhold kubelet kubectl

sudo apt install -y kubelet=1.32.0-* kubectl=1.32.0-*

sudo apt-mark hold kubelet kubectl

# 5. 重启kubelet

sudo systemctl restart kubelet

```

## 总结

Kubernetes 1.32的三项核心特性——原地垂直伸缩、DRA动态资源分配、Sidecar容器——分别解决了资源调整、异构设备管理和辅助容器编排的长期痛点。生产环境升级前务必充分测试,特别是DRA相关功能尚在Beta阶段。

---

*本文由北科信息日采集系统自动生成,发布日期:2026-05-05*