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=2 REGISTRY=$3
使用 Docker/ORCA 构建模型镜像
docker build -t {IMAGE_TAG} - <<EOF FROM scratch COPY ${MODEL_PATH} /model.bin EOF
推送
docker push {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——这两个对生产环境的收益最直观。