Kubernetesauthentication问题拉ECR图像

Kubernetes的文档说支持使用AWS ECR,但它不适合我。 我的节点有一个EC2实例angular色与所有正确的权限关联,但是kubectl run debug1 -i --tty --restart=Never --image=672129611065.dkr.ecr.us-west-2.amazonaws.com/debug:v2 failed to "StartContainer" for "debug1" with ErrImagePull: "Authentication is required."导致failed to "StartContainer" for "debug1" with ErrImagePull: "Authentication is required."

细节

这些实例都具有相关的angular色,并且该angular色具有此策略:

 { "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": [ "ecr:GetAuthorizationToken", "ecr:BatchCheckLayerAvailability", "ecr:GetDownloadUrlForLayer", "ecr:GetRepositoryPolicy", "ecr:DescribeRepositories", "ecr:ListImages", "ecr:BatchGetImage" ], "Resource": "*" }] } 

而kubelet日志看起来像:

 Apr 18 19:02:12 ip-10-0-170-46 kubelet[948]: I0418 19:02:12.004611 948 provider.go:91] Refreshing cache for provider: *credentialprovider.defaultDockerConfigProvider Apr 18 19:02:12 ip-10-0-170-46 kubelet[948]: E0418 19:02:12.112142 948 pod_workers.go:138] Error syncing pod b21c2ba6-0593-11e6-9ec1-065c82331f7b, skipping: failed to "StartContainer" for "debug1" with ErrImagePull: "Authentication is required." Apr 18 19:02:27 ip-10-0-170-46 kubelet[948]: E0418 19:02:27.006329 948 pod_workers.go:138] Error syncing pod b21c2ba6-0593-11e6-9ec1-065c82331f7b, skipping: failed to "StartContainer" for "debug1" with ImagePullBackOff: "Back-off pulling image \"672129611065.dkr.ecr.us-west-2.amazonaws.com/debug:v2\"" 

从这些日志中,我怀疑以下三件事之一:

  • 您尚未通过--cloud-provider=aws arg。
  • kubelet启动时,没有正确的IAM权限。 如果是这样的话,kubelet守护进程的一个简单的反弹应该为你工作。
  • 你在k8s版本<1.2。 虽然,这个似乎不太可能,给出你的问题的date。

通常,如果您更改InstanceProfile上的权限,它们将立即生效。 但是,对于需要权限已经设置的Kubelet,必须有某种设置阶段。 我完全反弹了我的CloudFormation堆栈,以便使用新的权限启动,并做了伎俩。 我现在可以使用ECR图像,没有问题。

我想你也需要为ecr图像configuration图像拉锁。 您可以参阅下面的链接了解详情。

http://kubernetes.io/docs/user-guide/images/#specifying-imagepullsecrets-on-a-pod

http://docs.aws.amazon.com/AmazonECR/latest/userguide/ECR_GetStarted.html

https://github.com/kubernetes/kubernetes/issues/499

1)检索你可以用来validation你的Docker客户端到你的registry的docker login命令:

aws ecr get-login –region us-east-1

2)运行上一步返回的docker login命令。

3)Dockerlogin密码保存/root/.dockercfg

4)编码dockerconfiguration文件

  echo $(cat /root/.dockercfg) | base64 -w 0 

5)将结果复制并粘贴到基于旧格式的秘密YAML中:

  apiVersion: v1 kind: Secret metadata: name: aws-key type: kubernetes.io/dockercfg data: .dockercfg: <YOUR_BASE64_JSON_HERE> 

6)使用这个aws-key秘密访问图像

  apiVersion: v1 kind: Pod metadata: name: foo namespace: awesomeapps spec: containers: - name: foo image: janedoe/awesomeapp:v1 imagePullSecrets: - name: aws-key