Извлечение docker изображения из частного пакета github с использованием AWS EKS с AWS Fargate - PullRequest
3 голосов
/ 24 февраля 2020

I sh для развертывания докерской службы с kubernetes на aws. Для этого я использую недавно выпущенную AWS EKS с функцией AWS Fargate. Образ службы docker хранится в закрытом пакете на github.

Для развертывания моей службы я использую файл манифеста kubernetes, содержащий секрет, развертывание и службу.

При локальном развертывании с помощью kubectl на minikube модули развертывания успешно извлекают образ из частного пакета github. Я успешно воспроизвел процесс доступа к частному реестру dockerhub.

Затем я настроил kubectl для подключения к моему кластеру eks. При применении файла манифеста я получаю статус ImagePullBackOff для модулей развертывания при извлечении пакетов формы github, когда он работает нормально при извлечении из 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

Спецификация развертывания c упоминается следующим образом:

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"
        ]
    }
  ]
}

Затем я прикрепил политику к обоим ролям IAM кластера моего кластера eks и роль выполнения Pod, указанная в его профиле fargate "fp-default". Я работаю только в пространстве имен kubernetes по умолчанию. Мой секрет и кластер находятся в регионе eu-west-1.

Тем не менее, при развертывании я получаю статус ImagePullBackOff.

У меня Трудно найти что-то, что решает эту проблему, используя AWS Fargate с AWS EKS, и ему очень хотелось бы кое-что понять:)

Edit : Вопрос был отредактирован для того, чтобы представить его в более ясное мнение, что проблема в основном связана с использованием пакетов github в качестве поставщика реестра.

Ответы [ 3 ]

2 голосов
/ 25 февраля 2020

Я думаю, вам нужно создать свой секрет в том же пространстве имен, что и ваше развертывание. Я смог получить эту работу, создав секретный

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

в своем deploy.yaml, я ссылался на него как

    spec:
      containers:
        - name: my-api
          image: docker.pkg.github.com/doc-api:0.0.0
          ports:
          - containerPort: 5000
          resources: {}
      imagePullSecrets:
        - name: mySecret
1 голос
/ 24 февраля 2020

Если нет надежды с AWS документами, вы можете сделать следующее:

  • Запустить daemonset, который создаст модуль для каждого узла.
  • Эти модули будут монтировать тома введите hostPath (/var/run/docker.sock).
  • В этих модулях есть клиент docker и выполните следующую "команду"

    docker login docker.pkg.github.com -u username -p passWord
    
  • Теперь вы входите в контейнер, но это не отражается в узле. затем вам нужно смонтировать другой том hostPath ( ~ / .docker / config. json). Но задача состоит в том, чтобы узнать, что является домашним каталогом узлов Fargate. В приведенном ниже примере я поставил /root (тома), но это может быть что-то еще .eg /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
    
0 голосов
/ 28 февраля 2020

Немного покопавшись и обменявшись с некоторыми из AWS технического персонала:

Проблема, похоже, в том, что EKS Fargate использует Containerd под капотом.

Containerd и Docker пытаются вытянуть изображения по-разному. В настоящее время Containerd отслеживает множество проблем с несколькими поставщиками реестра, которые корректно поддерживают только Docker, но не OCI HTTP API V2, github является одним из них .

Как указано директор по продукту в Github, проблема будет решена в течение нескольких недель или нескольких месяцев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...