【发布时间】:2018-08-27 13:53:44
【问题描述】:
背景:
我正在使用 Drone 测试应用程序。 Drone 部署到 Kubernetes,附带一个 docker (dind / docker-in-docker) 容器。
测试完成后,我再次使用无人机构建并推送几个约 40mb 的 docker 镜像到 us.gcr.io
当 Drone 创建 docker 容器来测试我的应用程序和单独的容器来构建我的应用程序和图像时,它会创建一个 docker 网络来链接容器以构建服务,例如临时测试数据库(CI 管道中的相当标准)。
但是,Kubernetes pod 网络和 Docker-in-Docker 的组合在尝试推送到 gcr 时会导致以下结果:
time="2018-03-19T03:31:12.037507241Z" level=error msg="Upload failed, retrying: net/http: HTTP/1.x transport connection broken: write tcp w.x.y.z:39662->z.y.x.w:443: write: broken pipe"
time="2018-03-19T03:31:17.208009069Z" level=error msg="Upload failed, retrying: net/http: HTTP/1.x transport connection broken: write tcp w.x.y.z:39662->z.y.x.w:443: write: broken pipe"
time="2018-03-19T03:31:17.216232506Z" level=error msg="Upload failed, retrying: net/http: HTTP/1.x transport connection broken: write tcp w.x.y.z:39662->z.y.x.w:443: write: broken pipe"
time="2018-03-19T03:31:17.407608372Z" level=error msg="Upload failed, retrying: net/http: HTTP/1.x transport connection broken: write tcp w.x.y.z:39662->z.y.x.w:443: write: broken pipe"
time="2018-03-19T03:31:17.410403394Z" level=error msg="Upload failed, retrying: net/http: HTTP/1.x transport connection broken: write tcp w.x.y.z:39662->z.y.x.w:443: write: broken pipe"
time="2018-03-19T03:31:23.432621075Z" level=error msg="Upload failed, retrying: unexpected EOF"
但是,当推送到(我假设是)较旧的注册表版本时,它可以完美运行。
在没有启用 docker 容器网络的情况下推送到 gcr 时,它也可以正常工作。
这是正在运行的 docker 命令。很明显,敏感数据已经被省略了。
docker network create test-network && \
docker run --network=test-network -d cockroachdb/cockroach:v1.1.2 -c /cockroach sql --insecure && \
docker run --rm -it -e GKE_CLUSTER_NAME=my-cluster-1 -e GKE_CLUSTER_ZONE=us-east1-b -e GCP_PROJECT=my-gcp-project -e DOCKER_USE_GCP=true -v /var/run/docker.sock:/var/run/docker.sock --network=test-network us.gcr.io/my-project/runner /bin/sh -c 'mkdir -p src/git.example.com/project && git clone https://user:pass!@git.example.com/project/project $GOPATH/src/git.example.com/project/project && cd $GOPATH/src/git.example.com/project/project && git checkout gcr && jules -stage deploy_docker'
jules -stage deploy_docker 命令在 8 个不同的目录上同时运行 go build、docker build 和 gcloud docker -- push...。
所以,总结:
Kubernetes pod + docker-in-docker + gcloud docker push 导致连接持续中断。
我可以用 docker daemon 或 kubernetes 网络设置做些什么来缓解这种情况吗?至少我想了解为什么会这样。
谢谢!
更新:
这甚至不需要 Kubernetes 发生!
我刚刚在运行 Ubuntu 的新 GCE 实例上进行了尝试,它也在那里发生。
【问题讨论】:
-
您的 Kubernetes 集群是否在 Google Cloud 中运行,即它是 Kubernetes Engines 集群吗?
-
是的。我联系了支持,得知docker容器中使用的gcloud账号实际上是默认分配给GCE实例的服务账号,没有GCR存储桶的写权限
-
非常有趣...查看 google/cloud-sdk Dockerfile 并将其部署到 GCE 实例后,您可以看到 Dockerfile 本身中没有“gcloud init”命令,但是如果您输入它并做一个“gcloud auth list”,你可以看到它自动继承了GCE实例的服务帐户。非常感谢分享!你能回答你自己的问题吗?
标签: docker kubernetes docker-registry google-container-registry docker-in-docker