Как передать секрет извлечения изображения при использовании команды kubectl run?

Я пытаюсь использовать команду kubectl run, чтобы вытащить изображение из частного реестра и запустить команду из него. Но я не вижу возможности указать секрет извлечения изображения. Похоже, что невозможно передать секрет изображения как часть команды запуска.

Есть ли альтернативный способ вытащить контейнер и запустить команду с помощью kubectl? Вывод команды должен быть виден на консоли. Также, как только команда завершит работу, капсула должна умереть.


person noorul    schedule 27.10.2016    source источник
comment
kubernetes.io/docs/user -guide / production-pods /   -  person Mark O'Connor    schedule 27.10.2016
comment
@ MarkO'Connor Спасибо за ссылку. Это было интересное чтиво. Но я хочу использовать команду запуска kubectl.   -  person noorul    schedule 28.10.2016
comment
@ MarkO'Connor Я обновил вопрос   -  person noorul    schedule 28.10.2016
comment
Не понимаю, в чем проблема. Даже для командной строки docker требуется отдельная команда входа в систему.   -  person Mark O'Connor    schedule 28.10.2016


Ответы (7)


Вы можете использовать переопределения, если укажете это правильно, в конце концов, это массив, который мне потребовалось немного, чтобы понять, что ниже работает на Kubernetes как минимум 1.6:

--overrides='{ "spec": { "template": { "spec": { "imagePullSecrets": [{"name": "your-registry-secret"}] } } } }'

Например

kubectl run -i -t hello-world --rm --generator=run-pod/v1 \
--image=eu.gcr.io/your-registry/hello-world \
--image-pull-policy="IfNotPresent" \
--overrides='{ "spec": { "template": { "spec": { "imagePullSecrets": [{"name": "your-registry-secret"}] } } } }'
person Elmar Weber    schedule 07.11.2017
comment
Для Windows вам нужно избегать двойных кавычек (и удалить две одинарные кавычки). У вас будет что-то вроде --overrides="{ \"apiVersion\": \"v1\", ...}] } }" - person Andrei Damian-Fekete; 04.07.2019
comment
Этот ответ концептуально верен, но он больше не работает, поскольку API развертывания, используемый kubectl run, был перемещен с версии v1. Взгляните на комментарий @Raman ниже, чтобы узнать, как это сделать. - person dbaltor; 27.07.2019
comment
В моем случае это сработало с этим переопределением: --overrides='{ "apiVersion": "apps/v1", "spec": { "template": { "spec": { "imagePullSecrets": [{"name": "your-registry-secret"}] } } } }' - person marcostvz; 21.08.2019
comment
@marcostvz спасибо за комментарий, я изменил ответ, чтобы удалить устаревшую конструкцию, а также добавил ваш метод - person im_infamous; 18.11.2020
comment
В моем случае в Azure: --overrides='{ "spec": { "imagePullSecrets": [{"name": "your-registry-secret"}] } }' - person Rui Martins; 08.02.2021

Вы можете создать docker-registry секрет, как описано в ссылке @ MarkO'Connor, а затем добавить его в ServiceAccount по умолчанию. Именно SA действует от имени модулей, включая извлечение их изображений.

Из Добавление ImagePullSecrets в учетную запись службы:

$ kubectl create secret docker-registry myregistrykey --docker-username=janedoe --docker-password=●●●●●●●●●●● [email protected]
secret "myregistrykey" created

$ kubectl get serviceaccounts default -o yaml > ./sa.yaml

$ cat sa.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  creationTimestamp: 2015-08-07T22:02:39Z
  name: default
  namespace: default
  resourceVersion: "243024"
  selfLink: /api/v1/namespaces/default/serviceaccounts/default
  uid: 052fb0f4-3d50-11e5-b066-42010af0d7b6
secrets:
- name: default-token-uudge

$ vi sa.yaml
[editor session not shown]
[delete line with key "resourceVersion"]
[add lines with "imagePullSecret:"]

$ cat sa.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  creationTimestamp: 2015-08-07T22:02:39Z
  name: default
  namespace: default
  selfLink: /api/v1/namespaces/default/serviceaccounts/default
  uid: 052fb0f4-3d50-11e5-b066-42010af0d7b6
secrets:
- name: default-token-uudge
imagePullSecrets:
- name: myregistrykey

$ kubectl replace serviceaccount default -f ./sa.yaml

Теперь для любых новых модулей, созданных в текущем пространстве имен, это будет добавлено в их спецификацию:

spec:
  imagePullSecrets:
  - name: myregistrykey
person mgoodness    schedule 17.11.2016
comment
Проще: kubectl patch serviceaccount default -p '{"imagePullSecrets": [{"name": "myregistrykey"}]}' - person Raman; 20.09.2017
comment
@Raman ... эта команда (которая есть в документации ..) у меня не работает. Я получаю = ›ошибка: невозможно разобрать '{\ imagePullSecrets \ :: yaml: обнаружен неожиданный конец потока Есть идеи ?? - person Kostas Demiris; 25.04.2018
comment
@KostasDemiris kubectl patch serviceaccount default -p '{"imagePullSecrets": [{"name": "myregistrykey"}]}' должно работать - person jitter; 08.05.2018
comment
kubectl patch serviceaccount default -p '{imagePullSecrets: [{name: myregistrykey}]}' получить ошибку синтаксического анализа Ошибка с сервера (BadRequest): недопустимый символ 'i' ищет начало строки ключа объекта (1.10 в Windows) kubectl replace serviceaccount по умолчанию -f ./sa.yaml работает для меня - person user1295211; 15.09.2018

Обычно, когда вам нужно kubectl run, это потому, что вы тестируете что-то временное в пространстве имен, в котором уже есть секрет реестра докеров для доступа к частному реестру. Поэтому проще всего отредактировать учетную запись службы по умолчанию, чтобы дать ей секрет извлечения, который будет использоваться, когда секрет извлечения отсутствует (что будет иметь место для kubectl run):

kubectl edit serviceaccount default

Редактирование покажет что-то похожее на это:

apiVersion: v1
kind: ServiceAccount
metadata:
  creationTimestamp: "2019-04-16T14:48:17Z"
  name: default
  namespace: integration-testing
  resourceVersion: "60516585"
  selfLink: /api/v1/namespaces/integration-testing/serviceaccounts/default
  uid: ab7b767d-6056-11e9-bba8-0ecf3bdac4a0
secrets:
- name: default-token-4nnk4

Просто добавьте imagePullSecrets:

imagePullSecrets:
- name: <name-of-your-docker-registry-password-secret>

так это будет выглядеть так:

apiVersion: v1
kind: ServiceAccount
metadata:
  creationTimestamp: "2019-04-16T14:48:17Z"
  name: default
  namespace: integration-testing
  resourceVersion: "60516585"
  selfLink: /api/v1/namespaces/integration-testing/serviceaccounts/default
  uid: ab7b767d-6056-11e9-bba8-0ecf3bdac4a0
secrets:
- name: default-token-4nnk4
imagePullSecrets:
- name: <name-of-your-docker-registry-password-secret>

Скажем, имя YOUR_PWD_SECRET, тогда этот секрет должен существовать в пространстве имен контекста kubectl:

tooluser:/host $ kubectl get secret YOUR_PWD_SECRET
NAME              TYPE                             DATA   AGE
YOUR_PWD_SECRET   kubernetes.io/dockerconfigjson   1      186d

Если его не существует, вы должны создать его либо с нуля, либо скопировать из другого пространства имен (лучший способ сделать это - ответить NicoKowe по адресу https://stackoverflow.com/a/58235551/869951).

С секретом, содержащим ваш пароль реестра докеров, секретом в том же пространстве имен, где будет выполняться kubectl run, и с учетной записью службы по умолчанию, в которой указан секрет как imagePullSecrets, kubectl run будет работать.

person Oliver    schedule 31.01.2020

В Windows вы можете сделать patch, но, поскольку он показывает ошибку JSON, вам нужно проделать этот трюк (используя PowerShell):

> $imgsec=  '{"imagePullSecrets": [{"name": "myregistrykey"}]}' | ConvertTo-Json
> kubectl patch serviceaccount default -p $imgsec

Кроме того, если вы хотите обновить / добавить imagePullSecret, вам следует использовать что-то вроде этого:

> $imgsec=  '[{"op":"add","path":"/imagePullSecrets/-","value":{"name":"myregistrykey2"}}]' | ConvertTo-Json

> kubectl patch serviceaccount default --type='json' -p  $imgsec

.

person Paras Patidar    schedule 26.11.2018
comment
Спасибо, что поделились этим! Я немного рассказал об этом подходе, так как я, казалось, подходил в нескольких местах, пока искал решение :) - person Matt Woodward; 15.12.2018

Насколько я знаю, вы не можете, но вы можете использовать kubectl run nginx --image=nginx --overrides='{ "apiVersion": "v1", "spec": { ... } }' , но это не сильно отличается от того, что вы можете делать с kubectl create -f mypod.json

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

Kubectl run ... создает объекты deploymentorjob`. Задания завершаются, когда завершается выполнение модуля, и вы можете проверить журналы.

Взгляните сюда и здесь для завершения

person Ivan Pedrazas    schedule 18.11.2016
comment
Хорошая идея, но после ее запуска я получил ошибку: api.Secret не подходит для преобразования в extension / v1beta1. Думаю, они специально отключили это. Команда была kubectl run ovass-fetcher-$(date +%s) --image=nginx --overrides="$(kubectl get secret registrykey -o json)" там, где я ранее установил рабочий секрет: ключ реестра. - person wassname; 07.06.2017
comment
@wassname проверьте мой ответ ниже на примере того, как он работает, по крайней мере, на K8s 1.6 или новее - person Elmar Weber; 07.11.2017

Пожалуйста, попробуйте следующую команду:

kubectl run nginx--image=nginx --overrides='{"apiVersion": "apps/v1", 
"spec": {"template":{"spec":{"imagePullSecrets": [{"name": "secret-name"}]}}}}'
person Thulasya    schedule 31.03.2020

Я решил проблему с помощью kubectl run nginx - image = nginx --overrides = '{apiVersion: apps / v1, spec: {template: {spec: {imagePullSecrets: [{name: secret-name}]}}}} '

person baifuwa    schedule 22.10.2020