Кубернетес - разделяет секрет между пространствами имен

Есть ли способ поделиться секретами между пространствами имен в Кубернете?

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

Спасибо за вашу помощь.

Ответ 1

Секретные объекты API находятся в пространстве имен. На них можно ссылаться только на контейнеры в том же пространстве имен. В принципе, вам нужно будет создать secrete для каждого пространства имен.

https://kubernetes.io/docs/concepts/configuration/secret/#details

Ответ 2

На них могут ссылаться только стручки в том же пространстве имен. Но вы можете просто скопировать секрет из одного пространства имен в другое. Вот пример копирования секрета localdockerreg из пространства имен default в dev:

 kubectl get secret localdockerreg --namespace=default --export -o yaml | kubectl apply --namespace=dev -f -

UPDATE

В Kubernetes v1.14 --export флаг устарел. Таким образом, следующая команда с флагом -oymal будет работать без предупреждения в следующих версиях.

kubectl get secret localdockerreg --namespace=default -oyaml | kubectl apply --namespace=dev -f -

Ответ 3

Как ответил Иннокентий Анигбо, вам нужно иметь секрет в том же пространстве имен. Если вам нужно поддерживать эту динамику или избегать создания скрывающего секретного создания, возможно, будет возможно создать инициализатор для объекта пространства имен https://kubernetes.io/docs/admin/extensible-admission-controllers/ (не сделал этого сам по себе, поэтому не могу сказать наверняка)

Ответ 4

kubectl получить секретный реестр gitlab --namespace = revsys-com --export -o yaml |\kubectl apply --namespace = devspectrum-dev -f -

Ответ 5

Это возможно, если вы используете ServiceAccount и ClusterRole. Следующее должно предоставить доступ к вашему приложению, запущенному в пространстве имен my-app выбранным секретам в пространстве имен по default.

Создать роль кластера:

# Allow access to needed resources
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: default-ns-access
rules:
- apiGroups:
  - ""
  resourceNames:
  - tls-secret
  - gitlab-registry
  resources:
  - secrets
  verbs:
  - get

Тогда ваше развертывание будет выглядеть следующим образом:

---
apiVersion: v1
kind: Namespace
metadata:
  name: myapp-ns
  labels:
    name: myapp-ns
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: myapp
  namespace: myapp-ns
  labels:
    app: myapp
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: RoleBinding
metadata:
  name: myapp-default
  namespace: default 
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: default-ns-access
subjects:
- kind: ServiceAccount
  name: myapp
  namespace: myapp-ns
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
  namespace: myapp-ns
  labels:
    app: myapp
spec:
  replicas: 3
  selector:
  strategy:
  template:
    spec:
      serviceAccountName: myapp
      containers:
      - name: myapp
[...]
      imagePullSecrets:
        - name: default/gitlab-registry

Теперь ваше развертывание должно получить доступ к секрету в пространстве имен по default чтобы получать изображения из частного репозитория.

Ответ 6

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

kubectl get secret <secret-name> -n <source-namespace> -o yaml \
| sed s/"namespace: <source-namespace>"/"namespace: <destination-namespace>"/\
| kubectl apply -n <destination-namespace> -f -