
Я пытаюсь автоматизировать обновление учетных данных ECR и сохранение токена в секрете через CronJob. Всякий раз, когда я запускаю CronJob, я получаю следующую ошибку в результирующих журналах заданий
2023-09-14T20:11:20.326837046Z error: failed to create secret secrets is forbidden: User "system:serviceaccount:cfh:default" cannot create resource "secrets" in API group "" in the namespace "cfh"
Интересно, что это, похоже, не дает сбоев на этапе удаления. Мне интересно, может ли проблема быть связана с kubectl create secret docker-registry
другими разрешениями ролей, помимо стандартных секретных глаголов, поскольку это тип docker-registry
, но я не уверен.
Вот как выглядит мой CronJob YAML:
apiVersion: batch/v1
kind: CronJob
metadata:
name: ecr-registry-helper
creationTimestamp: '2023-09-11T00:06:03Z'
generation: 25
namespace: cfh
fields:
- ecr-registry-helper
- 0 */10 * * *
- 'False'
- 0
- 11m
- 3d20h
- ecr-registry-helper
- omarxs/awskctl:v1.0
- <none>
spec:
concurrencyPolicy: Allow
failedJobsHistoryLimit: 1
jobTemplate:
metadata:
creationTimestamp: null
namespace: cfh
spec:
template:
metadata:
creationTimestamp: null
spec:
containers:
- command:
- /bin/bash
- '-c'
- >-
ECR_TOKEN=`aws ecr get-login-password --region ${AWS_REGION}`
NAMESPACE_NAME=cfh
kubectl delete secret --ignore-not-found regcred -n
$NAMESPACE_NAME
echo "deleted secret"
kubectl create secret docker-registry regcred
--docker-server=https://${AWS_ACCOUNT}.dkr.ecr.${AWS_REGION}.amazonaws.com
--docker-username=AWS --docker-password="${ECR_TOKEN}" -n $NAMESPACE_NAME
echo "Secret was successfully updated at $(date)"
envFrom:
- secretRef:
name: ecr-registry-helper-secrets
- configMapRef:
name: ecr-registry-helper-cm
image: omarxs/awskctl:v1.0
imagePullPolicy: IfNotPresent
name: ecr-registry-helper
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
_init: false
__active: true
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Never
schedulerName: default-scheduler
serviceAccount: default
serviceAccountName: default
terminationGracePeriodSeconds: 30
schedule: 0 */10 * * *
successfulJobsHistoryLimit: 2
suspend: false
__clone: true
А также мой ServiceAccount
apiVersion: v1
kind: ServiceAccount
metadata:
name: default
creationTimestamp: '2023-09-10T22:14:31Z'
namespace: cfh
fields:
- default
- 0
- 3d21h
automountServiceAccountToken: false
__clone: true
Роль
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
creationTimestamp: '2023-09-11T00:06:03Z'
name: role-full-access-to-secrets
namespace: cfh
rules:
- apiGroups:
- ''
resourceNames:
- regcred
resources:
- secrets
verbs:
- create
- delete
- get
- list
- patch
- update
- watch
И Роль Привязки
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
creationTimestamp: '2023-09-11T00:06:03Z'
name: default-role-binding
namespace: cfh
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: role-full-access-to-secrets
subjects:
- kind: ServiceAccount
name: default
namespace: cfh
решение1
Спасибо @veera-nagireddy за помощь в этом вопросе (см. его комментарий к оригинальному посту для получения дополнительной информации)
Проблема была в том, что CronJob
сам по себе не имел разрешений на создание/обновление секретов в cfh
пространстве имен, несмотря на то, что он взял на себя роль ServiceAccount
. Чтобы исправить это, мне пришлось также создать ClusterRole
& ClusterRoleBinding
, который давал разрешения на ServiceAccount
изменение секретов в cfh
пространстве имен.
КластерРоль:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
creationTimestamp: '2023-09-16T02:39:55Z'
name: ecr-registry-helper-cluster-role
rules:
- apiGroups:
- ''
resources:
- secrets
verbs:
- create
- delete
- update
ClusterRoleBinding:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
creationTimestamp: '2023-09-16T02:42:42Z'
name: ecr-registry-helper-cluster-role-binding
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: ecr-registry-helper-cluster-role
subjects:
- kind: ServiceAccount
name: default
namespace: cfh
После создания этих двух ресурсов мне удалось успешно создать секрет.