【问题标题】:Pulling docker image from private github package using AWS EKS with AWS Fargate使用 AWS EKS 和 AWS Fargate 从私有 github 包中提取 docker 映像
【发布时间】:2020-06-08 08:55:44
【问题描述】:

我希望在 aws 上使用 kubernetes 部署一个 dockerized 服务。为此,我使用了最近发布的带有 AWS Fargate 功能的 AWS EKS。服务的 docker 镜像存储在 github 上的私有包中。

为了部署我的服务,我使用了一个包含密钥、部署和服务的 kubernetes 清单文件。

在 minikube 上使用 kubectl 本地部署时,部署 pod 成功从私有 github 包中拉取镜像。我成功复现了访问私有 dockerhub 注册表的过程。

然后我将 kubectl 配置为连接到我的 eks 集群。 当应用清单文件时,当从 dockerhub 拉取表单 github 包时它工作正常时,部署 pod 会出现 ImagePullBackOff 状态。清单文件的区别如下:

为 github 包生成秘密:

kubectl create secret docker-registry mySecret --dry-run=true --docker-server=https://docker.pkg.github.com --docker-username=myGithubUsername --docker-password=myGithubAccessToken -o yaml

为 dockerhub 生成秘密:

kubectl create secret docker-registry mySecret --dry-run=true --docker-server=https://index.docker.io/v1/ --docker-username=myDockerhubUsername --docker-password=myDockerhubPassword -o yaml

部署规范参考如下:

spec:
  containers:
    # when pulling from github packages 
    - image: docker.pkg.github.com/myGithubUsername/myRepo/myPackage:tag
    # when pulling from dockerhub 
    - image: myDockerhubUsername/repository:tag
    ...
  imagePullSecrets:
    - name: mySecret

尝试特别是使用 github 包我尝试使用 AWS Secrets Manager。

我创建了一个秘密“mySecret”如下:

{
  "username" : "myGithubUsername",
  "password" : "myGithubAccessToken"
}

然后我创建了一个访问此密钥的策略:

{
  "Version": "2012-10-17",
  "Statement": [
    {
        "Effect": "Allow",
        "Action": [
            "secretsmanager:GetSecretValue"
        ],
        "Resource": [
            "arn:aws:secretsmanager:eu-west-1:myAWSAccountId:secret:mySecret"
        ]
    }
  ]
}

然后,我将策略附加到我的 eks 集群的集群 IAM 角色和其 fargate 配置文件“fp-default”中引用的 Pod 执行角色。我只在默认的 kubernetes 命名空间中工作。 我的秘密和集群都在 eu-west-1 区域。

不过,我在部署时得到了 ImagePullBackOff 状态。

我很难找到将 AWS Fargate 与 AWS EKS 结合使用来解决此问题的任何方法,并且希望对此有所了解:)

编辑:对问题进行了编辑,以便更清楚地表明该问题主要与使用 github 包作为注册表提供程序有关。

【问题讨论】:

    标签: amazon-web-services docker kubernetes aws-fargate amazon-eks


    【解决方案1】:

    我认为您需要在与部署相同的命名空间中创建您的秘密。我能够通过创建一个秘密来完成这项工作

    kubectl create secret docker-registry mySecret --dry-run=true --docker-server=https://docker.pkg.github.com --docker-username=myGithubUsername --docker-password=myGithubAccessToken --namespace=my-api -o yaml
    

    在我的 deployment.yaml 中,我引用了它

        spec:
          containers:
            - name: my-api
              image: docker.pkg.github.com/doc-api:0.0.0
              ports:
              - containerPort: 5000
              resources: {}
          imagePullSecrets:
            - name: mySecret
    

    【讨论】:

    • 嗨!所有部署当前都在默认命名空间中完成,所以我的秘密和我的 pod 都在默认命名空间中。你真的设法让它与 AWS EKS 和 Fargate 一起工作还是只在本地工作?
    • 啊抱歉,我没有看到您在默认命名空间中工作。我让它在 EKS + Fargate 上工作,我能够在它创建的公共 LB 上使用我的服务。 FWIW,我昨天才开始玩 EKS/Fargate,我松散地遵循了这个指南learnaws.org/2019/12/16/running-eks-on-aws-fargate
    • 感谢这个有用的链接!我浏览了指南,但在其示例中图像被推送到 ECR。你真的从 github 包中提取了图像吗?我尝试使用docker.pkg.github.com/myPackage:tag 而不是docker.pkg.github.com/myGithubUsername/myRepo/myPackage:tag,就像您提供的代码片段一样,我认为可能是这样,但没有任何成功。
    • 我做到了 - 我实际上使用了一个不是 docker.pkg.github.com 的私有注册表,我只是隐藏了我公司的注册表。您将需要使用可以从本地执行 docker pull 的完整路径
    • 好的,谢谢!正如我在编辑我的初始帖子(标题和结尾)中提到的那样,这个问题似乎与访问 github 包有关,因为我设法使用 dockerhub 进行这项工作!
    【解决方案2】:

    稍作挖掘并与一些AWS技术人员交流后:

    问题似乎在于 EKS Fargate 在后台使用了 Containerd。

    Containerd 和 Docker 尝试以不同的方式拉取镜像。 Containerd 目前正在跟踪多个仅正确支持 Docker 但不支持 OCI HTTP API V2 的注册表提供程序的多个问题,github being one of them

    正如 Github 产品总监 mentioned 所说,该问题将在几周到几个月内得到解决。

    【讨论】:

    • 你现在可以从 github 包中提取图像了吗?你做了什么解决方法?
    • 从那以后没有尝试过。我最终使用了 AWS ECR。
    【解决方案3】:

    如果对 AWS 文档没有希望,您可以执行以下操作:

    • 运行 daemonset,它将按设计为每个节点创建 pod。
    • 这些 pod 将装载类型为 hostPath (/var/run/docker.sock) 的卷。
    • 这些 pod 有 docker 客户端并运行以下“命令”

      docker login docker.pkg.github.com -u username -p passWord
      
    • 现在您在容器内登录,但它并未反映在 Node.js 中。然后,您需要挂载另一个 hostPath 卷 (~/.docker/config.json)。但挑战在于知道 Fargate 节点的主目录是什么。在下面的示例中,我输入了 /root(卷),但它可以是其他内容。例如 /home/ec2-user... 需要检查的内容。

    • 看起来是这样的

      apiVersion: apps/v1
      kind: Daemonset
      metadata:
        name: docker-init
      spec:
        replicas: 1
        template:
          metadata:
            name: worker
            labels:
              app: worker
          spec:
            initContainers:
            - name: login-private-registies
              image: docker
              command: ['sh', '-c', 'docker login docker.pkg.github.com -u username -p passWord']
              volumeMounts:
                - name: dockersock
                  mountPath: "/var/run/docker.sock"
                - name: dockerconfig
                  mountPath: "/root/.docker"
            volumes:
            - name: dockersock
              hostPath:
                path: /var/run/docker.sock
            - name: dockerconfig
              hostPath:
                path: /root/.docker
      

    【讨论】:

    • 嗨!感谢您的回答,我得到了您希望我尝试的方法,我希望这会奏效:) 我担心 fargate 无服务器架构可能会导致一些关于访问仅由 AWS 管理的 EC2 实例上的卷的权限的问题。我会回来告诉你进展如何!
    • 因为我担心在 AWS EKS 和 Fargate 上使用卷尚不可用:(
    • @Abdennour TOUMI imagePullSecrets
    猜你喜欢
    • 2021-12-10
    • 2018-05-20
    • 2020-05-07
    • 1970-01-01
    • 2019-04-05
    • 1970-01-01
    • 2021-07-03
    • 2020-05-10
    • 2019-06-04
    相关资源
    最近更新 更多