Кубернетес - разделяет секрет между пространствами имен
Есть ли способ поделиться секретами между пространствами имен в Кубернете?
Мой вариант использования: у меня есть тот же частный реестр для всех моих пространств имен, и я хочу избежать создания одного и того же секрета для каждого.
Спасибо за вашу помощь.
Ответы
Ответ 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 -