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图像。