Автоматически добавлять imagepullsecrets в serviceaccount

Мы используем ServiceAccounts для RBAC, поэтому задействуем несколько SA, чтобы мы могли соответствующим образом настраивать доступ через RoleBindings.

Мы также используем частный реестр и, следовательно, имеем imagePullSecrets для извлечения изображений из частного реестра. Я пытаюсь придумать решение, с помощью которого все SA, созданные в пространстве имен, по умолчанию получат список imagePullSecrets, примененный к SA по умолчанию, добавленной к ним, так что при развертывании модулей, использующих службу (обычно правильно после SA) serviceAccount уже настроен для использования imagePullSecrets для получения изображений.

Кто-нибудь придумал элегантный способ справиться с этим? Я действительно проверил, могут ли модули иметь более одного serviceAccount - N для хранения imageSecrets и 1 для сопоставления с RBAC. И / или может кто-нибудь предложить альтернативный способ взглянуть на проблему?

[ОБНОВЛЕНИЕ: Уточнение - задача состоит в том, чтобы разделить набор imagePullSecrets между несколькими учетными записями служб, желательно без явного добавления их в каждое определение ServiceAccount. Частный реестр следует рассматривать как сродни dockerhub: пользователь, обращающийся к реестру, обычно предназначен для получения возможности извлечения, а информация о пользователе затем используется для отслеживания того, кто извлекает изображения, и иногда для предотвращения извлечения пользователями изображений, к которым у них не должно быть доступа. по причинам «эта вещь просто не предназначена для более широкого потребления».]

5
0
5 962
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

НАСКОЛЬКО МНЕ ИЗВЕСТНО. Единственное, что вы можете сделать, это связать разные ImagePullSecret с разными пространствами имен, а затем ограничить доступ пользователя только этим пространством имен. Это сделано для того, чтобы эти пользователи могли использовать эти секреты для создания Deployments / DaemonSets / StateFulSets / Pods.

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

Спасибо за ответ - см. Опубликованное выше обновление, чтобы лучше прояснить вопрос / необходимость.

TinaC 14.09.2018 15:16

Попался. обновил ответ. У K8s нет настоящего решения для этого.

Rico 14.09.2018 16:31

Вы можете сделать это в три этапа:

СОЗДАНИЕ СЕКРЕТА

kubectl create secret docker-registry myregistrykey --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL

СОЗДАНИЕ СЕРВИСНОГО АККАУНТА (сюда привязываете секрет)

apiVersion: v1
kind: ServiceAccount
metadata:
  name: chicken 
imagePullSecrets:
- name: myregistrykey

СОЗДАНИЕ РОЛЕВАЯ (здесь вы привязываете serviceAccount и Role)

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: example-rolebinding
  namespace: mynamespace
subjects:
- kind: ServiceAccount
  name: chicken
  namespace: mynamespace
roleRef:
  kind: Role
  name: example-role
  apiGroup: rbac.authorization.k8s.io

Спасибо за ответ - см. Опубликованное выше обновление, чтобы лучше прояснить вопрос / необходимость.

TinaC 14.09.2018 15:16
Ответ принят как подходящий

Запись разрешения, которое, кажется, работает для нас:

Сохраните текст для списка imagePullSecrets в переменной, а затем используйте эту переменную в наших шаблонах для ServiceAccounts. Если частных реестров нет, переменная представляет собой пустую строку. Если есть частные реестры, то переменная содержит

imagePullSecrets:
    - name: secret1
    - name: secret2

(и т. д. и т. д.) Мы работаем в среде Ansible и поэтому можем воспользоваться преимуществами шаблонов Jinja, но я думаю, что в целом подход применим.

Как я ответил в другом потоке:

To easily add imagePullSecrets to a serviceAccount you can use the patch command:

kubectl patch serviceaccount default -p '{"imagePullSecrets": [{"name": "mySecret"}]}'

Как уже было сказано ранее, не существует стандартного способа Kubernetes для глобального определения секретов частного реестра на уровне кластера. Только упомянутые выше решения почти великолепны. Остальные предложения (т.е. здесь) я тоже нашел неудовлетворительными.

Что необходимо, так это возможность один раз определить секретный секрет реестра и использовать его как imagePullSecrets для каждого ServiceAccount.

Секретный патчер titansoft может просто это сделать. Он заполняет предоставленный секрет извлечения изображения по всем пространствам имен и исправляет все ServiceAccounts, чтобы использовать секрет в качестве их imagePullSecret. Однако Секретный патчер titansoft работает только с одним секретом частного реестра.

В моем случае использования у меня есть несколько частных реестров контейнеров, к которым я хочу предоставить доступ во всех пространствах имен моего кластера.

Следовательно, я использую подход изображение нейтриноpullsecret-serviceaccount-patcher. Он использует Кубернетес-репликатор миттвальда для репликации секретов частного реестра во всех пространствах имен. Вдобавок к этому изображение нейтриноpullsecret-serviceaccount-patcher исправляет imagePullSecrets всех учетных записей служб, чтобы включить определенные секреты частного реестра (<- да, несколько, если хотите).

Другие вопросы по теме