使用 AWS EKS 和 AWS Fargate 从私有 github 包中提取 docker 镜像

alx*_*lzt 5 amazon-web-services docker kubernetes aws-fargate amazon-eks

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

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

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

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

为 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
Run Code Online (Sandbox Code Playgroud)

为 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
Run Code Online (Sandbox Code Playgroud)

部署规范参考如下:

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
Run Code Online (Sandbox Code Playgroud)

尝试使用 github 包专门进行这项工作时我尝试使用 AWS Secrets Manager。

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

{
  "username" : "myGithubUsername",
  "password" : "myGithubAccessToken"
}
Run Code Online (Sandbox Code Playgroud)

然后我创建了一个访问这个秘密的策略:

{
  "Version": "2012-10-17",
  "Statement": [
    {
        "Effect": "Allow",
        "Action": [
            "secretsmanager:GetSecretValue"
        ],
        "Resource": [
            "arn:aws:secretsmanager:eu-west-1:myAWSAccountId:secret:mySecret"
        ]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

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

尽管如此,我在部署时仍处于 ImagePullBackOff 状态。

我很难找到使用 AWS Fargate 和 AWS EKS 解决此问题的任何方法,并且希望对此有一些见解:)

编辑编辑该问题是为了更清楚地表明该问题主要与使用 github 包作为注册表提供程序有关。

alx*_*lzt 2

经过一番挖掘并与一些 AWS 技术人员交流后:

问题似乎是 EKS Fargate 在幕后使用 Containerd。

Containerd 和 Docker 尝试以不同的方式拉取镜像。Containerd 目前正在跟踪多个注册表提供商的多个问题,这些提供商仅正确支持 Docker,但不支持 OCI HTTP API V2,github 就是其中之一

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