OpenStack Swift容器在Intranet的Concourse任务中遇HTTP 401权限问题
问题场景
我使用jeantil/openstack-swift-keystone-docker容器开展Swift集成测试,执行步骤参考对应GitHub仓库。该配置在本地及公网Concourse流水线任务中运行正常,但在内网环境的Concourse流水线任务中,执行openstack endpoint create或openstack user list等命令时,出现以下错误:
Failed to discover available identity versions when contacting http://127.0.0.1:35357/v3. Attempting to parse version from URL. Unauthorized(HTTP 401)
怀疑问题与代理配置有关。
可能原因分析
- 全局代理拦截本地请求:内网Concourse可能配置了全局代理,
openstack客户端访问127.0.0.1:35357时被代理转发,而非直接访问容器内的Keystone服务,导致认证失败。 - Keystone绑定地址限制:容器内的Keystone服务仅绑定
127.0.0.1,Concourse任务所在网络无法直接访问,请求无法正确到达服务端。 - 代理环境变量干扰认证:Concourse任务中的
HTTP_PROXY/HTTPS_PROXY等环境变量被openstack客户端继承,导致本地请求走代理,破坏认证流程。
解决步骤
1. 排除本地地址的代理转发
在Concourse任务的执行脚本中,添加代理排除规则或清空代理变量:
# 排除内网、本地地址走代理 export NO_PROXY=127.0.0.1,localhost,10.0.0.0/8,192.168.0.0/16 # 若无需访问外部服务,可直接清空代理变量 unset HTTP_PROXY HTTPS_PROXY http_proxy https_proxy
执行后再运行openstack命令验证结果。
2. 调整Keystone的绑定与访问地址
- 启动容器时,将Keystone的35357端口绑定到所有网卡,允许内网访问:
docker run -d -p 0.0.0.0:35357:35357 jeantil/openstack-swift-keystone-docker - 修改容器内
keystone.conf配置,将bind_host设置为0.0.0.0,确保服务能接收来自内网的请求。
3. 修正OpenStack客户端的认证配置
将认证URL改为容器在内网的实际可访问地址(而非127.0.0.1),比如容器的内网IP或Docker服务名称:
export OS_AUTH_URL=http://<容器内网IP>:35357/v3 export OS_USERNAME=admin export OS_PASSWORD=admin export OS_PROJECT_NAME=admin export OS_USER_DOMAIN_NAME=Default export OS_PROJECT_DOMAIN_NAME=Default
4. 验证网络连通性
在Concourse任务中添加网络测试,确认能正常访问Keystone服务:
# 测试端口连通性 nc -zv <容器地址> 35357 # 测试API响应 curl http://<容器地址>:35357/v3
若连通失败,需调整Concourse的网络策略,允许任务访问容器所在的网络段。
内容的提问来源于stack exchange,提问作者SHUBHENDU SAURAV
相关产品推荐
相关产品推荐

