OKD中修改项目YAML的SCC相关注解报错字段不可变如何解决
OKD/OpenShift SCC注解不可变报错处理方案
报错原因
openshift.io/sa.scc.supplemental-groups、openshift.io/sa.scc.uid-range是OKD/OpenShift为命名空间自动分配的安全上下文约束注解,设计上为创建后不可变字段,直接编辑现有命名空间的对应配置会触发校验报错。
解决方案
方案1:删除重建命名空间(生产环境优先选择)
适用于项目内还未部署业务负载、可接受重建的场景:
- 删除原有项目
oc delete project <你的项目名称>
- 新建项目并立刻注入自定义注解
# 创建命名空间 oc create namespace <你的项目名称> # 写入自定义SCC配置 oc annotate namespace <你的项目名称> \ openshift.io/sa.scc.supplemental-groups="1000/10000" \ openshift.io/sa.scc.uid-range="1000/10000" --overwrite
如果需要所有后续新建项目都默认使用该配置,可修改全局项目请求模板:
- 导出当前模板
oc get template project-request -n openshift-config -o yaml > project-template.yaml
- 在模板的
metadata.annotations字段中添加上述两个SCC注解配置后重新应用
oc apply -f project-template.yaml -n openshift-config
方案2:强制修改现有命名空间配置(仅测试环境使用)
如果项目已有运行负载不能重建,可通过强制替换配置的方式修改不可变字段:
- 导出当前命名空间的完整配置做备份
oc get namespace <你的项目名称> -o yaml > ns-config.yaml
- 编辑
ns-config.yaml文件:修改两个SCC注解的值为目标配置,同时删除metadata.managedFields中所有关联SCC注解的管理记录 - 强制替换命名空间配置
oc replace --force -f ns-config.yaml
- 验证配置是否生效
oc get namespace <你的项目名称> -o jsonpath='{.metadata.annotations}'
注意事项
- 强制修改不可变字段可能引发SCC权限异常、负载启动失败等问题,生产环境不建议使用
- 配置修改完成后,需要重启项目内所有运行的Pod,新的安全上下文配置才会生效
内容的提问来源于stack exchange,提问作者Igor Messi
相关产品推荐
相关产品推荐

