从 ECR 拉取镜像到 Kubernetes 部署文件

Pull image from ECR to Kubernetes deployment file

我在从 AWS ECR 存储库中提取 docker 图像时遇到问题,之前我使用过

kubectl create secret docker-registry regcred --docker-server=https://index.docker.io/v1/ --docker-username=kammana --docker-password=<your-password> --docker-email=hari.kammana@gmail.com

部署 YAML 文件

apiVersion: v1
kind: Pod
metadata:
  name: private-reg
spec:
  containers:
  - name: privateapp
    image: kammana/privateapp:0.0.1
  imagePullSecrets:
  - name: regcred

但现在生成ECR时密码的有效期只有12小时,我每次都得手动改密码。这很忙,我读了一篇中等文章 article

它可以创建某种 cron 作业,但我想通过登录 ECR 在运行时拉取图像。

如果您能提供一些关于通过 Kubernetes 直接登录 ECR 的相关示例,并且我的集群不在同一个 AWS 帐户中,因此 AWS IAM 角色不存在问题,这将很有帮助。

有一个名为 k8s-ecr-login-renew 的小工具可以满足您的需求。

这是真的,通常的方法是每次登录 ECR 时获取密码。这是来自 AWS 文档的片段

The generated token is valid for 12 hours, which means developers running and managing container images have to re-authenticate every 12 hours manually, or script it to generate a new token, which can be somewhat cumbersome in a CI/CD environment. For example if you’re using Jenkins to build and push docker images to ECR, you have to set up Jenkins instances to re-authenticate using get-login to ECR every 12 hours.

link to the full AWS documentation

下面是获取密码和登录的命令。

aws ecr get-login-password --region <<someregion>> | docker login --username <<someusername>> --password-stdin https://<<someaccount>>.amazonaws.com

在您的情况下,您必须在帮助程序 pod 中编写一些脚本来执行以下步骤。

  1. 获取登录密码并保存在变量中
aws ecr get-login-password --region <<someregion>> 
  1. 删除您现有的秘密
kubectl delete secret <<secretname>> 
  1. 用新密码重新创建秘密。
kubectl create secret docker-registry regcred --docker-server=https://index.docker.io/v1/ --docker-username=kammana --docker-password=<newpassword> --docker-email=hari.kammana@gmail.com

您可以尝试使用 cronjob 每 <12 小时重置一次

我有同样的问题,我在 cron 中使用它:

# KUBECTL='kubectl --dry-run=client'
KUBECTL='kubectl'

ENVIRONMENT=sandbox # yes, typo
AWS_DEFAULT_REGION=moon-west-1

EXISTS=$($KUBECTL get secret "$ENVIRONMENT-aws-ecr-$AWS_DEFAULT_REGION" | tail -n 1 | cut -d ' ' -f 1)
if [ "$EXISTS" = "$ENVIRONMENT-aws-ecr-$AWS_DEFAULT_REGION" ]; then
  echo "Secret exists, deleting"
  $KUBECTL delete secrets "$ENVIRONMENT-aws-ecr-$AWS_DEFAULT_REGION"
fi

PASS=$(aws ecr get-login-password --region $AWS_DEFAULT_REGION)
$KUBECTL create secret docker-registry $ENVIRONMENT-aws-ecr-$AWS_DEFAULT_REGION \
    --docker-server=$AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com \
    --docker-username=AWS \
    --docker-password=$PASS \
    --docker-email=infra@setu.co --namespace collect