Как создать файл развертывания для сервиса kubernetes, который зависит от образов из Amazon ECR?

Коллега создал для меня кластер K8s. Я могу без проблем запускать службы в этом кластере. Однако я не могу запускать сервисы, зависящие от изображения из Amazon ECR, чего я действительно не понимаю. Возможно, я допустил небольшую ошибку в своем файле развертывания и, таким образом, вызвал эту проблему.

Вот мой файл развертывания:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-deployment
  labels:
    app: hello
spec:
  replicas: 3
  selector:
    matchLabels:
      app: hello
  template:
    metadata:
      labels:
        app: hello
    spec:
      containers:
      - name: hello
        image: xxxxxxxxx.yyy.ecr.eu-zzzzz.amazonaws.com/test:latest
        ports:
        - containerPort: 5000

Вот мой служебный файл:

apiVersion: v1
kind: Service
metadata:
  name: hello-svc
  labels:
    app: hello
spec:
  type: NodePort
  ports:
  - port: 5000
    nodePort: 30002
    protocol: TCP
  selector:
    app: hello

Я запустил это на главном узле, чтобы убедиться, что Kubernetes знает о развертывании и сервисе.

kubectl create -f dep.yml
kubectl create -f service.yml

Я использовал расширение K8s в vscode для проверьте журналы моих стручков.

Это ошибка, которую я получаю:

Ошибка с сервера (BadRequest): контейнер hello в модуле hello-deployment-xxxx-49pbs ожидает запуска: попытка получения образа, но не удается.

Судя по всему, проблема с вытягиванием ..... Этого не происходит при использовании общедоступного образа из общедоступного центра докеров. По логике вещей, это будет вопрос прав. Но похоже, что это не так. Я не получаю сообщения об ошибке при выполнении этой команды на главном узле:

docker pull xxxxxxxxx.yyy.ecr.eu-zzzzz.amazonaws.com/test:latest

Эта команда просто вытягивает мое изображение.

Я сейчас в замешательстве. Я могу вытащить свое изображение с помощью docker pull на главный узел. Но K8s не справляется. Мне что-то не хватает в моем файле развертывания? Некоторое свойство, которое говорит: repositoryIsPrivateButDoNotComplain? Я просто не понимаю этого.

Как это исправить, чтобы K8s мог легко использовать мое изображение из Amazon ECR?


person Daan    schedule 26.03.2021    source источник
comment
Пожалуйста, загляните в него. stackoverflow.com/ questions / 63415603 /   -  person Pulak Kanti Bhowmick    schedule 26.03.2021
comment
Это другая проблема: но теперь секретный пароль действителен только в течение 12 часов, когда вы генерируете для ECR, мне придется каждый раз вручную изменять секрет .. Мой вопрос не имеет ничего общего с 12-часовой проблемой. Отношения есть, но все же разные.   -  person Daan    schedule 26.03.2021
comment
Я думаю, Пулак пытается указать вам на конфигурацию imagePullSecrets. Я не вижу, чтобы вы использовали его в конфигурации развертывания. Это необходимо для получения образа из частного реестра. 12-часовая проблема - это проблема, с которой вы столкнетесь после решения своей первой проблемы - если с тех пор AWS не внесла каких-либо изменений.   -  person rock'n rolla    schedule 26.03.2021
comment
@Daan помогли ли приведенные ниже решения?   -  person Malgorzata    schedule 29.03.2021
comment
@Malgorzata Да, я одобрил ответ, который решил мою проблему.   -  person Daan    schedule 29.03.2021


Ответы (2)


Вы должны создать и использовать секреты для авторизации ECR.

Это то, что вам нужно сделать.

  1. Создайте секрет для кластера Kubernetes, выполните приведенный ниже сценарий оболочки с компьютера, с которого вы можете получить доступ к учетной записи AWS, в которой размещен реестр ECR. Измените заполнители в соответствии с вашими настройками. Убедитесь, что на компьютере, на котором вы выполняете этот сценарий оболочки, должен быть установлен aws cli и настроены учетные данные aws. Если вы используете машину с Windows, выполните этот скрипт в консоли Cygwin или git bash.
#!/bin/bash
ACCOUNT=<AWS_ACCOUNT_ID>
REGION=<REGION>
SECRET_NAME=<SECRETE_NAME>
EMAIL=<SOME_DUMMY_EMAIL>

TOKEN=`/usr/local/bin/aws ecr --region=$REGION --profile <AWS_PROFILE> get-authorization-token --output text --query authorizationData[].authorizationToken | base64 -d | cut -d: -f2`

kubectl delete secret --ignore-not-found $SECRET_NAME
kubectl create secret docker-registry $SECRET_NAME \
 --docker-server=https://${ACCOUNT}.dkr.ecr.${REGION}.amazonaws.com \
 --docker-username=AWS \
 --docker-password="${TOKEN}" \
 --docker-email="${EMAIL}"
  1. Измените развертывание и добавьте раздел для секретов, которые будут использоваться модулями при загрузке образа из ECR.
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-deployment
  labels:
    app: hello
spec:
  replicas: 3
  selector:
    matchLabels:
      app: hello
  template:
    metadata:
      labels:
        app: hello
    spec:
      containers:
      - name: hello
        image: xxxxxxxxx.yyy.ecr.eu-zzzzz.amazonaws.com/test:latest
        ports:
        - containerPort: 5000
      imagePullSecrets:
        - name: SECRET_NAME
  1. Создайте контейнеры и сервис.

  2. Если это удастся, секрет все равно истечет через 12 часов, чтобы преодолеть эту настройку кроны (для периодического воссоздания секретов в кластере Kubernetes. Для настройки кроны используйте тот же скрипт, который приведен выше.

Для полной картины того, как это происходит под капотом, пожалуйста, обратитесь к диаграмме ниже.

введите описание изображения здесь

С уважением, Амит Мина

person Amit Meena    schedule 27.03.2021

Для 12-часовой проблемы, если вы используете Kubernetes 1.20, настройте и используйте поставщик учетных данных образа Kubelet.

https://kubernetes.io/docs/tasks/kubelet-credential-provider/kubelet-credential-provider/

Вам необходимо включить альфа-канал функций KubeletCredentialProviders в вашем kubelet

Если вы используете нижнюю версию Kubernetes и эта функция недоступна, используйте https://medium.com/@damitj07/how-to-configure-and-use-aws-ecr-with-kubernetes-rancher2-0.-6144c626d42c

person Sagar Velankar    schedule 26.03.2021