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

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

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

Ответ 1

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

--overrides='{ "apiVersion": "v1", "spec": { "imagePullSecrets": [{"name": "your-secret"}] } }'

например

kubectl run -i -t hello-world --restart=Never --rm=true \ --image=eu.gcr.io/your-registry/hello-world \ --overrides='{ "apiVersion": "v1", "spec": { "imagePullSecrets": [{"name": "your-registry-secret"}] } }'

Ответ 2

Вы можете создать секрет 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

Ответ 3

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

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

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

Посмотрите здесь и здесь для завершения

Ответ 4

В 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

,