Intereting Posts
DOCKER Как обновить обновление файла Hosts из файла dockerfile или прямо в контейнере? как создать пользователя InfluxDB в файле Dockerfile CircleCI: лучший способ проверить, отвечают ли контейнеры докеров через HTTP Невозможно вытащить изображение докеры из частного репо при использовании Minikube Dockerfile с приложением tomcat + mysql + filesystem Как вызвать CAT внутри файла Docker во время сборки и заставить его работать для любого файла на изображении? Как отредактировать файл после того, как я перейду в контейнер докеров? Не удается подключить док-станцию ​​от Macos Не удается запустить cron в Laravel 5.4 (PHP7) с помощью Docker Предел памяти докеров в трубопроводах Статическое содержимое Magento не генерирует изображение Docker Управление портом экземпляра Docker Есть ли способ, изнутри программы Java, определить, работает ли он в Docker? Почему хром в докере с python-selenium не загружает файл? Подключить Java-приложение к базе данных YouTube Vitess

Клонировать безопасное git-репо в Kubernetes pod

Я столкнулся с интересной ситуацией, когда мне нужно клонировать частный репозиторий github в контейнер докеров, который я запускаю в Kubernetes. Первоначально я попытался использовать gitRepo mount, однако наличие ключа OAuth в манифесте развертывания неприемлемо, и я бы хотел использовать ключ развертывания repo, а не ключ OAuth, прикрепленный к моей учетной записи GitHub.

В идеале я бы использовал mount gitRepo, который использует секрет, но эта функция недоступна на момент написания.

Ограничения

Мне нужно следующее:

  • Репо внутри контейнера, которое я могу прерывать, пока работает мой контейнер
  • Репо должно быть доступно с помощью ключа развертывания GitHub
  • Ключ должен храниться в безопасности (в секретности Кубернета) и не храниться в изображении докера
  • Репо должно быть разделено между двумя контейнерами в том же самом блоке, который пишет, и том, который читает

Возможные решения:

Установите ключи SSH в виде секретов и клонов:

Я попытался клонировать репо в emptydir с скриптом bash, работающим в отдельном контейнере (этот скрипт должен работать в любом случае, я использую его и для других вещей), однако затем я столкнулся с проблемой получения ключей ssh ​​в порт назначения Этот вопрос касается этой проблемы, однако, похоже, у нее нет способа сделать это. Мне удалось получить ключи с помощью секретного монтирования, но тогда для разрешений установлено значение 777. Чтобы обойти это, я установил ключи в каталог /test/ а затем попытался выполнить их в /root/.ssh/ , Это дало мне эти странные ошибки:

 cp: '/test/id_rsa' and '/root/.ssh/id_rsa' are the same file cp: '/test/id_rsa.pub' and '/root/.ssh/id_rsa.pub' are the same file 

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

 cat: /keys/id_rsa: input file is output file cat: /keys/id_rsa.pub: input file is output file 

Как только я исправил пути, он ничего не делал и молчал. kubectl exec в /root/.ssh/ не показывал файлов в /root/.ssh/ .

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

Настройка ssh для игнорирования ключевых разрешений

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

Другой способ получения ключей в контейнере надежно

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

Клонирование с использованием ключа OAuth в контейнере

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

Клонирование изображения докера

В репо нет ничего, что мне было бы неудобно иметь в изображении докера, чтобы я мог пройти этот маршрут. Проблема заключается в том, что мне нужно уметь обновлять репо. Если я поместил его в контейнер, я не смогу вытащить его без ключей. Могло быть какое-то обходное решение, которое я не пробовал.

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


Похожие вопросы

Этот вопрос очень похож на то, что я пытаюсь сделать, однако я чувствую, что, поскольку они не используют Kubernetes, и я, это стоит отправлять отдельно из-за секретов и различных методов монтирования файлов.

Этот вопрос говорит о том, чтобы получить ключи SSH в контейнерах в Kubernetes, однако я не устарел использовать git для SSH, поэтому я думаю, что это должен быть собственный вопрос.

Попробуйте установить секрет, содержащий ваш ключ развертывания, следующим образом:

 volumeMounts: - mountPath: /root/.ssh name: ssh-key volumes: - name: ssh-key secret: secretName: ssh-key defaultMode: 256 

Вот полный пример того, как я его использую:

 apiVersion: batch/v2alpha1 kind: ScheduledJob metadata: name: transporter spec: schedule: 0 5 * * * jobTemplate: spec: template: spec: nodeSelector: role: mysqldump containers: - name: transporter image: camil/mysqldump command: ["/bin/bash", "-c"] args: - ssh-keyscan -t rsa $TARGET_HOST > ~/.ssh/known_hosts && ssh -i /root/.ssh/private/id_rsa $LINUX_USER@$TARGET_HOST 'mkdir mysqldump || true' && scp -i /root/.ssh/private/id_rsa /mysqldump/* $LINUX_USER@$TARGET_HOST:/home/$LINUX_USER/mysqldump env: - name: TARGET_HOST valueFrom: configMapKeyRef: name: transporter key: target.host - name: LINUX_USER valueFrom: configMapKeyRef: name: transporter key: linux.user imagePullPolicy: Always volumeMounts: - mountPath: /mysqldump name: mysqldump - mountPath: /root/.ssh/private name: ssh-key volumes: - name: mysqldump hostPath: path: /home/core/mysqldump - name: ssh-key secret: secretName: ssh-key defaultMode: 256 restartPolicy: OnFailure