OpenShift路由器自定义模板启动Pod报错:权限拒绝求助
解决OpenShift 3.2路由器自定义模板启动Pod崩溃的权限问题
你遇到的这个模板化过程中「Permission denied」的问题,我之前帮不少人排查过,核心原因就是自定义模板文件的权限/所属用户和路由器Pod的运行账户不匹配。OpenShift路由器默认用非root受限用户运行,如果你上传的自定义模板还是root权限或者权限太严格,容器里的进程根本读不了,自然就崩溃了。下面给你一步步的解决办法:
1. 检查当前ConfigMap的模板权限
先把你之前创建的自定义模板ConfigMap导到本地看看:
oc get configmap router-custom-template -o yaml > router-template.yaml
打开这个YAML文件,留意data字段下的模板内容对应的权限(如果是通过本地文件创建的ConfigMap,默认会带注释记录原文件权限)。如果权限是0600或者属于root用户,那肯定会出问题。
2. 修正模板文件权限并重新创建ConfigMap
如果你是从本地文件生成的ConfigMap,先修改本地模板文件的权限:
# 设置成普通用户可读取的权限 chmod 644 your-haproxy-template.file # 可选:如果你的环境有uid限制,把文件所属用户改成OpenShift受限用户范围(比如uid 100000+) chown 100000:100000 your-haproxy-template.file
然后重新创建ConfigMap覆盖原来的:
oc replace -f router-template.yaml # 或者直接重新创建 oc create configmap router-custom-template --from-file=haproxy-config.template=your-haproxy-template.file --dry-run=client -o yaml | oc replace -f -
3. 触发路由器Pod滚动更新
删除旧的路由器Pod,让DeploymentConfig重新拉取正确权限的模板:
oc delete pod -l router=router
或者用滚动更新命令更优雅:
oc rollout latest dc/router
额外注意点
如果是直接在ConfigMap的data字段里手动编写模板内容,不用管本地文件权限,但要确保ConfigMap挂载到容器里的文件权限是644(这是OpenShift挂载ConfigMap的默认权限,一般没问题)。另外,别在模板里引用容器里没有权限访问的其他文件路径,也会导致类似的权限错误。
内容的提问来源于stack exchange,提问作者Lars Borup Jensen
相关产品推荐
相关产品推荐

