Kubernetes v1.36生产级升级指南:三个GA特性实战点评

5 阅读1分钟

v1.36刚GA没多久,我就在测试环境跑了一周,把几个新GA特性摸了个遍。以下是我的实战感受,不废话,直接上干货。

实战一:Pod User Namespaces怎么配

先说结论:这个特性配起来确实简单,但有些坑你得知道。

基础配置:

yaml apiVersion: v1 kind: Pod metadata: name: secure-app spec: securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault hostUsers: false # 关键配置 containers:

  • name: app image: nginx:latest securityContext: allowPrivilegeEscalation: false readOnlyRootFilesystem: true

验证方法:

bash

进入容器查看

kubectl exec -it secure-app -- sh

在容器内执行

id

应该看到 UID 0 (root)

在宿主机上用 nsenter 查看

nsenter -t $(pgrep -f nginx) -m -u bash -i id

应该看到普通 UID,不是 root

踩坑记录:

hostUsers: false 需要所有容器都设置,如果Pod里有init容器也得设置 和某些HostPath卷有兼容性问题,使用前测试 Seccomp Profile建议配合RuntimeDefault使用,单独用User Namespaces效果打折扣

实战二:MutatingAdmissionPolicy配置

Webhook替代方案,配置比想象中灵活。

场景:自动注入默认资源限制

yaml apiVersion: admissionregistration.k8s.io/v1 kind: MutatingAdmissionPolicy metadata: name: inject-default-resources spec: matchConstraints: resourceRules: - apiGroups: [""] apiVersions: ["v1"] operations: ["CREATE", "UPDATE"] resources: ["pods"] scope: "Namespaced" matchConditions: # 条件过滤

  • name: exclude-system expression: "object.metadata.namespace.startsWith('kube-') || object.metadata.namespace.startsWith('istio-')" reason: Excluded mutatingActions:
    • action: mutate patchTemplate: | [ { "op": "test", "path": "/spec/containers/0/resources" }, { "op": "replace", "path": "/spec/containers/0/resources", "value": {"limits": {"cpu": "100m", "memory": "128Mi"}} } ]

apiVersion: admissionregistration.k8s.io/v1 kind: MutatingAdmissionPolicyBinding metadata: name: bind-inject-default-resources spec: policyName: inject-default-resources validationActions: [Deny] matchResources: - namespaceSelector: matchExpressions: - key: policy.inject operator: In values: ["true"]

注意:

validationActions: [Deny]很重要,建议加上,防止误配导致问题 matchConditions是Beta功能,生产环境慎用 目前只支持JSON Patch,复杂的业务逻辑还得靠Webhook

实战三:OCI VolumeSource在AI场景的应用

这个特性我认为对AI/ML场景影响最大。

场景:模型权重分发

yaml apiVersion: v1 kind: Pod metadata: name: inference-server spec: containers:

  • name: server image: my-inference:v1 volumeMounts:
    • name: model mountPath: /app/model volumes:
  • name: model image: reference: my-registry/model-weights:v1.0.0 pullSecret: reg-secret # 如果是私有仓库

推送模型镜像脚本:

bash #!/bin/bash MODEL_PATH=1IMAGETAG=1 IMAGE_TAG=2 REGISTRY=$3

使用 Docker/ORCA 构建模型镜像

docker build -t REGISTRY/modelweights:{REGISTRY}/model-weights:{IMAGE_TAG} - <<EOF FROM scratch COPY ${MODEL_PATH} /model.bin EOF

推送

docker push REGISTRY/modelweights:{REGISTRY}/model-weights:{IMAGE_TAG}

对比几种主流方案:

表格 方案 镜像大小 拉取速度 版本管理 权限控制 打入应用镜像 5-10GB 慢 困难 独立 init容器拉取 不影响 取决于网络 脚本管理 手动 ConfigMap <1MB 快 不支持 K8s原生 OCI VolumeSource 按需 享缓存 镜像版本 仓库原生

升级注意事项

兼容性检查:

bash

检查是否有废弃API使用

kubectl get po -A -o yaml | grep -E "apiVersion:|kind:" | sort | uniq -c | sort -rn | head -20

检查Kubelet版本

kubectl get nodes -o wide

建议升级顺序:master组件 → node组件 → 插件

回滚方案:

bash

备份当前配置

kubectl get all,configmap,secret -A -o yaml > backup-$(date +%Y%m%d).yaml

保留旧版本etcd快照

etcdctl snapshot save backup.db

监控指标关注:

apiserver_request_duration_seconds - API响应延迟 scheduler_pod_scheduling_duration_seconds - 调度延迟 kubeletPLEGRelistDuration_seconds - PLEG事件处理时间

我的结论

v1.36的三个GA特性都是"实用派"——不是炫技,是解决实际问题。

Pod User Namespaces让多租户安全配置从"专业活"变成"常规操作";MutatingAdmissionPolicy让Webhook从"必要之恶"变成"可选方案";OCI VolumeSource让模型分发从"自建方案"变成"开箱即用"。

建议有能力的团队这个季度内升级测试,Q3前推到生产。能力有限的话,优先评估Pod User Namespaces和OCI VolumeSource——这两个对生产环境的收益最直观。