使用带有AWS Fargate的AWS EKS从私有github软件包中提取docker映像

时间:2020-02-24 17:09:11

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

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

要部署我的服务,我正在使用一个包含密钥,部署和服务的kubernetes清单文件。

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

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

为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软件包作为注册表提供者有关。

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

经过深入研究并与一些AWS技术人员进行了交流:

问题似乎是EKS Fargate在引擎盖下使用了Containered。

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

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

答案 2 :(得分:1)

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

  • 运行后台驻留程序集,该后台驻留程序将按设计为每个节点创建容器。
  • 这些Pod将装入 hostPath (/var/run/docker.sock)类型的卷。
  • 这些Pod具有docker客户端,并运行以下“命令”

    docker login docker.pkg.github.com -u username -p passWord
    
  • 现在,您在容器内部登录,但是它没有反映在Node中。然后,您需要挂载另一个hostPath卷(~/.docker/config.json)。但是挑战是要知道Fargate Nodes的主目录是什么。在下面的示例中,我放置了/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