如何解决如何为依赖 Amazon ECR 图像的 kubernetes 服务制作部署文件?
一位同事为我创建了一个 K8s 集群。我可以毫无问题地在该集群中运行服务。但是,我无法运行依赖于来自 Amazon ECR 的图像的服务,我真的不明白。可能是我在部署文件中犯了一个小错误,从而导致了这个问题。
这是我的部署文件:
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-deployment
labels:
app: hello
spec:
replicas: 3
selector:
matchLabels:
app: hello
template:
metadata:
labels:
app: hello
spec:
containers:
- name: hello
image: xxxxxxxxx.yyy.ecr.eu-zzzzz.amazonaws.com/test:latest
ports:
- containerPort: 5000
这是我的服务文件:
apiVersion: v1
kind: Service
metadata:
name: hello-svc
labels:
app: hello
spec:
type: NodePort
ports:
- port: 5000
nodePort: 30002
protocol: TCP
selector:
app: hello
在主节点上,我运行了这个以确保 kubernetes 了解部署和服务。
kubectl create -f dep.yml
kubectl create -f service.yml
我使用 K8s extension in vscode 来检查我的 Pod 的日志。
这是我得到的错误:
来自服务器的错误 (BadRequest):pod 中的容器“hello” “hello-deployment-xxxx-49pbs”正在等待开始:尝试和失败 拉取图像。
显然,拉动是一个问题..... 使用来自公共 docker hub 的公共图像时不会发生这种情况。从逻辑上讲,这将是一个权利问题。但看起来不是。在主节点上运行此命令时没有收到错误消息:
docker pull xxxxxxxxx.yyy.ecr.eu-zzzzz.amazonaws.com/test:latest
此命令只是拉取我的图像。
我现在很困惑。我可以在主节点上使用 docker pull
拉我的图像。但是 K8s 无法执行拉取操作。我的部署文件中是否缺少某些内容?一些属性说:“repositoryIsPrivateButDoNotComplain”?我就是不明白。
如何解决这个问题,以便 K8s 可以轻松使用我从 Amazon ECR 获取的图像?
解决方法
您应该为 ECR 授权创建和使用机密。
这是你需要做的。
- 为 Kubernetes 集群创建一个密钥,从您可以访问托管 ECR 注册表的 AWS 账户的机器上执行下面给出的 shell 脚本。请根据您的设置更改占位符。请确保您执行此 shell 脚本的机器应该安装了 aws cli 并配置了 aws 凭证。如果您使用的是 Windows 机器,请在 Cygwin 或 git bash 控制台中执行此脚本。
#!/bin/bash
ACCOUNT=<AWS_ACCOUNT_ID>
REGION=<REGION>
SECRET_NAME=<SECRETE_NAME>
EMAIL=<SOME_DUMMY_EMAIL>
TOKEN=`/usr/local/bin/aws ecr --region=$REGION --profile <AWS_PROFILE> get-authorization-token --output text --query authorizationData[].authorizationToken | base64 -d | cut -d: -f2`
kubectl delete secret --ignore-not-found $SECRET_NAME
kubectl create secret docker-registry $SECRET_NAME \
--docker-server=https://${ACCOUNT}.dkr.ecr.${REGION}.amazonaws.com \
--docker-username=AWS \
--docker-password="${TOKEN}" \
--docker-email="${EMAIL}"
- 更改部署并为您的 pod 将在从 ECR 下载映像时使用的 secrete 添加一个部分。
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-deployment
labels:
app: hello
spec:
replicas: 3
selector:
matchLabels:
app: hello
template:
metadata:
labels:
app: hello
spec:
containers:
- name: hello
image: xxxxxxxxx.yyy.ecr.eu-zzzzz.amazonaws.com/test:latest
ports:
- containerPort: 5000
imagePullSecrets:
- name: SECRET_NAME
-
创建 Pod 和服务。
-
如果成功,那么秘密仍然会在 12 小时后过期,以克服设置 crone(用于定期在 Kubernetes 集群上重新创建秘密。对于设置 crone,使用上面给出的相同脚本。
有关它在引擎盖下如何发生的完整图片,请参阅下图。
问候 阿米特·米纳
,对于 12 小时问题,如果您使用的是 Kubernetes 1.20,请配置并使用 Kubelet 图像凭证提供程序
https://kubernetes.io/docs/tasks/kubelet-credential-provider/kubelet-credential-provider/
您需要在您的 kubelet 中启用 alpha 功能门 KubeletCredentialProviders
如果使用较低的 Kubernetes 版本并且此功能不可用,则使用 https://medium.com/@damitj07/how-to-configure-and-use-aws-ecr-with-kubernetes-rancher2-0-6144c626d42c
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。