【问题标题】:Pull image from ECR to Kubernetes deployment file从 ECR 拉取镜像到 Kubernetes 部署文件
【发布时间】:2021-01-20 18:07:33
【问题描述】:

我在从 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 小时内有效,我每次都必须手动更改密码。这很忙,我读了一篇 Medium article

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

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

【问题讨论】:

    标签: amazon-web-services docker kubernetes rancher amazon-ecr


    【解决方案1】:

    我遇到了同样的问题,我在 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
    

    【讨论】:

    • 在创建时使用空运行,然后将其传送到 kubectl apply 可能是更简单的方法来解决问题,如果秘密已经存在......
    • 或者删除后重新创建:kubectl delete secret --ignore-not-found $SECRET_NAME
    【解决方案2】:

    这是真的,通常的方法是每次您希望登录 ECR 时都获取密码。这是 AWS 文档中的 sn-p,它说

    生成的令牌有效期为 12 小时,这意味着开发人员 运行和管理容器镜像必须每 12 次重新验证一次 小时手动,或编写脚本以生成新令牌,可以是 在 CI/CD 环境中有些麻烦。例如,如果您是 使用 Jenkins 构建和推送 docker 镜像到 ECR,你必须设置 每次使用 get-login 到 ECR 重新验证 Jenkins 实例 12 小时。

    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 每

    【讨论】:

    • 其实我不擅长脚本,请问有什么我可以作为 cron 工作的参考吗?或者还有其他选择吗
    • 检查this link
    • 还有这两篇文章。 firstsecond
    • 我已经在这里的问题中引用了这篇文章,我有一个问题,如果我单独拉取图像,它会在我启动 yaml 文件时使用它。
    • 文章只是拉取图像,我已经尝试过,但是当我启动我的 YAML 文件时提到图像被拉取,它失败了
    【解决方案3】:

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

    【讨论】:

    • 它不起作用我试过这样做,图像没有被拉出。你有什么可以参考的,我也有一个问题,我在牧场主里运行这个是不是不同
    猜你喜欢
    • 2018-06-24
    • 2019-11-26
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    • 2023-02-03
    • 2018-11-16
    • 1970-01-01
    • 2016-11-17
    相关资源
    最近更新 更多