Kubernetes在提取ECR映像时出现身份验证问题



Kubernetes文档表示支持使用AWS ECR,但对我来说不起作用。我的节点有一个EC2实例角色,与所有正确的权限关联,但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."

详细信息

所有实例都有一个关联的角色,并且该角色附加了以下策略:

{
    "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""

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

  • 您尚未通过kubelet上的--cloud-provider=aws参数
  • 当您的kubelet启动时,没有正确的IAM权限。如果是这种情况,那么kubelet守护进程的简单反弹应该对您有效
  • 您使用的是k8s版本<1.2.不过,考虑到你提问的日期,这似乎不太可能

我认为您还需要为ecr图像配置图像提取机密。有关详细信息,您可以参考以下链接。

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) 检索docker登录命令,您可以使用该命令向注册表验证docker客户端:

aws-ecr登录--区域us-east-1

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

3) Docker登录密码已保存/root/.dockercfg

4) 编码docker配置文件

    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密钥秘密访问图像

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

通常,如果更改InstanceProfile的权限,它们会立即生效。然而,Kubelet必须有某种设置阶段,需要已经设置权限。我完全弹开了我的CloudFormation堆栈,以便在新权限处于活动状态的情况下启动,这就成功了。我现在可以毫无问题地使用ECR图像。

最新更新